Problem mit Übungsaufgabe : Taschenrechner
-
Hab eine Problem:
Das Programm soll ein einfacher Taschenrechner sein, der solange läuft bis man q drückt im "Menü":#include <stdio.h> float calculator(char optr, float opr1, float opr2); int main(void) { char operator; float operand1, operand2,ergebnis; printf("\033[2J"); /*Bidlschirm löschen*/ printf("\033[0;0f");/*Bildschirm löschen*/ while(operator!='q') { printf("Eingabe: Operator <return> Operand1 <return> Operand2 <return>"); printf("\nBitte Eingabe Operator (+, -, *, /, q):"); operator=getchar(); if(operator!='q') { printf("Bitte Eingabe Operand1: "); scanf("%f",&operand1); printf("Bitte Eingabe Operand2: "); scanf("%f",&operand2); ergebnis=calculator(operator,operand1,operand2); printf("Ergebnis: %2.2f %c %2.2f = %2.2f\n",operand1, operator, operand2, ergebnis); operator='s'; } } return 0; } float calculator(char optr, float opr1, float opr2) { switch(optr) { case '+': return opr1+opr2; break; case '-': return opr1-opr2; break; case '*': return opr1*opr1; break; case '/': return opr1/opr2; break; case 'q': break; } }
Der erste durchlauf geht ohne probleme:
operator +
op1:5
op2:3
=> 5 +3 = 8
Doch dann startet die schleife nochmal und die abfrage des operators wird übersprungen und es folgt GLEICH die eingabe des ersten operanden.....?Hab schon versucht den operator nach aufruf der calculator funktion mit operator=NULL; auf urzustand zu setzen aber hilt leider nix.
An der Eingabe kann es auch nicht liegen, hab atm die Funktion getchar(); drin, mit scanf("%c",&operator) geht es auch nicht.
Steh wahrscheinlich nur auf dem Schlauch, meine Vermutung am Fehler liegt an der Funktion mit den Switch Anweisungen.... Finds aber nicht
Soll C Code sein, ist Vorgabe.
-
Setz mal ein fflush(stdin) vor das getchar(). Das sollte klappen, glaube ich.
-
-
Swordfish schrieb:
Den Standardeingabestream leert man nicht mit
fflush( )
!!!111elfsiehe hier.
greetz, Swordfish
Oh, ok. Ich habe mich nur an den C-/C++-Unterricht damals in der Berufsschule erinnert. Ich meine, man hat uns das so präsentiert...
-
Swordfish schrieb:
Den Standardeingabestream leert man nicht mit
fflush( )
!!!111elfsiehe hier.
greetz, Swordfish
Auch wenn deine Lösung sicherlich besser und standardkonformer ist: Kann es sein, dass zumindest beim VS-Compiler fflush(stdin) erlaubt ist? Bei mir funktioniert es scheinbar auch.
MSDN schrieb:
// You must flush the input buffer before using gets.
// fflush on input stream is an extension to the C standard
fflush( stdin );
-
Ja, das ist eine Erweiterung des Microsoft-Compilers. Im WinAPI Forum wäre das uU angebracht.
greetz, Swordfish
-
Leider geht die lösung von swordfish nicht ganz.
Problem:Beim ersten Aufruf des Programms muss man nun 2 x Enter drücken nachdem man den operator gewählt hat, dazu kommt, dass der eingegebene operator nicht in der funktion ankommt. D.h. wenn ich * , 3 , 3 eingebe ist das Ergebnis:
Ergebnis: 3.00
3.00 = -1.90irgendwie wird der operator beim ersten mal verschluckt.
-
Das doofe an dieser Funktion ist, das sie in eine Endlosschleife übergeht, wenn noch nichts eingegeben wurde.
Ich benutze lieber vor jeder neuen Eingabe die unten stehende Funktion, um den Eingabepuffer zu leeren:
void clearbuf() { setvbuf(stdin,NULL,_IONBF,0); setvbuf(stdin,NULL,_IOFBF,BUFSIZ); }