Einfacher Taschenrechner
-
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.
-
-