Taschenrechner Programmierung Problem



  • ich versuch mich grad in c++ einzuarbeiten wegen Uni und erstem Semester
    sollen Taschenrechner programmieren und ich hab jetzt ein Problem wo ich das nimma kapiere.
    Bin noch am Anfang vom Programm also nicht wundern fehlt noch einiges.

    Mein Code bis jetzt

    #include <stdio.h>
    main ()
    
    {
    
    char zeichen;
    char c;
    float Erg=0;
    float Wert1;
    float Wert2;
    
    printf(":");
    scanf("%f", &Wert1);
    
    printf(":");
    scanf("%c %c %f", &c, &zeichen, &Wert2);
    
    switch( zeichen )
    
    	{
    
    	case '+':
    
    		Erg = Wert1 + Wert2;
    		printf("%f", Erg);
    
            break;
        case '-':
            //irgendwas
            break;
        case '*':
            //irgendwas
            break;
        case '/':
            //irgendwas
            break;
    	}
    }
    

    Das problem ist diese Zeilen Kombi

    15: printf(":");
    16: scanf("%c %c %f", &c, &zeichen, &Wert2);

    Ich hatte Zeile 16 erst so

    16: scanf("%c %f", &zeichen, &Wert2);

    also ohne das einlesen der Variablen "c"
    Da hat das Programm dann nicht funktioniert.

    Also wenn ich
    10
    +10
    machen wollte ist er immer aus dem programm gesprungen
    erst nachdem ich das "c" mit eingelesen hab im scanf lief das addieren.
    Hab das "c" aus der Musterlösung genommen blos hab ich absolut kein plan wieso ich das mit einlesen muss im scanf
    Wäre nett wenn mir jemand ne anfängerfreundliche Erklärung geben könnte

    vielen dank auf jeden Fall schonmal im voraus.
    Mir schon fast peinlich wegen sowas kleinem hier zu fragen 😞

    Grüsse

    Christian

    PS. eventuelle andere Fehler bitte noch nicht ansprechen will erstmal selbst probieren wenn ich mit weiteren Problemen konfrontiert werde da ich für weitere abläufe irgendwas im Moment noch falsch haben sollte.



  • #include <stdio.h>
    int main (void) // in ansi c wenn man keine parameter übergibt void 
    //eintragen und rückgabetyp int, keine parameter gibts erst seit c++
    
    {
    
    char zeichen;
    char c;
    float Erg=0;
    float Wert1;
    float Wert2;
    
    printf(":");
    scanf(" %f", &Wert1); //leerzeichen, vor dem % ignoriert witespaces
    
    printf(":");
    scanf("%c %c %f", &c, &zeichen, &Wert2); // ein leerzeichen ist auch ein zeichen zum einlesen
    
    switch( zeichen )
    
        {
    
        case '+':
    
            Erg = Wert1 + Wert2;
            printf("%f", Erg);
    
            break;
        case '-':
            //irgendwas
            break;
        case '*':
            //irgendwas
            break;
        case '/':
            //irgendwas
            break;
        }
    return 0; //da du int als rückgabetyp hast solltest du auch 0 zurückgeben, alles andere sind fehlertags
    }
    

    EDIT: mit den fehlern hab ich erst nach dem post gelesen, aber das ist sonst kein ansi c



  • Versuch mal ein

    while(getchar()!='\n');
    

    zwischen den beiden scanf()



  • curry-king schrieb:

    Versuch mal ein

    while(getchar()!='\n');
    

    zwischen den beiden scanf()

    das hat doch nichts mit dem flush zu tun



  • erstmal viiiiielen dank, hab mir die ganze Zeit den Kopf zerbrochen wieso das nicht ging und kam einfach nicht drauf. Funktioniert jetzt so wie ich das von Anfang an wollte an der Stelle.

    Bin jetzt soweit

    #include <stdio.h>
    main ()
    
    {
    
    char zeichen;
    float Erg=0;
    float Wert1;
    float Wert2;
    int	i=0;
    int x=1;
    
    printf("1Eingabe:");
    scanf("%f", &Wert1);
    
    Anfang:
    
    	{
    
     while (i<x)
    
    		{
    
    printf("Eingabe:");
    scanf(" %c %f", &zeichen, &Wert2);
    
    switch( zeichen )
    
    			{
    
    	case '+':
    
    		Erg = Wert1 + Wert2;
    		printf("=%f\n", Erg);
    		Wert1 = Erg;
    
            break;
    
        case '-':
    
    		Erg = Wert1 - Wert2;
    		printf("=%f\n", Erg);
    		Wert1 = Erg;
    
    		break;
    
        case '*':
    
    		Erg = Wert1 * Wert2;
    		printf("=%f\n", Erg);
    		Wert1 = Erg;
    
    		break;
    
        case '/':
    
    		Erg = Wert1 / Wert2;
    		printf("=%f\n", Erg);
    		Wert1 = Erg;
    
        break;
    
    	case '=':
    		printf("Ergebniss: %f\n", Erg);
    		Erg = 0;
    		Wert1 = 0;
    		Wert2 = 0;
    
    	break;
    
    			}
    
    		}
    
    	}
    		return 0;
    }
    

    Jetzt noch ne dumme Frage. gibt es ne möglichkeit die einen wieder ganz zum Anfang vom Programm bringt also zu Zeile 1 ?
    return 0 beendet das programm ja. Das würde mir nämlich hier noch etwas helfen.
    Dann würde ich nämlich direkt nen Sprung machen aus der letzten Case
    also

    Case '=':

    direkt wieder zum Anfang quasi ne "CE" taste vom Taschenrechner.

    Ansonsten ist die erste Version soweit funktionsfähig blos halt sonderfälle noch nicht wie Bruch durch 0 usw das muss ich noch einfügen.
    Überleg nur grad wie ich am einfachsten vom der letzten Case wieder zur Ersten Programm Zeile springen kann

    PS. kein reines C ? 😞 bin ich in dem Forum hier auch Falsch 😞 ohje



  • Schau dir mal while Schleifen an!



  • #include <stdio.h>
    main ()
    
    {
    
    ...
    
    while(zeichen != '0'){ // wenn als zeichen 0 eingegeben wird beendet es die schleife
    printf("1Eingabe:");
    scanf("%f", &Wert1);
    ...
    
    default: break;
    
        }  klammer nicht vergessen
    		return 0;
    }
    


  • Es würde auch mit zwei if Schleifen und Goto gehen (aber gleich werd ich wahrscheinlich von all den Goto Hassern gelyncht ^^)

    anfang:
    //dein quellcode
    //usereingabe "Wollen sie nochwas rechnen?"
    if (usereingabe=='J')
    {
    goto anfang;
    }
    system ("PAUSE");
    return 0;
    }
    

    Wichtig sind die Doppelpunkte nach anfang ganz oben.

    s.http://cck-wiki.pytalhost.com/wiki/pmwiki-2.1.27/pmwiki.php?n=CUndC.Goto 😃



  • goto hatte ich mal kurz überlegt dann stand aber dahinter in Klammer man soll es nicht machen weil sich das "nicht gehört" daher hab ich es gelassen 🙂

    Werd es mit der schleife probieren.

    Und danke für die ERklärung mit dem main()

    int main (void) // in ansi c wenn man keine parameter übergibt void
    //eintragen und rückgabetyp int, keine parameter gibts erst seit c++

    Da hatte ich bei mir immer beim Debug "Vorsicht" stehn es lief zwar ohne probleme war aber halt nicht richtig muss ich noch ändern im Code.

    Danke euch auf jeden Fall für die schnelle Hilfe



  • solang man auf goto verzichten kann, sollte man es machen


Anmelden zum Antworten