Problem mit Rechner



  • Wenn du mit Symbolen + - * / zufrieden bist, kannst du sie als char-Literale verwenden in den Vergleichen (z.B. if(calctype=='+') ). Wenn du wirklich die Wörter "plus", "minus" etc erwartest, benötigst du Strings (char-Arrays) und strcmp():

    char calctype[10];
    scanf("9s",calctype);
    if(strcmp(calctype,"plus")==0)
    {
      ...
    }
    

    PS: Die Eingabe der Operanden ist in allen vier Fällen identisch, die kannst du auch vor die Fall-Unterscheidung verlagern. Und außerdem hast du viel zu viele Variablen, von denen du nur ein kleines Teil pro Programmausführung nutzt.



  • Vielen Dank, mit "+", "-"... gehts 🙂

    Das mit dem strcmp muss ich mich erst mal einlesen 🙂



  • Mystery schrieb:

    Vielen Dank, mit "+", "-"... gehts 🙂

    Das mit dem strcmp muss ich mich erst mal einlesen 🙂

    ⚠ In C gibt es einen großen Unterschied zwischen "+" und '+'.

    Wenn du da sowas wie if(calctype=='+') stehen hast, musst du unbedingt die ' nehmen.



  • Und bitte definiere für die eingegebenen Zahlen nur zwei Variablen, du kannst pro Rechengang sowieso nur 2 verwenden, da bringen dir die 6 anderen genau nüsse.



  • So, ich melde mich mal wieder 🙂

    Hab den Code nun etwas verändert und wollte das ganze mit switch erledigen.
    Da switch nur integer kann, hab ich die in zahlen umgewandelt.
    Doch weder wenn ich "plus" eingebe, noch "1" etc. reagiert das Programm und bricht ab.

    Hier der Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        char calctype;
        char plus[4];
        char minus[5];
        char multiply[8];
        char divide[6];
        int num1;
        int num2;
        int num3;
        int num4;
        int num5;
        int num6;
        int num7;
        int num8;
        int sum;
        int result1;
        int result2;
        int result3;
    
        printf("Welcome to the little calculator!\n");
        printf("Type in '+' for plus, '-' for minus, '*' for multiply and '/ for divide\n");
        printf("Enter the type you want to calculate: ");
    
        if (calctype == plus) {
         plus == 1;
        }
    
        if (calctype == minus) {
         minus == 2;
        }
    
        if (calctype == multiply) {
         multiply == 3;
        }
    
        if (calctype == divide) {
         divide == 4;
        }
        scanf("%c", &calctype);
    
        switch(calctype) {
    
        case 1:
        printf("Enter the fist number: ");
        scanf("%d", &num1);
        printf("Enter the second number: ");
        scanf("%d", &num2);
    
        sum = num1 + num2;
    
        printf("The sum is: %d", sum);
        break;
    
       case 2:
    
        printf("Enter the fist number: ");
        scanf("%d", &num3);
        printf("Enter the second number: ");
        scanf("%d", &num4);
    
        result1 = num3 - num4;
    
        printf("The result is %d", result1);
    
        break;
    
       case 3:
    
        printf("Enter the fist number: ");
        scanf("%d", &num5);
        printf("Enter the second number: ");
        scanf("%d", &num6);
    
        result2 = num5 * num6;
    
        printf("The result is %d", result2);
    
        break;
    
        case 4:
    
        printf("Enter the fist number: ");
        scanf("%d", &num7);
        printf("Enter the second number: ");
        scanf("%d", &num8);
    
        result3 = num7 / num8;
    
        printf("The result is %d", result3);
    
        break;
        }
        return 0;
    }
    

    Was mache ich falsch? Hab mal über ne while schleife nachgedacht aber an welcher stelle und mit welchem Inhalt?

    Danke schonmal im vorraus! 🙂

    Greets



  • deine Vergleiche if(calctype==plus) sind immer noch genauso unsinnig wie am Anfang, besonders wenn du diese Vergleich vor der Eingabe hast.



  • Aber danach würde ja keinen Sinn machen oder?
    Denn dann kommt ja schon die switch anweisung die eben den wert benötigt.



  • Selbst danach macht es keinen Sinn, weil die Variablen, mit denen du vergleichst, nicht initialisiert sind. (und außerdem schreibst du dann in die Variablen, die du nicht überprüfst)

    Einfachste Lösung: Du verwendest die Rechensymbole als Eingabe und kannst dann im switch() mit den Zeichenliteralen vergleichen.



  • Der Computer geht das Programm der Reihe nach durch.
    Zeile für Zeile.
    Und er macht nur die gerade aktuelle Anweisung.

    char calctype;  // das ist ein char  
        char plus[4];   // das ist ein Array
                        // Falls du vorhast da das Wort "plus" drin zu speichern, ist das Array zu klein
        ....
        if (calctype == plus) {  // hier Vergleichst du ein integer mit einem Array.  :warning: Das geht nicht. 
                                 // Zudem sind beide Variablen nicht initialisiert.
         plus == 1; // hier weist du einem Array ein Integer zu.  :warning: Das geht nicht.  
        }
        ....
        scanf("%c", &calctype);  // Erst hier liest du den Wert ein. 
                                 // Der Vergleich von oben (Zeile 5) wird jetzt nicht mehr ausgeführt.
    

    Irgendwie scheinst du ja zu wissen was ein Integer ist. Ein char ist auch ein Integer (für einen kleineren Wertebereich)
    Arrays sind aber was anderes.

    da ein char ein Integer ist, ist '+' auch ein Integer und somit kannst du im switch auch case '+': schreiben.

    Geh noch mal auf Start und fang dein Buch/Tutorial noch mal von Vorne an.
    Und probiere die Beispiel auch aus.



  • also hier mal ein funktionierender code,
    der das machen sollte, was du gerne hättest 🙂

    kommentiert, damit du es hoffentlich gut nachvollziehen kannst^^

    #include <stdio.h>
    
    int main(void)
    {
        char op; /* Hier speichern wir die Rechenart (op = Operation) */
        int a, b; /* Hier kommen die Eingaben rein. */
        int result; /* Hier das Ergebnis */
    
        printf("Rechenoperation [+,-,*,/]: ");
        scanf("%c", &op); /* genau EIN Zeichen einlesen */
    
        /* Eingabe überprüfen */
        if (op != '+' && op != '-' &&
            op != '/' && op != '*')
        {
            printf("Fehler: Ungültige Rechenoperation!\n");
            return -1;
        }
    
        /* Zahlen einlesen */
        printf("A: "); scanf("%d", &a);
        printf("B: "); scanf("%d", &b);
        /* Die meisten Leute, die ich kenne, bevorzugen %d...
           %i sollte aber auch keine Probleme bereiten */
    
        /* Rechnen */
        switch (op)
        {
        case '+': result = a + b; break;
        case '-': result = a - b; break;
        case '*': result = a * b; break;
        case '/': result = a / b;
        }
        /* jeweils die break's nicht vergessen, da sonst bei '+' auch alle anderen
           Operation ausgeführt werden...
           Also jeweils die folgenden case's, weshalb der letzte case auch kein
           break benötigt :-)
           default-Zweig brauchen wir hier keinen, da die Überprüfung oben diesen
           Fall bereits ausschließt */
    
        /* Ergebnis ausgeben */
        printf("%d %c %d = %d\n", a, op, b, result);
        /* die Ausgabe hier ist etwas komplexer^^
           Es wird einfach z.B. ausgegeben 2 + 2 = 4, oder 7 * 6 = 42 */
    
        return 0;
    }
    

    Ich hoffe das Beispiel ist verständlich und hilft dir weiter 🙂



  • Wo wir schon dabei sind, man kann mit scanf auch mehrere Variablen auf einmal einlesen:

    #include <stdio.h>
    
    int main(void) {
      double x, y;
      char op;
    
      /* Eingabe der Form "3 + 4", "2.8 / 7.2" etc. */
      if(3 == scanf("%lf %[+-*/] %lf", &x, &op, &y)) {
        switch(op) {
        case '+': printf("%g\n", x + y); break;
        case '-': printf("%g\n", x - y); break;
        case '*': printf("%g\n", x * y); break;
        case '/': printf("%g\n", x / y); break;
        }
      } else {
        fputs("Fehler beim Einlesen\n", stderr);
        return -1;
      }
    
      return 0;
    }
    


  • Vielen vielen dank DrakoXP! 🙂
    Jetzt weiss ich wie das gemeint war! 🙂

    @ seldon: Die Zeile "if(3 == scanf("%lf %[+-*/] %lf", &x, &op, &y)" versteh ich jetzt nicht so ganz... Ist eigentlich aber nur eine andere schreibweise oder? Aber ich denke das kommt mit der Zeit 🙂



  • Mystery schrieb:

    @ seldon: Die Zeile "if(3 == scanf("%lf %[+-*/] %lf", &x, &op, &y)" versteh ich jetzt nicht so ganz... Ist eigentlich aber nur eine andere schreibweise oder? Aber ich denke das kommt mit der Zeit 🙂

    Da sind drei Format-Blöcke in dem scanf() und drei Variablen, die damit eingelesen werden (die beiden Operanden und der Operator). Und scanf() liefert die Anzahl der erkannten Werte zurück, d.h. wenn da etwas anderes als 3 rauskommt, ist ein Fehler aufgetreten.


Anmelden zum Antworten