C Programmierung Hilfe



  • Servus zusammen.

    Folgendes Problem:
    Ich soll als aufgabe ein Programm schreiben, welches einen Geldbetrag auf die kleineste Anzahl an möglichen Scheinen und Münzen ausgeben soll. Da ich ein Anfänger in sachen Programmieren bin hab ich ein eher unprofessionelles Programm geschrieben, welches seine Aufgabe jedoch erfüllt.
    Aber:
    Das Problem an meinem Programm ist, dass es Geldbeträge gibt, bei dem die Cent Beträge nicht Stimmen. Meist dann, wenn der wechsel auf 2 mal 2 cent und 1 cent erfolgt. (D.h. bei beträgen mit 9 Cent am Schluss). Ich denke es liegt am Datentyp....kann mir sonst nichts anderes vorstellen. Vielen Dank für die Hilfe.

    #include <stdio.h>
    #include <stdlib.h>
    
    float geldbetrag;
    int restbetrag, geldbetrag2;
    float euro500, euro100, euro50, euro20, euro10, euro5;
    float euro2, euro1, cent50, cent20, cent10, cent5, cent2, cent1;
    int main()
    {
    
        printf("Geldumrechner\n\n");
        printf("Bitten Geldbetrag eingeben"
               "\nund mit Enter bestaetigen.\n\n");
        scanf("%f", &geldbetrag);
        printf("Der Betrag von %.2f Euro kann aus\n\n",geldbetrag);
    
        geldbetrag2=geldbetrag*100;
    
        euro500=geldbetrag2/50000;
        restbetrag=geldbetrag2%50000;
    
        euro100=restbetrag/10000;
        restbetrag=restbetrag%10000;
    
        euro50=restbetrag/5000;
        restbetrag=restbetrag%5000;
    
        euro20=restbetrag/2000;
        restbetrag=restbetrag%2000;
    
        euro10=restbetrag/1000;
        restbetrag=restbetrag%1000;
    
        euro5=restbetrag/500;
        restbetrag=restbetrag%500;
    
        euro2=restbetrag/200;
        restbetrag=restbetrag%200;
    
        euro1=restbetrag/100;
        restbetrag=restbetrag%100;
    
        cent50=restbetrag/50;
        restbetrag=restbetrag%50;
    
        cent20=restbetrag/20;
        restbetrag=restbetrag%20;
    
        cent10=restbetrag/10;
        restbetrag=restbetrag%10;
    
        cent5=restbetrag/5;
        restbetrag=restbetrag%5;
    
        cent2=restbetrag/2;
        restbetrag=restbetrag%2;
    
        cent1=restbetrag/1;
        restbetrag=restbetrag%1;
    
        if(euro500==1)
            {printf("\t%.0f mal  500 Euro Schein\n\n", euro500);}
        if(euro500>1)
            {printf("\t%.0f mal  500 Euro Scheine\n\n", euro500);}
    
        if(euro100==1)
            {printf("\t%.0f mal  100 Euro Schein\n\n", euro100);}
        if(euro100>1)
            {printf("\t%.0f mal  100 Euro Scheine\n\n", euro100);}
    
        if(euro50==1)
            {printf("\t%.0f mal  50 Euro Schein\n\n", euro50);}
    
        if(euro20==1)
            {printf("\t%.0f mal  20 Euro Schein\n\n", euro20);}
        if(euro20>1)
            {printf("\t%.0f mal  20 Euro Scheine\n\n", euro20);}
    
        if(euro10==1)
            {printf("\t%.0f mal  10 Euro Schein\n\n", euro10);}
    
        if(euro5==1)
            {printf("\t%.0f mal   5 Euro Schein\n\n", euro5);}
    
        if(euro2==1)
            {printf("\t%.0f mal   2 Euro Muenze\n\n", euro2);}
        if(euro2>1)
            {printf("\t%.0f mal   2 Euro Muenzen\n\n", euro2);}
    
        if(euro1==1)
            {printf("\t%.0f mal   1 Euro Muenze\n\n", euro1);}
    
        if(cent50==1)
            {printf("\t%.0f mal  50 Cent Muenze\n\n", cent50);}
    
        if(cent20==1)
            {printf("\t%.0f mal  20 Cent Muenze\n\n", cent20);}
        if(cent20>1)
            {printf("\t%.0f mal  20 Cent Muenzen\n\n", cent20);}
    
        if(cent10==1)
            {printf("\t%.0f mal  10 Cent Muenze\n\n", cent10);}
    
        if(cent5==1)
            {printf("\t%.0f mal   5 Cent Muenze\n\n", cent5);}
    
        if(cent2==1)
            {printf("\t%.0f mal   2 Cent Muenze\n\n", cent2);}
        if(cent2>1)
            {printf("\t%.0f mal   2 Cent Muenzen\n\n", cent2);}
    
        if(cent1==1)
            {printf("\t%.0f mal   1 Cent Muenze\n\n", cent1);}
    
        if(restbetrag!=0)
            {printf("\n\n\t\aError!");}
    
        if(geldbetrag==0){
            printf("\nAnwendung bitte neustarten und richtigen Wert eingeben!\n");
        }
    
    return 0;
    }
    


  • Du solltest keine Fließkommawerte nehmen sondern int-Variablen.
    Dann bekommst du auch keine Rundungsfehler.



  • erstmal Danke für die schnelle Info.
    Wenn ich den typ int benütze nimmt er mir die Kommastellen, also die Centbeträge nicht an. Int sind ja Ganzzahlen oder?



  • Ja.
    Du nutzt int, liest aber float ein. Anschließend wandelst du den Eurobetrag in Cent um und rechnest nun mit Cents.



  • Ja, das mache ich weil ich ja den Betrag mit Euro und Cent ausgeben will. Wenn ich mit int deklariere dann nimmt er mir bei einer Eingabe von z.b. 200.45 die 45 Cent erst gar nicht an.



  • Nochmal:
    Du liest den Eurowert in float ein. Wandelst den Eurowert in Cent um (* 100) und weist das einem int zu.
    Dann rechnest du mit int.



  • So hatte ichs zuvor. So gings leidr auch nicht..
    Mir kams so vor, dass mit float für die einzelnen Beträge der Fehler nicht so oft auftrat.



  • "ging nicht" ist keine ausreichende Fehlerbeschreibung!



  • Du mußt deine euro500 usw. als int definieren. Denn es geht da ja auch um die Anzahl. Einen halben 500 Euroschein brauchst du da nicht berücksichtigen.



  • hab ich alles versucht. Das Problem tretet immer wieder auf.... rein mathematisch muss es ja funktionieren...darum versteh ich es nicht...



  • ElleT schrieb:

    hab ich alles versucht. Das Problem tretet immer wieder auf.... rein mathematisch muss es ja funktionieren...darum versteh ich es nicht...

    hättest du wirklich alles versucht, wäre auch die richtige lösung dabei.
    also, dann versuchs noch einmal, so wie man es dir hier erklärt hat.
    wenns immer noch nicht funzt, dann poste code.
    mfg



  • Auf float und double beim Einlesen am besten ganz verzichten.
    http://ideone.com/DoKktS



  • Hast du dir mal die Werte nach der Eingabe und Berechnung angesehen?
    Speziell geldbetrag und geldbetrag2.
    Auch kannst du dir restbetrag zwischendurch mal ansehen.

    Am besten geht da mit dem Debugger. Sonst mit printf.



  • Ellet schrieb:

    Da ich ein Anfänger in sachen Programmieren bin hab ich ein eher unprofessionelles Programm geschrieben, welches seine Aufgabe jedoch erfüllt.

    Um der Professionalität einen Schritt näher zu kommen, benutze Arrays und Schleifen.

    #include <stdio.h>
    
    int main(void)
    { // Wechselgeld in Cent.
    	int wechselgeld[] = { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 };
    // Speichert die Anzahl der Wechselgeld-Elemente am entsprechenden Index.
    	int stueckelung [ sizeof(wechselgeld) / sizeof(wechselgeld[0]) ] = { 0 };
        int i = 0;
    ...
    // Solange Betrag in Cent > 0
    // 		Solange Betrag >= Wechselgeld an Position i im Array wechselgeld
    //			Subtrahiere Wechselgeld an Position i vom Betrag
    // 			Inkrementiere Wert im Array stueckelung an Position i
    // Inkrementiere i
    ...
    


  • [quote="profiwerdungsmotivat0r"]

    Ellet schrieb:

    Um der Professionalität einen Schritt näher zu kommen, benutze Arrays und Schleifen.

    Ich würde als letzten Wechselgeldvetrag die 0 wählen. Dann bist du am Ende vom Array und brauchst die stueckelung nicht.

    int wechselgeld[] = { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1, 0 };
    


  • naja, wenn man das wechselgeld sofort per printf raushauen will, braucht man kein array namens stueckelung, stimmt, aber auch keine 0 am ende das wechselgeld-arrays.

    man nimmt das array stueckelung gern für kontrollausgaben.



  • Jetz gehts!
    Aber warum versteh ich nicht...

    Hab es folgendermaßen geändert:

    geldbetrag=geldbetrag*100;
        geldbetrag2=geldbetrag;
    

    vorher hatte ich:

    geldbetrag2=geldbetrag*100;
    

    ist das sooo gravierend?

    Und zum Thema Professionalität, des mit den Arrays hab ich noch nicht sooo raus...



  • ElleT schrieb:

    Jetz gehts!
    Aber warum versteh ich nicht...

    Hab es folgendermaßen geändert:

    geldbetrag=geldbetrag*100;
        geldbetrag2=geldbetrag;
    

    vorher hatte ich:

    geldbetrag2=geldbetrag*100;
    

    du spackst immer noch mit float/double rum?
    kannst du deutsch? kannst du lesen?
    warum beachtest du nicht die hinweise, die man dir hier gibt?

    1. benutze kein float
    2. benutze kein double
    3. benutze kein float
    4. benutze kein double
    5. ist es immer noch nicht in der rummsmurmel, gehe zu 1.



  • Wutzs Erbe schrieb:

    ElleT schrieb:

    Jetz gehts!
    Aber warum versteh ich nicht...

    Hab es folgendermaßen geändert:

    geldbetrag=geldbetrag*100;
        geldbetrag2=geldbetrag;
    

    vorher hatte ich:

    geldbetrag2=geldbetrag*100;
    

    du spackst immer noch mit float/double rum?
    kannst du deutsch? kannst du lesen?
    warum beachtest du nicht die hinweise, die man dir hier gibt?

    1. benutze kein float
    2. benutze kein double
    3. benutze kein float
    4. benutze kein double
    5. ist es immer noch nicht in der rummsmurmel, gehe zu 1.

    Ich weiß ja nicht, was du für ein Problem hast. Jedoch wurde mir hier geraten, den Betrag als float einzulesen und dann auf eine int variable zu überschreiben. Das hab ich gemacht und es funktioniert. Fertig.

    Zu deinem Hinweis "kein flaot oder double zu verwenden". Wie sollte ich dies denn tun? Int sind ganzzahlen...

    Nochmals der Hinweis: Ich bin Anfänger. Also bitte nicht gleich angreifend werden.



  • ElleT schrieb:

    Jedoch wurde mir hier geraten, den Betrag als float einzulesen und dann auf eine int variable zu überschreiben. Das hab ich gemacht und es funktioniert. Fertig.

    Hast du dir mein Beispiel angeguckt?
    Es gibt Zahlen, bei denen das nicht funktioniert.
    Solche Zahlen lassen sich auch für den Datentyp float finden.
    http://www.binaryconvert.com/result_float.html?decimal=051050049046049049

    ElleT schrieb:

    ... "kein flaot oder double zu verwenden". Wie sollte ich dies denn tun? Int sind ganzzahlen...

    int euro, cent;
    

Anmelden zum Antworten