Einfacher Taschenrechner
-
Tach!
In Zeile 31, 34, 37, 40 und 43 sind die Tastatur-Codes oder wie auch immer (siehe Kommentare), die ich mit einem kleinen Tool von mir ausgelesen habe.
Doch irgendwie will das Programm die Eingaben von der Tastatur nicht erkennen.Woran liegt das?
#include<conio.h> float kontrolle (float x) { if(x == 0) { printf("Division durch 0 ungueltig\n"); }; return (x); } int main (void) { float wert, puffer = 0; int x; printf("Einfacher Taschenrechner\n------------------------\n"); do{ x = getch(); wert = getch(); switch(x) { case 43: // Plus puffer += wert; break; case 45: // Minus puffer -= wert; break; case 42: // Mal puffer *= wert; break; case 47: // Geteilt puffer /= kontrolle(wert); break; case 13: // Eingabe printf("%f\n", puffer); // Ausgabe break; default: printf("Eingabe ungueltig\n"); } } while(getch() != 27); // Escape return (0); }
VDiV
squidwardEDIT: Er springt immer zum default-case wie auch immer das ding heisen mag...
EDIT2:@Volkard Danke! Böser Fehler!
EDIT3: Korrektur!
-
if(x == 0); { printf("Division durch 0 ungueltig\n"); }
ist
if(x == 0)//wenn x gleich 0 ;//dann tunix {//to das auf jeden fall danach printf("Division durch 0 ungueltig\n"); }
-
außerdem
case 43
und nicht
case '43'netter ist natüröich
case '+'
-
Ok nebenproblemchen gelöst (siehe edit).
Das Programm springt immer noch zum default-case oder wie auch immer.
-
volkard schrieb:
außerdem
case 43
und nicht
case '43'Wegen den char-strings(') oder wie die dinger auch heißen mögen?
EDIT: Geht aber trotzdem nicht!
-
eigentlich nur, weil '+'==43. in '' steht nur ein char.
'43' hingegen könnte was anderes sein, vielleicht eine darstellung für unicode-zeichen, in diesem fall vielleicht '4'*256+'3'.
-
Lautet deine devise also '+' statt 43 und was soll ich dann für Enter ersetzen?
Geht auch nicht (siehe code):
#include<conio.h> float kontrolle (float x) { if(x == 0) { printf("Division durch 0 ungueltig\n"); } return (x); } int main (void) { float wert, puffer = 0; int x; printf("Einfacher Taschenrechner\n------------------------\n"); do{ x = getch(); wert = getch(); switch(x) { case '+': // Plus puffer += wert; break; case '-': // Minus puffer -= wert; break; case '*': // Mal puffer *= wert; break; case '/': // Geteilt puffer /= kontrolle(wert); break; case 137: // Eingabe printf("%f\n", puffer); // Ausgabe break; default: printf("Eingabe ungueltig\n"); } } while(getch() != 27); // Escape return (0); }
EDIT: An Zeile 24-25 kann es doch nicht liegen, oder?
EDIT2: Ich möchte nicht die Funktion scanf() dafür einsetzen!
-
Was ist denn 137 bei
case 137:
-
#include<conio.h> float kontrolle (float x) { if(x == 0) { printf("Division durch 0 ungueltig\n"); } return x;//repariert } int main (void) { float wert, puffer = 0; int x; printf("Einfacher Taschenrechner\n------------------------\n"); puffer=getch();//neu do{ x = getch(); wert = getch(); switch(x) { case '+': // Plus puffer += wert; break; case '-': // Minus puffer -= wert; break; case '*': // Mal puffer *= wert; break; case '/': // Geteilt puffer /= kontrolle(wert); break; case 13: // Eingabe printf("%f\n", puffer); // Ausgabe break; default: printf("Eingabe ungueltig\n"); } printf("ausgabe %f\n",buffer);//neu } while(getch() != 27); // Escape return 0;//repariert }
-
@volki
Hast du denn getestet?
Bei mir geht das nicht! Es ist wieder das gleiche problem...
Hmmm... muss ich denn scanf() einsetzen in meinen Schönen reinen C-Code?
PS: Hey du hast ja die sig wieder
EDIT:
Was ist denn 137 bei
Tippfehler, 13 (Eingabe)!
-
squidward schrieb:
Hast du denn getestet?
nein.
-
Liegt es eventuell an meiner Tastatur bzw. meinem Tastatur-Code Ausleser oder wie man dass auch nennen mag?
scanf() tut mir das nicht an!!!
-
hau ganz viele debug-ausgaben rein, damit du immer genau weißt, was in welchen variablen steht. dann wirste den fehler schon finden.
was ich zum beispiel nicht verstehe, ist dein while(getch()!=27) statt oben nach dem x=getch(); ein if(x==27) break; und als schleife nur for(;;).
-
Sehr, sehr umständlich ohne einen Stack
So sollte es aber funktionieren:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <conio.h> int main(void) { float operanden[2] = {0, 0}; // EDIT: float anstatt int^^ int operand = 0; int operation; int c; float ergebnis; printf("Einfacher Taschenrechner\n------------------------\n"); while((c = getch()) != 27) { if(isdigit(c)) { operanden[operand] = operanden[operand] * 10 + (c - '0'); printf("%c", c); } else if(c == '+' || c == '-' || c == '*' || c == '/') { if(operand == 0) { operation = c; operand++; printf("%c", c); } } else if(c == 13 && operand == 1) { switch(operation) { case '+': ergebnis = operanden[0] + operanden[1]; break; case '-': ergebnis = operanden[0] - operanden[1]; break; case '*': ergebnis = operanden[0] * operanden[1]; break; case '/': ergebnis = operanden[0] / operanden[1]; // EDIT: null-division prüfen break; } printf(" = %f\n", ergebnis); // Ausgabe*/ operanden[0] = operanden[1] = operand = operation = 0; } } return 0; }
EDIT: Es gibt aber noch andere Möglichkeiten. z.B. wie beim Parsen von nem Lex Analyzer, verschiedene Funktionien zu bauen und die dann anzuspringen, je nachdem was gerade dran ist. Also Bottom-Up finite state machine müsste das Zauberwort sein, wenn ich mich nicht irre.
-
-