Announcement

Collapse
No announcement yet.

C if-else-konstrukt-des-todes

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C if-else-konstrukt-des-todes

    Hallo zusammen,

    ich habe eine frage zu meinem Getränkeautomat.
    In den Getränkeautomat passen 0.10€ 0.20€ 0.50€ und 1.00€ rein.
    (ist aber nicht vorgeschrieben nur kann man nicht mehr alls zehn 0.10€ reinwerfen, weil sonst ein die Variabeln ausgehen )
    Das Getränk selbst kostet 1.00€
    Immer wenn man ein 0.10€ 0.20€ oder ein 0.50€ stück reinschmeisst, soll er einem sagen wie viel Geld noch bis zu 1.00€ fehlt.
    Das klabt so weit so gut. Wenn man aber annimmt, man hätte ein 0.90€ und ein 0.10€ Stück reingeworfen, dann gibt er die Meldung "dir fehlen noch 0.00" aus.
    Seltsamerweise gibt er bei einem 0.80€ und einem 0.20€ die Meldung "hier dein Getraenk" aus, was eigentlich ich auch erwarte.

    Ich hab schon gehört, dass man das ganz mit einer Schleife abkürzen könnte, aber ich will denoch gerene wissen wiso es nicht das macht was ich will

    IDE: CodeBlocks 13.12
    Compiler: GNU GCC

    Code:
    #include<stdio.h>
    #include<conio.h>
    
    int main(){
    
    float einwurf1, einwurf2, einwurf3, einwurf4, einwurf5, einwurf6, einwurf7, einwurf8, einwurf9 ,einwurf10;
    
    
    printf("wirf 1 Euro rein\n");
    scanf("%f", &einwurf1);
    
    if(einwurf1 >= 1.00){
    printf("hier dein Getraenk\t\n");
    }else{
    printf("dir fehlen noch\t%.2f\n", 1-einwurf1);
    scanf("%f", &einwurf2);
    
        if(einwurf1+einwurf2 >= 1.00){
        printf("hier dein Getraenk\t\n");
        }else{
        printf("dir fehlen noch\t%.2f\n", (1-einwurf1)-einwurf2);
        scanf("%f", &einwurf3);
    
            if(einwurf1+einwurf2+einwurf3 >= 1.00){
            printf("hier dein Getraenk\t\n");
            }else{
            printf("dir fehlen noch\t%.2f\n", ((1-einwurf1)-einwurf2)-einwurf3);
            scanf("%f", &einwurf4);
    
                if(einwurf1+einwurf2+einwurf3+einwurf4 >= 1.00){
                printf("hier dein Getraenk\t\n");
                }else{
                printf("dir fehlen noch\t%.2f\n", (((1-einwurf1)-einwurf2)-einwurf3)-einwurf4);
                scanf("%f", &einwurf5);
    
                    if(einwurf1+einwurf2+einwurf3+einwurf4+einwurf5 >= 1.00){
                    printf("hier dein Getraenk\t\n");
                    }else{
                    printf("dir fehlen noch\t%.2f\n", ((((1-einwurf1)-einwurf2)-einwurf3)-einwurf4)-einwurf5);
                    scanf("%f", &einwurf6);
    
                        if(einwurf1+einwurf2+einwurf3+einwurf4+einwurf5+einwurf6 >= 1.00){
                        printf("hier dein Getraenk\t\n");
                        }else{
                        printf("dir fehlen noch\t%.2f\n", (((((1-einwurf1)-einwurf2)-einwurf3)-einwurf4)-einwurf5)-einwurf6);
                        scanf("%f", &einwurf7);
    
                            if(einwurf1+einwurf2+einwurf3+einwurf4+einwurf5+einwurf6+einwurf7 >= 1.00){
                            printf("hier dein Getraenk\t\n");
                            }else{
                            printf("dir fehlen noch\t%.2f\n", ((((((1-einwurf1)-einwurf2)-einwurf3)-einwurf4)-einwurf5)-einwurf6)-einwurf7);
                            scanf("%f", &einwurf8);
    
                                if(einwurf1+einwurf2+einwurf3+einwurf4+einwurf5+einwurf6+einwurf7+einwurf8 >= 1.00){
                                printf("hier dein Getraenk\t\n");
                                }else{
                                printf("dir fehlen noch\t%.2f\n", (((((((1-einwurf1)-einwurf2)-einwurf3)-einwurf4)-einwurf5)-einwurf6)-einwurf7)-einwurf8);
                                scanf("%f", &einwurf9);
    
                                    if(einwurf1+einwurf2+einwurf3+einwurf4+einwurf5+einwurf6+einwurf7+einwurf8+einwurf9 >= 1.00){
                                    printf("hier dein Getraenk\t\n");
                                    }else{
                                    printf("dir fehlen noch\t%.2f\n", ((((((((1-einwurf1)-einwurf2)-einwurf3)-einwurf4)-einwurf5)-einwurf6)-einwurf7)-einwurf8)-einwurf9);
                                    scanf("%f", &einwurf10);
    
                                        if(einwurf1+einwurf2+einwurf3+einwurf4+einwurf5+einwurf6+einwurf7+einwurf8+einwurf9+einwurf10 >= 1.00){
                                        printf("hier dein Getraenk\t\n");
                                        }else{
                                        printf("dir fehlen noch\t%.2f\n", (((((((((1-einwurf1)-einwurf2)-einwurf3)-einwurf4)-einwurf5)-einwurf6)-einwurf7)-einwurf8)-einwurf9)-einwurf10);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    return 0;
    }
    Zuletzt editiert von Pustekuchen; 18.01.2014, 16:33.

  • #2
    Kannst du rausfinden, wenn du dein Programm debuggst

    http://de.wikipedia.org/wiki/Gleitkommazahl

    Absatz "Prüfung auf Gleichheit"


    EDIT
    Was soll duch die endlose Klammerung erreicht werden?


    (((((((((1-einwurf1)-einwurf2)....

    100-10-20

    ((100-10)-20)
    Zuletzt editiert von Christian Marquardt; 18.01.2014, 16:58.
    Christian

    Comment


    • #3
      Wahrscheinlich wird 0,9 als 0,899999 und 0,1 als 0,0999999 abgespeichert. Die Summe ist dann nicht größer oder gleich 1,0 und die Differenz 0,0000002 wird auf 0,00 gerundet.
      Abhilfe: double nehmen.

      Als nächste Übung änderst Du dann Deinen Automaten so, dass das Getränk 2 Euro kostet, insgesamt aber deutlich weniger Code benutzt wird.
      Günther

      Comment


      • #4
        Abhilfe: double nehmen.
        Das ändert an der Fließkommaarithmetik leider nichts. Siehe #2 und den Link
        Christian

        Comment


        • #5
          Danke für die schnelle Antwort, dass trägt aufjedenfall zum Verständnis bei
          Die Klammern waren ein Akt der Verzweiflung
          Da die Rechnung immer falsch ausging, dachte ich mir, dass sich die Variabeln möglichweise überschneiden...

          Wie benutze ich den Debugger genau?
          ich habe mich zwar hier schlau gemacht: http://www.math.uni-bayreuth.de/serv..._debugger.html
          Jedoch sehe ich im "Watches"-Fenster die "local variables" und "Function Arguments" nicht.

          Comment


          • #6
            Ich kenne die IDE nicht, aber hast du einen breakpoint gesetzt....
            Christian

            Comment


            • #7
              Ja sigi, habs auch mit mehreren ausprobiert.

              Comment


              • #8
                Tja, dann ggf. mal andere IDE probieren

                https://netbeans.org/

                https://netbeans.org/downloads/
                Christian

                Comment

                Working...
                X