c Anfänger kommt nicht weiter; Probleme mit swich, scanf, while....



  • Hallo!

    Ich versuche gerade einen kleinen Taschenrechner zu basteln. Er sollte + - * und / können, mit c soll man immer zum Anfang kommen bzw. das alte Ergebnis löschen. Mit q soll das Programm beendet werden. Man sollte mit double Zahlen rechnen können

    Ich dachte mir folgenden Lösungsweg:

    Einen Speicher der das Ergebnis enthält, zwspeicher für als Zwischenspeicher
    Sooo ungefähr hätte ich mir gedacht dass es funktionieren könnte

    Aber leider funktioniert nicht dies nicht. Schnappt mir das "c = (char)toupper(getchar())" die ganzen Zeichen weg?

    #include <stdio.h>
    #include <ctype.h>
    
    #define FALSE 0
    #define TRUE !FALSE
    
    void main ()
    {
      int fertig; //Schleifenende
      char b, c;
      double ergebnis; //Ergebnis, wird durch die Operationen verändert
      int zwergebnis; //Zwischenspeicher der für den zweiten Operand benutzt wird
    
      ergebnis = 0;
    
      printf("Derzeitgiger Stand von ergebnis %d:\n", ergebnis);
      printf("Bitte Werte eingeben: ");
      scanf("%d", &ergebnis);
      printf("Derzeitgiger Stand von ergebnis %d:\n", ergebnis);
    
      fertig = FALSE;
      while (!fertig)
      {
        c = (char)toupper(getchar()); \\aus einem Buch genommen
        switch (c)
        {
          case '+':
             scanf("%d", &zwergebnis);
             ergebnis = ergebnis + zwergebnis;
          break;
    
          case 'Q':
            return (0);
          break;
    
          case '=':
            printf("Ergebnis ist %d", &ergebnis);
          break;
    
          default:
            printf("eingebene Zahl %d", &ergebnis);
          break;
    
          fertig = TRUE; //Schleifenende
        } //Ende von while
      }
      return (0);
    }
    

    Ich probiere jetzt schon 3h rundum und bin am verzweifeln.

    vg Christoph



  • anstatt scanf("%d", &ergebnis); scanf("%f", &ergebnis);



  • Warum funktioniert dieses Programm nicht so wie ich es will?
    Wahrscheinlich hat es irgendwas mit double, float int usw. zu tun?

    #include <stdio.h>
    #include <ctype.h>
    
    #define FALSE 0
    #define TRUE !FALSE
    
    void main ()
    {
      int fertig; //Schleifenende
      int fertig2; //+ - schleife
      char c;
      double ergebnis; //Ergebnis, wird durch die Operationen verändert
      double zwergebnis; //Zwischenspeicher der für den zweiten Operand benutzt wird
    
      ergebnis = 0;
      zwergebnis = 0;
    
      fertig = FALSE;
      while (!fertig)
      {
        c = (char)toupper(getchar());
        switch (c)
        {
          case '+': //Addieren
             scanf("%f", &zwergebnis);
             ergebnis += zwergebnis;
          break;
    
          case '-':  //Subtrahieren
             scanf("%f", &zwergebnis);
             ergebnis -= zwergebnis;
          break;
    
          case '=':
            printf("Ergebnis ist %f\n", ergebnis);
          break;
    
          case 'Q': //Programm beenden
            return (0);
          break;
    
          case'c': //clear ergebnis
            ergebnis = 0;
          break;
    
          default:
             scanf("%f", &ergebnis);
          break;
    
          fertig = TRUE; //Schleifenende
        }  //Ende switch
      } //Ende von while
      return (0);
    }
    

    Danke schon im voraus! Bald habe ich wirklich keine nerven... Aber so ists wahrscheinlich bei jedem Anfänger 😃



  • anstatt scanf("%f", &ergebnis); scanf("%lf", &ergebnis); 😉



  • Dein "fertig = TRUE;" wird niemals ausgeführt werden... das weißt Du?

    ...und dann:

    #define FALSE 0 
    #define TRUE !FALSE
    

    Was ist das? 😮



  • na !0 also true



  • ...und sowas muß man wirklich von Hand definieren?

    ...mußte ich irgendwie noch nie...



  • Dann wahrscheinlich, weil du entweder nicht mit booleschen Werten arbeitest, oder weil du immer windows.h oder eine andere Library benutzt, die BOOL/TRUE/FALSE hat, oder weil du in C99 immer stdbool.h einbindest, oder weil du mit C++ arbeitest.
    Auch wenn du's dir nicht vorstellen kannst, aber in reinem C gibt es sowas nicht, und manche bevorzugen es, nicht mit 0 und 1 zu arbeiten, sondern lieber mit benannten Konstanten.



  • Sooo geschafft!!! Alles funktioniert, bis auf die erste Rechnung. Warum liefert die erste Rechnung immer ein falsches Ergebnis? Jede weitere Rechnung liefert immer ein richtiges Ergebnis.

    #include <stdio.h>
    #include <ctype.h>
    
    #define FALSE 0
    #define TRUE !FALSE
    
    void main ()
    {
      int fertig; //Schleifenende
      char c;
      double ergebnis; //Ergebnis, wird durch die Operationen verändert
      double zwergebnis; //Zwischenspeicher der für den zweiten Operand benutzt wird
    
      ergebnis = 0;
      zwergebnis = FALSE;
    
      printf("***************************\nq zum beenden\nc um Speicher zu löschen\nmögliche Operatoren:\n+ - */\n");
      printf("***************************\nEingabe nach diesem Muster:\nx+y=\n***************************\n");
    
      fertig = FALSE;
      while (!fertig)
      {
        c = (char)toupper(getchar());
        switch (c)
        {
          case '+': //Addieren
             scanf("%lf", &zwergebnis);
             ergebnis += zwergebnis;
          break;
    
          case '-':  //Subtrahieren
             scanf("%lf", &zwergebnis);
             ergebnis -= zwergebnis;
          break;
    
          case '*':  //Subtrahieren
             scanf("%lf", &zwergebnis);
             ergebnis *= zwergebnis;
          break;
    
          case '/':  //Subtrahieren
             scanf("%lf", &zwergebnis);
             ergebnis /= zwergebnis;
          break;
    
          case '=':  //Ergebnis ausgeben
            printf("ergebnis \t%.3lf\n", ergebnis);
          break;
    
          case 'F':  //zwergebnis ausgeben
            printf("zwergebnis \t%.3lf\n", zwergebnis);
          break;      
    
          case 'Q': //Programm beenden
          case 'X':
            return (0);
          break;
    
          case'C': //clear ergebnis
            ergebnis = FALSE;
            zwergebnis = FALSE;
          break;
    
          default:
             scanf("%lf", &ergebnis);
          break;
    
          fertig = TRUE; //Schleifenende
        }  //Ende switch
      } //Ende von while
      return (0);
    }
    

Anmelden zum Antworten