Einfacher Taschenrechner



  • 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