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
    squidward

    EDIT: 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.



  • @NDEBUG

    Vielen lieben Dank! 👍

    PS: Was ist ein Stack?




Anmelden zum Antworten