Taschenrechner



  • Habe diesen kleinen Taschenrechner geschrieben....er stürzt nach eingabe der ersten zahl ab (außer bei der division) Kann mir jemand sagen warum?

    [cpp]

    # include <stdio.h>
    # include <stdlib.h>
    
    double funktionadd (double add);
    double funktionsub (double sub);
    double funktionmul (double mul);
    double funktiondiv (double div);
    
    int main(void)
    {
        char wenn='a';
        char rechnung;
        double ergebniss;
        int quit;
    
        while (wenn !='0')
        {
            printf ("======== W I L L K O M M E N ========");
            printf ("Sie haben folgende Funktionen zur Verfügung:\n\n");
            printf ("1...Addition\n 2...Subtraktion\n 3...Multiplikation\n 4...Division\n 5...Potenz\n 6...Zifferndarstellung umrechnen\n 7...Quersumme berechnen\n 8...Quersumme berechnen (endrekursiv)\n 0...Beenden\n");
            printf ("\n Ihre Wahl:");
            scanf  ("%c",&rechnung);
            wenn = NULL;
    
            switch (rechnung)
            {
            case'1':
                    ergebniss=funktionadd (rechnung);
                    printf ("\n Ergebnis:%lf\n\n", ergebniss);
                    break;
            case'2':
                    ergebniss=funktionsub (rechnung);
                    printf ("\n Ergebnis:%lf\n\n", ergebniss);
                    break;
            case'3':
                    ergebniss=funktionmul (rechnung);
                    printf ("\n Ergebnis:%lf\n\n", ergebniss);
                    break;
            case'4':
                    ergebniss=funktiondiv (rechnung);
                    printf ("\n Ergebnis:%lf\n\n", ergebniss);
                    break;
    
            case'0':
                    wenn=='0';
                    default:
                    printf ("\nFalsche Eingabe\n");
                    wenn='a';
            }
        }
    }
    
    double funktionadd (double add)
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Addition gewählt:\n Geben Sie die erste Zahl ein:");
        scanf  ("%lf", zahl1);
        printf ("\n Geben Sie die 2. Zahl ein:");
        scanf  ("%lf", zahl2);
        ergebniss=zahl1+zahl2;
        return ergebniss;
    }
    
    double funktionsub (double sub)
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Subtraktion gewählt:\n Geben Sie die erste Zahl ein:");
        scanf  ("%lf", zahl1);
        printf ("\n Geben Sie die 2. Zahl ein:");
        scanf  ("%lf", zahl2);
        ergebniss=zahl1-zahl2;
        return ergebniss;
    }
    
    double funktionmul (double mul)
    {
        double zahl1,zahl2,ergebniss,i;
        printf ("\n Sie haben Multiplikation gewählt:\n Geben Sie die erste Zahl ein:");
        scanf  ("%lf", zahl1);
        printf ("\n Geben Sie die 2. Zahl ein:");
        scanf  ("%lf", zahl2);
        for(i=0;i<zahl1;i++){
            ergebniss = ergebniss + zahl2;
        }
        return ergebniss;
    }
    
    double funktiondiv (double div)
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Division gewählt:\n Geben Sie die erste Zahl ein:");
        scanf("%lf",&zahl1);
        printf("\nGeben sie bitte Zahl2 ein : ");
        scanf("%lf",&zahl2);
        ergebniss=zahl1/zahl2;
        return ergebniss;
    }
    


  • Die scanf-Aufrufe sind nur in funktiondiv korrekt. In den anderen Funktionen übergibst du den Wert uninitialisierter double-Variablen anstatt einer Speicheradresse, an die scanf die eingelesenen Werte schreiben könnte.



  • Du kriegst sicherlich eine Menge Warnings.
    Sieh zu das der Grund dafür wegkommt.
    Dann passt das auch.

    Du definierst deine Funktionen mit

    double funktionadd (double add)
    

    Wofür ist das add. Und warum übergibst du ein char.



  • Das add ist die funktion für die Addition.....
    kann man das besser lösen?
    Ich übergebe doch keinen char oder....



  • csa197 schrieb:

    Ich übergebe doch keinen char oder....

    Du übergibst beim Aufruf der Funktion die Variable rechnung. Und die ist vom Typ char.



  • Da deine Frage immer wieder vorkommt, hier mal ein Ansatz, wie es prinzipiell funktionen kann, Division durch 0, Überläufe usw. sowie Eingabeprüfungen der double-Werte fehlen noch:

    #include <stdio.h>
    #include <stdlib.h>
    
    double funktionadd(void);
    double funktionsub(void);
    double funktionmul(void);
    double funktiondiv(void);
    
    int main()
    {
        char wahl;
        double ergebnis;
    
        do
        {
            printf ("======== W I L L K O M M E N ========");
            printf ("Sie haben folgende Funktionen zur Verfügung:\n\n");
            printf ("1...Addition\n 2...Subtraktion\n 3...Multiplikation\n 4...Division\n 5...Potenz\n 6...Zifferndarstellung umrechnen\n 7...Quersumme berechnen\n 8...Quersumme berechnen (endrekursiv)\n 0...Beenden\n");
            printf ("\n Ihre Wahl:");
            wahl=getchar(); while(wahl!='\n' && getchar()!='\n');
    
            switch (wahl)
            {
            case '1':
                    ergebnis=funktionadd ();
                    printf ("\n Ergebnis:%f\n\n", ergebnis);
                    break;
            case '2':
                    ergebnis=funktionsub ();
                    printf ("\n Ergebnis:%f\n\n", ergebnis);
                    break;
            case '3':
                    ergebnis=funktionmul ();
                    printf ("\n Ergebnis:%f\n\n", ergebnis);
                    break;
            case '4':
                    ergebnis=funktiondiv ();
                    printf ("\n Ergebnis:%f\n\n", ergebnis);
                    break;
            case '0': break;
    
            default:
                    puts ("\nFalsche Eingabe");
            }
        } while( wahl!='0' );
    }
    
    double funktionadd ()
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Addition gewählt:\n Geben Sie die erste Zahl ein:");
        scanf("%lf",&zahl1);while( getchar()!='\n');
        printf("\nGeben sie bitte Zahl2 ein : ");
        scanf("%lf",&zahl2);while( getchar()!='\n');
        ergebniss=zahl1+zahl2;
        return ergebniss;
    }
    
    double funktionsub ()
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Subtraktion gewählt:\n Geben Sie die erste Zahl ein:");
        scanf("%lf",&zahl1);while( getchar()!='\n');
        printf("\nGeben sie bitte Zahl2 ein : ");
        scanf("%lf",&zahl2);while( getchar()!='\n');
        ergebniss=zahl1-zahl2;
        return ergebniss;
    }
    
    double funktionmul ()
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Multiplikation gewählt:\n Geben Sie die erste Zahl ein:");
        scanf("%lf",&zahl1);while( getchar()!='\n');
        printf("\nGeben sie bitte Zahl2 ein : ");
        scanf("%lf",&zahl2);while( getchar()!='\n');
        ergebniss=zahl1*zahl2;
        return ergebniss;
    }
    
    double funktiondiv ()
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Division gewählt:\n Geben Sie die erste Zahl ein:");
        scanf("%lf",&zahl1);while( getchar()!='\n');
        printf("\nGeben sie bitte Zahl2 ein : ");
        scanf("%lf",&zahl2);while( getchar()!='\n');
        ergebniss=zahl1/zahl2;
        return ergebniss;
    }
    


  • Ich persönlich würde ja dieses ewige Gefrage nach Zahl1 und Zahl2 aus den Funktionen auslagern.
    Denn eine Berechnungsfunktion sollte sich nicht um Ein-/Ausgabe kümmern.



  • hier mal eine sexy variante, für postfix notation oder wie das heißt 😉

    also die eingabe um (11+22)*33 zu berechnen schaut so aus 11 22 + 33 *

    #include <stdio.h>
    #include <ctype.h>
    
    int main(int argv, char **argc){
     char c;
     double a,b;
     scanf("%lf",&a);
     while(1){
      scanf("%lf",&b);
      while(isspace(c = getchar()) && c != EOF);
      switch(c){
       case '+': a+=b; break;
       case '-': a-=b; break;
       case '*': a*=b; break;
       case '/': a/=b; break;
       default:
        printf("\nunexpected operator:%c\n", c);
       return 0;
      }
      while(isspace(c = getchar()) && c != EOF && c!= '\n');
      switch(c){
       case '\n':
        printf("= %f\n", a);
        scanf("%lf",&a);
       break;
       default:
        printf("%f",a);
       return 0;
      }
     }
    }
    

    viel spaß damit und den versteckten bugs 🤡



  • das "&& c != EOF" könnt raus, glaub ich 😕



  • Danke mal so weit!
    Hab jetzt mal euren verbesserten code verwendet und die rekursion zur quersummenberechnung mit in das script genommen.....
    Die funzt bei mir wenn ich sie eigenständig verwende bringt im programm aber nur 0 zurück.....was hast es da wieder???
    Bei der Multiplikation soll ich mit + rechnen und das * weglassen...

    Hier der Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    double funktionadd(void);
    double funktionsub(void);
    double funktionmul(void);
    double funktiondiv(void);
    
    int main()
    {
        char wahl;
        double ergebnis;
    
        do
        {
            printf ("======== W I L L K O M M E N ========");
            printf ("Sie haben folgende Funktionen zur Verfügung:\n\n");
            printf ("1...Addition\n 2...Subtraktion\n 3...Multiplikation\n 4...Division\n 5...Potenz\n 6...Zifferndarstellung umrechnen\n 7...Quersumme berechnen\n 8...Quersumme berechnen (endrekursiv)\n 0...Beenden\n");
            printf ("\n Ihre Wahl:");
            wahl=getchar(); while(wahl!='\n' && getchar()!='\n');
    
            switch (wahl)
            {
            case '1':
                    ergebnis=funktionadd ();
                    printf ("\n Ergebnis:%f\n\n", ergebnis);
                    break;
            case '2':
                    ergebnis=funktionsub ();
                    printf ("\n Ergebnis:%f\n\n", ergebnis);
                    break;
            case '3':
                    ergebnis=funktionmul ();
                    printf ("\n Ergebnis:%f\n\n", ergebnis);
                    break;
            case '4':
                    ergebnis=funktiondiv ();
                    printf ("\n Ergebnis:%f\n\n", ergebnis);
                    break;
            case '0': break;
    
            default:
                    puts ("\nFalsche Eingabe");
            }
        } while( wahl!='0' );
    }
    
    double funktionadd ()
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Addition gewählt:\n Geben Sie die erste Zahl ein:");
        scanf("%lf",&zahl1);while( getchar()!='\n');
        printf("\nGeben sie bitte Zahl2 ein : ");
        scanf("%lf",&zahl2);while( getchar()!='\n');
        ergebniss=zahl1+zahl2;
        return ergebniss;
    }
    
    double funktionsub ()
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Subtraktion gewählt:\n Geben Sie die erste Zahl ein:");
        scanf("%lf",&zahl1);while( getchar()!='\n');
        printf("\nGeben sie bitte Zahl2 ein : ");
        scanf("%lf",&zahl2);while( getchar()!='\n');
        ergebniss=zahl1-zahl2;
        return ergebniss;
    }
    
    double funktionmul ()
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Multiplikation gewählt:\n Geben Sie die erste Zahl ein:");
        scanf("%lf",&zahl1);while( getchar()!='\n');
        printf("\nGeben sie bitte Zahl2 ein : ");
        scanf("%lf",&zahl2);while( getchar()!='\n');
        ergebniss=zahl1*zahl2;
        return ergebniss;
    }
    
    double funktiondiv ()
    {
        double zahl1,zahl2,ergebniss;
        printf ("\n Sie haben Division gewählt:\n Geben Sie die erste Zahl ein:");
        scanf("%lf",&zahl1);while( getchar()!='\n');
        printf("\nGeben sie bitte Zahl2 ein : ");
        scanf("%lf",&zahl2);while( getchar()!='\n');
        ergebniss=zahl1/zahl2;
        return ergebniss;
    }
    
    int funktionquer1 (int quer1)
    {
        int ergebniss;
        char feld[20];
        int erg=0;
        int n;
        int x;
        printf("Bitte Geben Sie eine beliebige Zahl ein\n");
        scanf ("%i", &feld);
        gets(feld);
            for(n=0; n<strlen(feld);n++)
            {
                x=feld[n] - '0';
    
                erg=erg+x ;
            }
    
        ergebniss=erg;
    return ergebniss;
    }
    


  • char feld[20];
    scanf ("%i", &feld);
    

    Nur ein kleiner Tipp: Das %i ist hier nicht richtig 😉



  • BasicMan01 schrieb:

    char feld[20];
    scanf ("%i", &feld);
    

    Nur ein kleiner Tipp: Das %i ist hier nicht richtig 😉

    Das & ist hier auch fehl am Platz. ⚠



  • Das & muss man nicht da hinschreiben, man kann es aber durchaus tun. Zwar ist der Typ von &feld nicht char*, sondern char(*)[20], aber bei der Übergabe an eine Ellipse verschwindet dieser Unterschied.



  • int Qsumr(int a)   //Qsumr = rekursive Methode zum Ausrechnen der Quersumme
         {                  // a = die zu berechnene Nummer, K = Quersumme
    
           while (a > 0) 
           {
               K += a % 10; 
               a /= 10;
               return(K);
           }
           return(K);
        }
    

    ist aber untested... :p

    hoffentlich stimmts 😮


Log in to reply