Hallo shizo23,
da du dich anscheinend (wider aller Erwartung) doch mit der Aufgabe beschäftigt hast hab ich mir auch mal was einfallen lassen. Man kann zwar noch viel verbessern, aber es läuft zumindest. Ich hab das Problem mit einer sog. Statemachine gelöst. Ich schau jedes eingegebene Zeichen einzelnd an und bestimme, ob es zum Operanden 1(2) , zum Vorzeichen oder zur Operation gehört. Dann bau ich mir die beiden Operanden aus den eingegebenen Zeichen zusammen und transformier die mit atof in ein double. Der große Vorteil dieser Methode ist, daß man die Rechnung in einer Zeile eingeben kann...
Code:
#include<stdio.h>
#include<stdlib.h>
typedef int STATE;
typedef enum {plus,minus,multiply,division} OPERATION;
typedef enum { false=0, true=1 } bool;
#define false 0
#define true 1
typedef struct{
OPERATION operation;
char op1_buffer[20];
char op2_buffer[20];
int op_pos;
STATE state;
} CONTEXT;
bool evaluate(CONTEXT*,char);
int main(void)
{
double op1;
double op2;
CONTEXT context;
context.op_pos=0;
context.state=1;
char input;
fflush(stdin);
do{
input=(char)fgetc(stdin);
}while(!evaluate(&context,input));
/* HIER MUSS NOCH WAS GEÄNDERT WERDEN... DAZU HATTE ICH ABER KEINE GUTE IDEE*/
op1=atof(context.op1_buffer);
op2=atof(context.op2_buffer);
printf("\nOperand1: %lf\nOperand2: %lf\n",op1,op2);
if(context.operation==plus){printf("Op1 + Op2 = %lf\n",op1+op2);}
if(context.operation==minus){printf("Op1 - Op2 = %lf\n",op1-op2);}
if(context.operation==multiply){printf("Op1 * Op2 = %lf\n",op1*op2);}
if(context.operation==division){printf("Op1 / Op2 = %lf\n",op1/op2);}
return 0;
}
bool evaluate(CONTEXT *handle,char input)
{
bool ready=false;
if(handle->state==1&&!ready)
{
if(input=='-')
{
handle->op1_buffer[handle->op_pos]='-';
handle->op_pos++;
handle->state=2;
ready=true;
}
if((input>='0'&&input<='9')||input=='.')
{
handle->op1_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=3;
ready=true;
}
}
if(handle->state==2&&!ready)
{
if((input>='0'&&input<='9')||input=='.')
{
handle->op1_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=4;
ready=true;
}
}
if(handle->state==3&&!ready)
{
if((input>='0'&&input<='9')||input=='.')
{
handle->op1_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=3;
ready=true;
}
if(input=='+')
{
handle->operation=plus;
handle->state=5;
ready=true;
}
if(input=='-')
{
handle->operation=minus;
handle->state=5;
ready=true;
}
if(input=='*')
{
handle->operation=multiply;
handle->state=5;
ready=true;
}
if(input=='/')
{
handle->operation=division;
handle->state=5;
ready=true;
}
}
if(handle->state==4&&!ready)
{
if((input>='0'&&input<='9')||input=='.')
{
handle->op1_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=4;
ready=true;
}
if(input=='+')
{
handle->operation=plus;
handle->state=5;
ready=true;
}
if(input=='-')
{
handle->operation=minus;
handle->state=5;
ready=true;
}
if(input=='*')
{
handle->operation=multiply;
handle->state=5;
ready=true;
}
if(input=='/')
{
handle->operation=division;
handle->state=5;
ready=true;
}
}
if(handle->state==5&&!ready)
{
if(input!=' '){
handle->op1_buffer[handle->op_pos]=0;
handle->op_pos=0;
}
if(input=='-')
{
handle->op2_buffer[handle->op_pos]='-';
handle->op_pos++;
handle->state=7;
ready=true;
}
if((input>='0'&&input<='9')||input=='.')
{
handle->op2_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=6;
ready=true;
}
}
if(handle->state==6&&!ready)
{
if((input>='0'&&input<='9')||input=='.')
{
handle->op2_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=6;
ready=true;
}
if(input=='\n')
{
handle->op2_buffer[handle->op_pos]=0;
handle->state=1;
ready=true;
return true;
}
}
if(handle->state==7&&!ready)
{
if((input>='0'&&input<='9')||input=='.')
{
handle->op2_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=6;
ready=true;
}
}
return false;
}
Gruß,
SIGINT
Lesezeichen