PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Programm für die 4Grundrechenarten



for_maniac
08-12-2005, 20:31
Hi

ich habe Probleme bei dem Programm hier es will nicht so wie es soll, ich glaub der Fehler liegt in den ersten beiden for schleifen. Der Quellcode und die Ausgabe sollten das Problem glaub ich erklären.
P.S die endlosschleife ist gewollt

Quellcode:


#include <stdio.h>
#include <math.h>
#include <string.h>
int main(){
while(1){
char eingabe[20];
char z1[20], z2[20];
int zahl1=0,zahl2=0,i,op,erg=0,pot=0;
printf("Geben sie die Rechnug ein: ");
scanf("%s",&eingabe);

for(i=0;eingabe[i]>= 0x30 && eingabe[i]<= 0x39;i++){z1[i]=eingabe[i];printf("%i : %i \n",strlen(z1),z1[i]);}
op=eingabe[i];
for(i=i+1;eingabe[i]>= 0x30 && eingabe[i]<= 0x39;i++){z2[i]=eingabe[i];}

for(i=0; strlen(z1)>=i;i++){zahl1=zahl1+(z1[i]-0x30)*pow(10,i);}
for(i=0; strlen(z2)>=i;i++){zahl2=zahl2+(z2[i]-0x30)*pow(10,i);}

if(op==0x2B){erg= zahl1 +zahl2;}
if(op==0x2D){erg= zahl1 -zahl2;}
if(op==0x2A){erg= zahl1 *zahl2;}
if(op==0x2F){erg= zahl1 /zahl2;}

printf("%i %c %i = %i\n\n",zahl1,op,zahl2,erg);
}
return 0;
}



Ausgabe:


Geben sie die Rechnug ein: 22+2
7 : 50
7 : 50
-499080375 + -48 = -499080423

Geben sie die Rechnug ein:

MFG for_maniac

quinte17
09-12-2005, 15:40
ich habe mir deinen code nicht zu 100% angeschaut, aber hier mal eine anregung:
verwende doch sscanf und bessere funktionen, dann musst du nur noch die einzelnen char-arrays der zahlen separieren und kannst dann bequem in int umwandeln und damit rechnen...

ein paar kommentare in deinem code wären nicht schlecht :D dient der lesbarkeit, und hilft dir in 6 monaten dich daran zu erinnern, wie du des gemacht hast...

greetz

Joghurt
09-12-2005, 16:10
Ein weiterer Tipp: anstatt die ASCII-Werte direkt anzugeben, lass es C machen. Anstatt " ch >= 0x30 " besser " ch >= '0' "

for_maniac
09-12-2005, 20:50
Erst mal danke für die tips ich würde das programm gerne erst mal auf diese art zum laufen bringen und mich erst dann mit besseren lösungen beschäftigen. vorallem hab ich bisher noch nicht wirklich viel ahnung von c.

ich habe den quellcode nun etwas verbessert es tritt aber ein neuer merkwürdiger fehler auf: 2 stellige funktionieren ohne probleme nur bei dreistelligen klappt es nicht siehe Ausgabe.

Ausgabe:


Geben sie die Rechnug ein: 2+2
1 : 0
2 + 2 = 4

Geben sie die Rechnug ein: 123+1
3 : 0
122 + 1 = 123

Geben sie die Rechnug ein:

Quellcode, verbessert:



#include <stdio.h>
#include <math.h>
#include <string.h>
int main(){
while(1){
char eingabe[20];
char z1[20], z2[20];
int zahl1=0,zahl2=0,i=0,op,erg=0,a=0;
printf("Geben sie die Rechnug ein: ");
scanf("%s",&eingabe);

for(i=0;eingabe[i]>= 0x30 && eingabe[i]<= 0x39;i++){z1[i]=eingabe[i];}
z1[i]=0x0;
printf("%i : %i \n",strlen(z1),z1[i]);
op=eingabe[i];

for(i=i+1;eingabe[i]>= 0x30 && eingabe[i]<= 0x39;i++){z2[a]=eingabe[i];a++;}
a++;
z2[a]=0x0;
a=0;
for(i=strlen(z1)-1; i>=0;i--){zahl1=zahl1+(z1[i]-0x30)*pow(10,a);a++;}
a=0;
for(i=strlen(z2)-1; i>=0;i--){zahl2=zahl2+(z2[i]-0x30)*pow(10,a);a++;}

if(op==0x2B){erg= zahl1 +zahl2;}
if(op==0x2D){erg= zahl1 -zahl2;}
if(op==0x2A){erg= zahl1 *zahl2;}
if(op==0x2F){erg= zahl1 /zahl2;}

printf("%i %c %i = %i\n\n",zahl1,op,zahl2,erg);
}
return 0;
}

panzi
10-12-2005, 18:27
völlig ungetestet, aber nur damit'st eine idee bekommst hier mal ein wenig code schnell runtergetippt.
calc() sollte ine funktion sein die eine rechnung (bis es zu einen invaliden zeichen kommt, also auch EOF) von fp einliest und ausrechnet.
die rechnung darf folgende operationen haben: +, -, *, /, ()
weiters kann sie vorzeichen (+, -) und eben double werte haben.



#include <stdio.h>
#include <ctype.h>

double calc(FILE * fp) {
double res = addit(fp);

// event. hier überprüfen ob noch garbadge hinter der rechnung vorhanden ist
return res;
}

void skipws(FILE * fp) {
int c = EOF;

while(isspace(c = fgetc(fp)));

ungetc(c,fp);
}

double addit(FILE * fp) {
int c = EOF;
double res = multi(fp);

skipws(fp);

while((c = fgetc(fp)) == '+' || c == '-') {
skipws(fp);

if( c == '+' )
res += multi(fp);
else
res -= multi(fp);

skipws(fp);
}
ungetc(c,fp);
return res;
}

double multi(FILE * fp) {
int c = EOF;
double res = val(fp);

skipws(fp);

while((c = fgetc(fp)) == '*' || c == '/') {
skipws(fp);

if( c == '*' )
res *= val(fp);
else
res /= val(fp);

skipws(fp);
}
ungetc(c,fp);
return res;
}

double val(FILE * fp) {
int c = EOF;
double res = 0;

skipws(fp);
c = fgetc(fp);

switch(c) {
case '-': res = - val(fp); break;
case '+': res = val(fp); break;
case '(':
res = addit(fp);
skipws(fp);
c = fgetc(fp);
if( c != ')' ) {
// FEHLER!
}
break;
default:
fscanf(fp, "%lf",&res);
break;
}
return res;
}

Das ist ein rekursiver parser. Hier (und nur hier) würde es sinn machen fehler mit setjmp() und longjmp() zu behandeln. (diese funktionen sind sehr heikel! nur verwenden wenn man sich damit auskennt. dann kann man damit so was ähnl. wie try, catch und throw implementieren.)