Fehler in Programm, wer findet ihn?



  • Mir is leider gerade noch ein Fehler aufgefallen 😕
    Immer wenn am Ende eines Wertes die Zahl 9 steht, gibt er folgendes ergebnis für die 9 raus:
    Bsp: 299:
    1200;
    1
    50;
    120;
    2
    20;
    15;
    1
    2;
    2*2;

    also schreibt er immer statt 10 und 1 --> 20 bzw. 2
    also rechnet er imm 1*2 +2*2( =1) =4
    Ich verstehe das einfach nicht, da er sonst jeden anderen Wert auch richtig rechnet... O.o



  • Ich versteh nicht, was x macht.



  • x ist dafür da, damit der wert von anzahl[i] pro subtraktion um 1 hochgezählt wird.
    und bevor ein neuer wert für die subtraktion verwendet wird (also die whileschleife neu beginnt) wird x auf 1 zurückgesetzt.
    Ich weis nich ob man das so schreiben muss, ich bin ziemlich neu im programmiere...



  • Ich hab den Code mal einrücken lassen...

    #include <stdio.h>
    #include <windows.h>
    
    main()
    {
        float geld[15], wert;
        float anzahl[15];
        int i=0, x=1, z=0;
        geld[0] = 500;
        geld[1] = 200;
        geld[2] = 100;
        geld[3] = 50;
        geld[4] = 20;
        geld[5] = 10;
        geld[6] = 5;
        geld[7] = 2;
        geld[8] = 1;
        geld[9] = 0.5;
        geld[10] = 0.2;
        geld[11] = 0.1;
        geld[12] = 0.050;
        geld[13] = 0.020;
        geld[14] = 0.010;
    
        while(1)
        {
            printf("\n\nBitte geben Sie den Wert ein: ");
            scanf("%f", &wert);
    
            for(z=0; z<=14; z++)
            {
                anzahl[z] = 0;
            }
            printf("\n\nIhr Wechselgeld: ");
            for(i = 0; i<= 14; i++)
            {
                while (wert >= geld[i])
                {
                    wert = wert - geld[i];
                    anzahl[i] = x++;
                    printf("\n");
                    if(geld[i]>=1.0)
                    {
                        printf("\n\t\t%.0f * %.0f Euro\n", anzahl[i], geld[i]);
                    }
                    else
                    {
                        printf("\n\t\t%.0f * %.0f Cent\n", anzahl[i], geld[i]*100);
                    }
                }
                x=1;
            }
            printf("\n\n");
            system("PAUSE");
        }
    }
    

    Aha, jetzt verstehe ich x.

    Der Trick macht einfach

    anzahl[i] = anzahl[i] + 1;
    

    über einen Umweg.



  • Ok, so sieht das natürlich schöner und übersichtlicher aus 🙂
    aber auf den fehler, warum er 4 so komisch umformt, hast du auch noch keine antwort, oder?



  • Ok, ich hab den Fehler selbst entdeckt, die ifschleife sitzt ja am falschen Platz xD



  • Er rechnet gar nicht falsch. Er zeigt nur an einer ungeschickten Stelle an.

    Ungeschickt.

    for(i = 0; i<= 14; i++)
            {
                while (wert >= geld[i])
                {
                    wert = wert - geld[i];
                    anzahl[i] = x++;
                    printf("\n");
                    if(geld[i]>=1.0)
                    {
                        printf("\n\t\t%.0f * %.0f Euro\n", anzahl[i], geld[i]);
                    }
                    else
                    {
                        printf("\n\t\t%.0f * %.0f Cent\n", anzahl[i], geld[i]*100);
                    }
                }
                x=1;
            }
    

    Besser erst sammeln und dann erst anzeigen.

    for(i = 0; i<= 14; i++)
            {
                while (wert >= geld[i])
                {
                    wert = wert - geld[i];
                    anzahl[i] = x++;
                }
                printf("\n");
                if(geld[i]>=1.0)
                {
                    printf("\n\t\t%.0f * %.0f Euro\n", anzahl[i], geld[i]);
                }
                else
                {
                    printf("\n\t\t%.0f * %.0f Cent\n", anzahl[i], geld[i]*100);
                }
                x=1;
            }
    


  • Ja so habe ich es jetzt auch gelöst mit einer weiteren if-schleife davor:

    while (wert >= geld[i]) {
                       wert = wert - geld[i];
                       anzahl[i] = x++;
                       }
                       if(anzahl[i]!=0){
                            if(geld[i]>=1.0) {
                                     printf("\n\t\t%.0f * %.0f Euro\n", anzahl[i], geld[i]);
                                  }
                            else {
                                     printf("\n\t\t%.0f * %.0f Cent\n", anzahl[i], geld[i]*100);
                                  }
                       }
    

    Jetzt zeigt er nur die Werte an, wo er was ausgibt 🙂
    Danke noch mal 🙂



  • Falls Du den Microsoft-Compiler benutzt, drücke gelegentlich
    Strg+A (alles markieren)
    Alt+F8 (Markierung automatisch einrücken)

    Bei Code::Blocks wäre es Plugins/SourceCodeFormatter

    Und schau http://www.if-schleife.de/ mal vorbei. 🤡



  • Ok, danke für die Tipps, ich werds mir für die Zukunft merken 🙂


Anmelden zum Antworten