Programmierung Taschenrechner in C
-
Guten Abend,
da ich C-Anfänger bin, hätte ich eine Frage.
Ich habe versucht, mit einer Funktion einen Taschenrechner in C zu programmieren.
Das Programm läuft auch soweit ohne Fehlermeldungen ab, nur wird als Ergebnis "nan" ausgegeben.
Hier der Quellcode:
**************************************************************************************************************************************************************
#include <stdio.h>
/*berechnung.c*/
float berechnung(char optr, float opr1, float opr2)
{
float erg;switch (optr)
{
case '+': erg = opr1 + opr2;
break;
case '-': erg = opr1 - opr2;
break;
case '*': erg = opr1 * opr2;
break;
case '/': erg = opr1 / opr2;
break;return erg;
}
}int main(void)
{
char optr;
float opr1,opr2,result;printf("Bitte Eingabe Operator(+, -, *, /, q): ");
scanf("%c", &optr);if (optr!='q')
{
printf("Bitte Eingabe Operand1: ");
scanf("%f", &opr1);printf("Bitte Eingabe Operand2: ");
scanf("%f", &opr2);result = berechnung(optr, opr1, opr2);
printf("Ergebnis: %f\n", result);
}
elsereturn 0;
}**************************************************************************************************************************************************************
Ich kann den Fehler einfach nicht finden, warum als Ergebnis nan ausgegeben wird.
Über Hilfe wäre ich sehr dankbar.
Vielen Dank im Voraus.
-
Gib doch mal in der "berechnung" Funktion die Argumente aus, also optr, opr1 und opr2. Vielleicht ließt scanf was falsch ein. Also Schritt für Schritt debuggen.
}
else in deiner main macht keinen Sinn.Und: Vernünftig einrücken. Dann hättest du das, was Amtrak bemerkt selber gesehen. Ausserdem [ cpp ][ /cpp ] Tags beim Code-Posten benutzen.
-
Du hast einen Fehler in deiner Funktion. Das Return aus der Funktion steht in der Klammer der switch Anweisung. Mit einem break verlässt du die Klammer, somit wird Return nicht ausgeführt und kein Wert aus der Funktion zurückgegeben. Schreib es vor die schließende Klammer der Funktion.
-
Das
}
elsereturn 0;
}am Ende muss sein. Wie kann ich das programm sonst so einrichten, dass es bei einer Operator-Eingabe von q beendet wird?
-
Das Programm läuft nun. Die Schleife wird korrekt durchlaufen. Bei Eingabe von 'q' beendet sich das Programm wie gewollt.
**************************************************************************************************************************************************************
Bitte Eingabe Operator(+, -, *, /, q): +
Bitte Eingabe Operand1: 3.52
Bitte Eingabe Operand2: 4.04
Ergebnis: 7.56**************************************************************************************************************************************************************
Jedoch wird nun beim Wiederholen der Schleife das scanf für die Eingabe des Operators einfach "übergangen". Das Programm gibt folgendes aus:
**************************************************************************************************************************************************************
Bitte Eingabe Operator(+, -, *, /, q): Bitte Eingabe Operand1:
**************************************************************************************************************************************************************
Wo liegt der Fehler, dass bei diesem zweiten Durchlauf der Schleife, das scanf nicht mehr berücksichtigt wird, und kein Operator mehr eingegeben werden kann?
Hier der Quelltext:**************************************************************************************************************************************************************
#include <stdio.h> /*berechnung.c*/ float berechnung(char optr, float opr1, float opr2) { float erg; switch (optr) { case '+': erg = opr1 + opr2; break; case '-': erg = opr1 - opr2; break; case '*': erg = opr1 * opr2; break; case '/': erg = opr1 / opr2; break; } return erg; } int main(void) { char optr; float opr1,opr2,result; while(optr!='q') { printf("Bitte Eingabe Operator(+, -, *, /, q): "); scanf("%c", &optr); if (optr!='q') { printf("Bitte Eingabe Operand1: "); scanf("%f", &opr1); printf("Bitte Eingabe Operand2: "); scanf("%f", &opr2); result = berechnung(optr, opr1, opr2); printf("Ergebnis: %.2f\n", result); } } return 0; }
-
#include <stdio.h> float berechnung(char optr, float opr1, float opr2) { float erg = 0; switch (optr) { case '+': erg = opr1 + opr2; break; case '-': erg = opr1 - opr2; break; case '*': erg = opr1 * opr2; break; case '/': erg = opr1 / opr2; break; } return erg; } int main(void) { char optr; float opr1,opr2,result; do { printf("Bitte Eingabe Operator(+, -, *, /, q): "); flushall(); scanf("%c", &optr); if (optr!='q') { printf("Bitte Eingabe Operand1: "); flushall(); scanf("%f", &opr1); printf("Bitte Eingabe Operand2: "); flushall(); scanf("%f", &opr2); result = berechnung(optr, opr1, opr2); printf("Ergebnis: %.2f\n", result); } } while(optr != 'q'); return 0; }
-
so wie der quelltext jetzt verbessert dasteht (mit flushall) funkitoniert er nicht. Als fehlermeldung wird "...undefined flushall..." ausgegeben.
bitte. ich brauche eure hilfe
-
flushall() solltest du erst mal bauen du honk!
-
ja kannst du mir nicht mal zeigen wie das geht?
und nur weil ich hier neu bin und nicht soviel kann bin ich noch lange kein honk
-
"fflush(stdin)" ist warscheinlich das was du suchst... es löscht den tastaurpuffer.
für fortgeschrittene:void delkeybuf(void) { asm { cli mov ax,0x40 mov es,ax mov bx,0x1c mov ax,word ptr es:[bx] mov bx,0x1a mov word ptr es:[bx],ax sti } }
wobei das nicht meiner eigenen feder entstammt, da ich selbst noch ein ziemlicher newb bin ;). sieht mir aber nach assemlber aus
-
meines wissens geht fflush() nur in windows und nicht in linux bzw. fflush(stdin) stdout geht ohne probleme -> keine definition in linux
in linux machts auch das getchar();