Rückgabe von Wechselgeld nach einem Kauf



  • Hallo, bin neu hier und habe gerade erst mit der C++ Programmierung begonnen.
    Ich will ein Programm schreiben das mir nach einem Kauf die Rückgabe von Wechselgeld bestimmt. Es soll der Kaufbetrag und der von Kunden gezahlte Betrag eingelesen werden. Es soll das Wechselgeld berechnet werden und dabei eine möglichst geringe Anzahl von Wechselgeld (Banknoten, Münzen) zurückgegeben werden und es soll geprüft werden ob der Kaufbetrag nicht größer ist als der gegebene Betrag. Die Ermittlung des Wechselgeldes soll ausgegeben werden.

    Leider verzweifel ich an der möglichst geringen Ausgabe von Wechselgeld. Kann mir hier evtl. jemand helfen?

    Hier ist meine Code:

    int main() {
    
    	double kaufbetrag, gezahlt;
    
    	cout << "Bitte geben Sie den den Kaufbetrag ein: " << endl;
    	cin >> kaufbetrag;
    	cout << "Bitte geben Sie den Gezahlten Betrag ein: " << endl;
    	cin >> gezahlt;
    
    	if (kaufbetrag<gezahlt) {
    
    		double wechselgeld=gezahlt-kaufbetrag;
    		cout << "Ihr wechselgeld beträgt: " << wechselgeld << " Euro!" << endl;
    
    		double cent1=0.01, cent2=0.02, cent5=0.05, cent10=0.10, cent20=0.20,
    				cent50=0.50;
    		int euromunzen1=1, euromunzen2=2;
    		int schein5=5, schein10=10, schein20=20, schein50=50, schein100=100,
    				schein200=200, schein500=500;
    
    		int counter14=0;
    		while (wechselgeld >=cent1) {
    			wechselgeld =wechselgeld -cent1;
    			counter14++;
    
    			cout << "Ihr wechselgeld beihnaltet " << counter14
    					<< " mal 1 Cent Münze(n)! " << endl;
    			int counter13=0;
    			while (wechselgeld >=cent2) {
    				wechselgeld =wechselgeld -cent2;
    				counter13++;
    
    				cout << "Ihr wechselgeld beihnaltet " << counter13
    						<< " mal 2 Cent Münze(n)! " << endl;
    
    				int counter12=0;
    				while (wechselgeld >=cent5) {
    					wechselgeld =wechselgeld -cent5;
    					counter12++;
    
    					cout << "Ihr wechselgeld beihnaltet " << counter12
    							<< " mal 5 Cent Münze(n)! " << endl;
    
    					int counter11=0;
    					while (wechselgeld >=cent10) {
    						wechselgeld =wechselgeld -cent10;
    						counter11++;
    
    						cout << "Ihr wechselgeld beihnaltet " << counter11
    								<< " mal 10 Cent Münze(n)! " << endl;
    
    						int counter10=0;
    						while (wechselgeld >=cent20) {
    							wechselgeld =wechselgeld -cent20;
    							counter10++;
    
    							cout << "Ihr wechselgeld beihnaltet " << counter10
    									<< " mal 20 Cent Münze(n)! " << endl;
    
    							int counter9=0;
    							while (wechselgeld >=cent50) {
    								wechselgeld =wechselgeld -cent50;
    								counter9++;
    
    								cout << "Ihr wechselgeld beihnaltet "
    										<< counter9
    										<< " mal 50 Cent Münze(n)! " << endl;
    
    								int counter8=0;
    								while (wechselgeld >=euromunzen1) {
    									wechselgeld =wechselgeld -euromunzen1;
    									counter8++;
    
    									cout << "Ihr wechselgeld beihnaltet "
    											<< counter8
    											<< " mal 1 Euro Münze(n)! " << endl;
    
    									int counter7=0;
    									while (wechselgeld >=euromunzen2) {
    										wechselgeld =wechselgeld -euromunzen2;
    										counter7++;
    
    										cout << "Ihr wechselgeld beihnaltet "
    												<< counter7
    												<< " mal 2 Euro Münze(n)! "
    												<< endl;
    
    										int counter6=0;
    										while (wechselgeld >=schein5) {
    											wechselgeld =wechselgeld -schein5;
    											counter6++;
    
    											cout
    													<< "Ihr wechselgeld beihnaltet "
    													<< counter6
    													<< " mal 5 Euro Schein(e)! "
    													<< endl;
    
    											int counter5=0;
    											while (wechselgeld >=schein10) {
    												wechselgeld =wechselgeld
    														-schein10;
    												counter5++;
    
    												cout
    														<< "Ihr wechselgeld beihnaltet "
    														<< counter5
    														<< " mal 10 Euro Schein(e)! "
    														<< endl;
    
    												int counter4=0;
    												while (wechselgeld >=schein20) {
    													wechselgeld =wechselgeld
    															-schein20;
    													counter4++;
    
    													cout
    															<< "Ihr wechselgeld beihnaltet "
    															<< counter4
    															<< " mal 20 Euro Schein(e)! "
    															<< endl;
    
    													int counter3=0;
    													while (wechselgeld
    															>=schein50) {
    														wechselgeld
    																=wechselgeld
    																		-schein50;
    														counter3++;
    
    														cout
    																<< "Ihr wechselgeld beihnaltet "
    																<< counter3
    																<< " mal 50 Euro Schein(e)! "
    																<< endl;
    
    														int counter2=0;
    														while (wechselgeld
    																>=schein100) {
    															wechselgeld
    																	=wechselgeld
    																			-schein100;
    															counter2++;
    															cout
    																	<< "Ihr wechselgeld beihnaltet "
    																	<< counter2
    																	<< " mal 100 Euro Schein(e)! "
    																	<< endl;
    
    															int counter1=0;
    															while (wechselgeld
    																	>=schein200) {
    																wechselgeld
    																		=wechselgeld
    																				-schein200;
    																counter1++;
    																cout
    																		<< "Ihr wechselgeld beihnaltet "
    																		<< counter1
    																		<< " mal 200 Euro Schein(e)! "
    																		<< endl;
    
    																int counter=0;
    																while (wechselgeld
    																		>=schein500) {
    																	wechselgeld
    																			=wechselgeld
    																					-schein500;
    																	counter++;
    																	cout
    																			<< "Ihr wechselgeld beihnaltet "
    																			<< counter
    																			<< " mal 500 Euro Schein(e)! "
    																			<< endl;
    
    																	while (kaufbetrag
    																			==gezahlt) {
    																		break;
    																	}
    																}
    															}
    														}
    													}
    												}
    											}
    										}
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	if (kaufbetrag==gezahlt) {
    		cout << " Der Kaufbetrag wurde passend gezahlt!" << endl;
    	}
    	if (kaufbetrag>gezahlt) {
    		cout
    				<< "Bitte erneut starten da der Kaufbetrag höher ist wie der gezahlte Betrag!"
    				<< endl;
    	}
    
    	return 0;
    }
    

    Danke vielmals und frohe ostern



  • Also um das nochmal genau zu Formulieren, meine Problem ist das ich die Ausgabe des Wechselgeldes mit einer möglichst geringen Anzahl von Banknoten und Münzen nicht richtig hin bekomme.

    Danke



  • Wie wuerdest du denn in der Realitaet Wechselgeld ausgeben?



  • Ich würde das nötige Wechselgeld dementsprechend raus geben. Aber ich bekomme das irgendwie ned so wie es sein soll im Programm umgesetzt. Ist mein Ansatz denn so falsch? Wenn ich fünfhundert und fünf Euro ausgeben müsste würde ich einen fünfhundert Euro Schein raus geben und einen fünf Euro Schein raus geben.

    Bei einem Betrag von 0,89 Euro und gezahlten 1,00 Euro würde ich einen Cent und zehn Cent ausgeben.



  • Geld nicht in double stecken, sondern in int. Sonst kriegste es nie auf den Cent genau hin und suchst Fehler bis Wacken.



  • Dann werde ich das mal versuchen. Laufen tut das Programm zur Zeit ohne das der Compiler meckert. Nur halt die Wechselgeldberechnung geht leider nicht. Geld grundsätzliche nicht in double stecken oder nur wegen der while schleifen? liegt es nur daran das es double Werte sind und mir das Programm deshalb nicht das richtige wechsel geld berechnet oder ist der Ansatz mittels der while schleifen schlecht?

    Danke vielmals


  • Mod

    Clonex schrieb:

    Dann werde ich das mal versuchen. Laufen tut das Programm zur Zeit ohne das der Compiler meckert. Nur halt die Wechselgeldberechnung geht leider nicht. Geld grundsätzliche nicht in double stecken oder nur wegen der while schleifen? liegt es nur daran das es double Werte sind und mir das Programm deshalb nicht das richtige wechsel geld berechnet oder ist der Ansatz mittels der while schleifen schlecht?

    Danke vielmals

    Der double ist generell ein schlechter Datentyp für Geld. Geld kommt in kleinsten Einheiten, den Cents. doubles modellieren hingegen das Kontinuum (soweit dies auf einem Digitalrechner geht). Stell dir vor, du würdest die Aufgabe auf Papier grafisch lösen. Wenn du auf komplett weißem Papier malst, wirst du nie ein exaktes Ergebnis bekommten. Auf Kästchenpapier ist das hingegen ganz einfach.



  • Und um den Schleifenjungle etwas zu entwirren, böte sich irgendeine Datenstruktur an, in der du die möglichen Schein-/Münzengrößen drinhast, damit du da dann nurnoch durchrennen musst.



  • Meinst du ein Array?



  • Wenns sein muss auch ein Array. Sonst halt ein Vector oder irgendwas in der Art.



  • Wie eingangs schon erwähnt habe ich gerade erst angefangen mit der c++ Programmierung das einzige was ich kenne ist bisher ein array. Habe es auch anfangs mit einem versucht. Hat aber leider nicht geklappt. Weiß auch nicht was ich da falsch gemacht habe. Dann bin ich auf die Idee mit den while schleifen gekommen. Dachte das wäre so leichter. Aber auch das hat nicht so funktioniert wie ich es mir vorgestellt habe und jetzt wollte ich mir mal hier Rat holen da ich nicht mehr weiter wusste.



  • OK, ich schreib dir mal grad eins mit nem vector, 1 mom. 😉



  • Kannst du mir auf die Sprünge helfen wie ich das mit einem array umsetzen könnte?



  • Geht sicher auch wesentlich eleganter und wiederverwendbarer, aber damit du siehst, wie ich es meine, reichts, denk ich.

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
    	int kaufbetrag, gezahlt;
    	cout << "Bitte geben Sie den den Kaufbetrag in Cent ein: " << endl;
    	cin >> kaufbetrag;
    	cout << "Bitte geben Sie den Gezahlten Betrag in Cent ein: " << endl;
    	cin >> gezahlt;
    
    	int wechselgeld( gezahlt - kaufbetrag );
    	if ( wechselgeld < 0 )
    	{
    		cout << "zu wenig, cu" << endl;
    		return 1;
    	}
    	if ( wechselgeld == 0 )
    	{
    		cout << "passt, cu" << endl;
    		return 0;
    	}
    
    	vector <int> geldEinheiten;
    	geldEinheiten.reserve( 15 );
    	geldEinheiten.push_back( 50000 );
    	geldEinheiten.push_back( 20000 );
    	geldEinheiten.push_back( 10000 );
    	geldEinheiten.push_back(  5000 );
    	geldEinheiten.push_back(  2000 );
    	geldEinheiten.push_back(  1000 );
    	geldEinheiten.push_back(   500 );
    	geldEinheiten.push_back(   200 );
    	geldEinheiten.push_back(   100 );
    	geldEinheiten.push_back(    50 );
    	geldEinheiten.push_back(    20 );
    	geldEinheiten.push_back(    10 );
    	geldEinheiten.push_back(     5 );
    	geldEinheiten.push_back(     2 );
    	geldEinheiten.push_back(     1 );
    
    	cout << "Im Wechselgeld sind:" << endl;
    	for ( vector <int>::const_iterator it( geldEinheiten.begin() ); it != geldEinheiten.end(); ++it )
    	{
    		int anzahl( 0 );
    		while ( *it <= wechselgeld )
    		{
    			++anzahl;
    			wechselgeld -= *it;
    		}
    		cout << anzahl << " Gegenstaende, die einen Wert von " << *it << " Cent repräsentieren." << endl;
    	}
    	return 0;
    }
    


  • Hast du auch einen Tipp wie ich das mit einem Array mache? Ich bekomme es nicht hin... 😞
    😕



  • Klar kannst du dort oben den vector<> durch ein Array und die Iteratoren durch Index-Zugriffe ersetzen. Aber die STL-Containerklassen sind wesentlich flexibler als nackte Arrays, also solltest du sie auch nutzen 😉



  • Clonex schrieb:

    Hast du auch einen Tipp wie ich das mit einem Array mache? Ich bekomme es nicht hin... 😞
    😕

    Normalerweise fass ich ekelwutzige Arrays nur an wenn es sich gar nicht vermeiden lässt, weil der code dadurch (wie du gleich sehen wirst) automatisch und unvermeidlich komisch wird, aber weil du es bist. 😉

    #include <iostream>
    #include <math.h>
    using namespace std;
    
    #define AbGehtDiePost for ( int n( 14 ); n >= 0; --n )
    
    int main()
    {
    	int kaufbetrag, gezahlt;
    	cout << "Bitte geben Sie den den Kaufbetrag in Cent ein: " << endl;
    	cin >> kaufbetrag;
    	cout << "Bitte geben Sie den Gezahlten Betrag in Cent ein: " << endl;
    	cin >> gezahlt;
    
    	int wechselgeld( gezahlt - kaufbetrag );
    	if ( wechselgeld < 0 )
    	{
    		cout << "zu wenig, cu" << endl;
    		return 1;
    	}
    	if ( wechselgeld == 0 )
    	{
    		cout << "passt, cu" << endl;
    		return 0;
    	}
    
    	int geldEinheiten[15]; // boeses Array
    	AbGehtDiePost
    	{
    		geldEinheiten[n] = (pow((n%3),2) + 1)*pow(10,floor(n/3));
    	}
    
    	cout << "Im Wechselgeld sind:" << endl;
    	AbGehtDiePost
    	{
    		int anzahl( 0 );
    		while ( *(geldEinheiten+n) <= wechselgeld )
    		{
    			++anzahl;
    			wechselgeld -= *(geldEinheiten+n);
    		}
    		cout << anzahl << " Gegenstaende, die einen Wert von " << *(geldEinheiten+n) << " Cent repräsentieren." << endl;
    	}
    	return 0;
    }
    


  • Dobi schrieb:

    Clonex schrieb:

    Hast du auch einen Tipp wie ich das mit einem Array mache? Ich bekomme es nicht hin... 😞
    😕

    Normalerweise fass ich ekelwutzige Arrays nur an wenn es sich gar nicht vermeiden lässt, weil der code dadurch (wie du gleich sehen wirst) automatisch und unvermeidlich komisch wird, aber weil du es bist. 😉

    Selten so einen dummen Scheiß gelesen.
    Sollen das Makro da und die Formel Erziehungsversuche sein?
    Sei doch so fair und übersetze dein vector-Programm einigermaßen unverfälscht in ein Array-Programm.
    So zum Beispiel:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    template<typename T,size_t size>
    T* begin(T (&arr)[size])
    {
        return &arr[0];
    }
    
    template<typename T,size_t size>
    T* end(T (&arr)[size])
    {
        return &arr[size];
    }
    
    int main()
    {
        int kaufbetrag, gezahlt;
        cout << "Bitte geben Sie den den Kaufbetrag in Cent ein: " << endl;
        cin >> kaufbetrag;
        cout << "Bitte geben Sie den Gezahlten Betrag in Cent ein: " << endl;
        cin >> gezahlt;
    
        int wechselgeld( gezahlt - kaufbetrag );
        if ( wechselgeld < 0 )
        {
            cout << "zu wenig, cu" << endl;
            return 1;
        }
        if ( wechselgeld == 0 )
        {
            cout << "passt, cu" << endl;
            return 0;
        }
    
        int geldEinheiten[15]={
            50000,20000,10000,
            5000,2000,1000,
            500,200,100,
            50,20,10,
            5,2,1,
            };
    
        cout << "Im Wechselgeld sind:" << endl;
        for ( int* it(begin(geldEinheiten)); it != end(geldEinheiten); ++it )
        {
            int anzahl( 0 );
            while ( *it <= wechselgeld )
            {
                ++anzahl;
                wechselgeld -= *it;
            }
            cout << anzahl << " Gegenstaende, die einen Wert von " << *it << " Cent repräsentieren." << endl;
        }
        return 0;
    }
    

    Und, welches ist hübscher?


  • Mod

    volkard schrieb:

    Und, welches ist hübscher?

    Dann musst du aber fairerweise jetzt auch ein von dir geschriebenes STL-Containerprogramm dagegen setzen, bei dem du dir die gleiche Mühe gibst. Vorzugsweise mit C++0x-Initialisierungslisten.



  • volkard schrieb:

    Selten so einen dummen Scheiß gelesen.
    Sollen das Makro da und die Formel Erziehungsversuche sein?
    Sei doch so fair und übersetze dein vector-Programm einigermaßen unverfälscht in ein Array-Programm.

    Sollte eigentlich nur Spaß sein, gute Güte. :p

    volkard schrieb:

    Und, welches ist hübscher?

    Natürlich deins, was für ne Frage.

    Edit: Da der Zwinkersmiley im Post vorhin nicht gereicht hat, versuch ich, durch etwas mehr Persönlichkeit zu versöhnen. 😉
    http://i54.tinypic.com/29zrn6v.jpg
    PS: Serotonin! Es sonnt doch. 🙂


Anmelden zum Antworten