Simulation eines Fahrkartenautomat in C++



  • chaos schrieb:

    Jetzt hab ich aber immer noch das Problem, dass er mir die Reihe betrag=preis; als Fehler ankreidet. error C2061: Syntaxfehler : Bezeichner 'betrag' Das macht er aber erst, seit die do-while-Schleife umd das switch case ist. 😕

    Das sieht nach Syntaxfehler aus.
    Wenn ich das richtig sehe, hast du

    do
    {
     switch
     {
       ...
     }
    
     while(...);
    }
    

    Das do-while-Konstrukt muß aber so aussehen:

    do
    {
     switch
     {
       ...
     }
    }
    while(...);
    


  • @Kevinus: Danke für die genaue Erklärung, ich hab es mir im Quellcode vermerkt. 🙂

    @fernsehass: Aus diesem Grund fahr ich Auto. 😃 Für 6 km zahl ich keine 2,50 €, ich fahr mit Diesel. 😃

    @GuybrushThreepwood: Danke! Jetzt läuft es soweit, wie ich es laufen soll und ich bin ein lebender Beweis, dass man den Wald vor lauter Bäumen nicht sieht. In einer anderen do-while-Schleife hatte ich den Syntax richtig. 🙄 Also danke für deine Hilfe. 🙂

    Gruß chaos



  • Noch mal ich... 🙄 Habe mein Programm fast fertig... Danke noch mal an diejenigen, die meine Probleme erkannt haben.
    Doch jetzt kommt mein persönlicher Grauen des Abends.

    Die Aufgabenstellung beinhaltet, dass es (sollte jemand zuviel bezahlen) Rückgeld gibt. Klappt. Aber er, also der Automat, soll das Rückgeld mit möglichst wenig Münzen zurückgeben. 🙄
    Außerdem soll bei Eingabe eines anderen Buchstaben außer j oder J, die Frage solange kommen, bis der Benutzer einen der zwei möglichen Buchstaben eingibt. Bei mir springt er nur zurück ins Programm wenn ich einen der Buchstaben eingebe. 🙄

    Könnte vielleicht noch mal jemand über meinen Quelltext blicken und mir eventuell meine Fehler schreiben? 😕

    #include <iostream.h>
    
    int main()
    {
    	char m, entnehm;
    	double zahl1=0, zahl2=0, rest=0, preis, betrag, rueckgabe;
    	double zwei=0,eins=0,fuenfzig=0,zwanzig=0,zehn=0;
    	int auszahl=200;
    
    	do
    	{
    		do
    		{
    		cout << "	*******************Menue********************" << endl;
    		cout << "	* FAHRKARTENAUTOMAT                        *" << endl;
    		cout << "	*                                          *" << endl;
    		cout << "	*                                          *" << endl;
    		cout << "	* Preisstufe       Betrag       Taste      *" << endl;
    		cout << "	* --------------------------               *" << endl;
    		cout << "	* Kurzstrecke      1.60 Euro    k          *" << endl;
    		cout << "	*                                          *" << endl;
    		cout << "	* 1 Tarifzone      2.50 Euro    1          *" << endl;
    		cout << "	* 2 Tarifzonen     4.80 Euro    2          *" << endl;
    		cout << "	* 3 Tarifzonen     7.20 Euro    3          *" << endl;
    		cout << "	* 4 Tarifzonen     9.00 Euro    4          *" << endl;
    		cout << "	*                                          *" << endl;
    		cout << "	*                                          *" << endl;
    		cout << "	* Unterbrechung                 x          *" << endl;
    		cout << "	* --------------------------               *" << endl;
    		cout << "	*                                          *" << endl;
    		cout << "	* Ihre Auswahl ================>           *" << endl;
    		cout << "	********************************************" << endl;
    		cout << endl << "	Eingabe: ";
    		cin >> m;
    
    		switch(m)
    		{
    		case 'k':
    			{
    				preis=1.60;
    				break;
    			}
    		case '1':
    			{
    				preis=2.50;
    				break;
    			}
    		case '2':
    			{
    				preis=4.80;
    				break;
    			}
    		case '3':
    			{
    				preis=7.20;
    				break;
    			}
    		case '4':
    			{
    				preis=9.00;
    				break;
    			}
    		case 'x':
    			{
    				return 0;
    			}
    		default:
    			{
    				cout << "	Falsche Eingabe" << endl;
    				preis=-1.00;
    				break;
    			}
    		}
    		}
    	while (preis<0);
    
        betrag=preis;
    	cout << "	Bitte den Betrag von: " << betrag << " Euro einwerfen." << endl;
    	cout << "	Nur mit Muenzen!" << endl;
    	cout << "	Erlaubt sind: 2.00 Euro, 1.00 Euro, 0.50 Euro, 0.20 Euro, 0.10 Euro" << endl;
    	betrag=betrag*100;
    	rest=betrag;
    
    	do
    	{
    		cout << "	Betrag: ";
    		cin >>	zahl1;
    		if (zahl1==2 || zahl1==1 || zahl1==0.50 || zahl1==0.20 || zahl1==0.10)
    		{
    		}
    		else
    		{
    			cout << "	Falsche Eingabe, es gibt keine " << zahl1 << "Muenze." << endl;
    			zahl1=0;
    		}
    		zahl1=zahl1*100; //evtl. in eine Funktions-Datei & Header-Datei
    		zahl2=zahl2+zahl1; //einbinden... Noch mal in Unterlagen nach
    		rest=rest-zahl1; //möglicher Lösung suchen!
    		if (rest > 0)
    		{
    			cout << "	Es muss noch " << (rest/100) << " Euro bezahlt werden." << endl;
    		}
    	}
    	while (betrag>zahl2);
    
    	zahl2=zahl2-betrag;
    	cout << "	Rueckgabe von "<<(zahl2/100)<<" Euro\n";
    
    	rueckgabe=(zahl2/100);
    
    	betrag=rueckgabe;
    	betrag=betrag*100;
    	while(betrag>0)
    	{		
    		if((betrag-auszahl)>=0)
    		{
    			switch(auszahl)
    			{
    			case 200:
    				zwei++;
    				break;
    			case 100:
    				eins++;
    				break;
    			case 50:
    				fuenfzig++;
    				break;
    			case 20:
    				zwanzig++;
    				break;
    			case 10:
    				zehn++;
    				break;
    			}
    			betrag=betrag-auszahl;
    		}
    		else
    		{
    			if(auszahl==50)
    			{
    				auszahl=20;
    			}
    			else
    			{
    				auszahl=auszahl/2;
    			}
    		}
    	}
    
    	cout << endl << "	Rueckgabe in folgenden Muenzen:";
    	cout << endl << "	-------------------------------";
    	cout << endl << "	" << zwei <<" x 2.00 Euro";
    	cout << endl << "	" << eins << " x 1.00 Euro";
    	cout << endl << "	" << fuenfzig << " x 0.50 Euro";
    	cout << endl << "	" << zwanzig << " x 0.20 Euro";
    	cout << endl << "	" << zehn <<" x 0.10 Euro";
    
    	cout << endl << endl << "Fahrkarte entnehmen!";
    	if (entnehm!='j' || entnehm!='J')
    	{
    	cout << endl << "Haben Sie die Fahrkarte entnommen? j/J=JA";
    	cin >> entnehm;
    	}
    
    	}
    	while (entnehm=='j' || entnehm=='J');
    
    }
    

    Gruß chaos



  • Hallo

    ich habe mir deinen Quellcode nicth genau angeschaut, wollte bloss sagen, dass du Funktionen schreiben solltest, weil es sonst echt unübersichtlich wird und du nicht mehr weisst, was am Anfang passiert.

    chrische



  • @chrische: Ich weiß und es ist auch eine Vorgabe vom Lehrer. Doch ich stehe mit Funktionen auf Kriegsfuß. 🙄 Wollte erst mal das Programm so weit lauffähig haben und mich dann an den Funktionen versuchen.

    chaos



  • Ich habe mir die Frechheit genommen, das Programm ein wenig in Funktionen zu gliedern (mit der Hoffnung, dass Du das Kriegsbeil begräbst 🙂 ) und kleinere Anpassungen vorzunehmen:

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int tarifAuswahl()
    {
    	char tarif;
    
    	while(true)
    	{
    		cout << "\t\xC9\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCDMenue\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB\n";
    		cout << "\t\xBA FAHRKARTENAUTOMAT                        \xBA\n";
    		cout << "\t\xBA                                          \xBA\n";
    		cout << "\t\xBA                                          \xBA\n";
    		cout << "\t\xBA Preisstufe       Betrag       Taste      \xBA\n";
    		cout << "\t\xBA --------------------------               \xBA\n";
    		cout << "\t\xBA Kurzstrecke      1.60 Euro    k          \xBA\n";
    		cout << "\t\xBA                                          \xBA\n";
    		cout << "\t\xBA 1 Tarifzone      2.50 Euro    1          \xBA\n";
    		cout << "\t\xBA 2 Tarifzonen     4.80 Euro    2          \xBA\n";
    		cout << "\t\xBA 3 Tarifzonen     7.20 Euro    3          \xBA\n";
    		cout << "\t\xBA 4 Tarifzonen     9.00 Euro    4          \xBA\n";
    		cout << "\t\xBA                                          \xBA\n";
    		cout << "\t\xBA                                          \xBA\n";
    		cout << "\t\xBA Unterbrechung                 x          \xBA\n";
    		cout << "\t\xBA --------------------------               \xBA\n";
    		cout << "\t\xBA                                          \xBA\n";
    		cout << "\t\xBA Ihre Auswahl ================>           \xBA\n";
    		cout << "\t\xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC\n\n";
    		cout << "\tEingabe: ";
    
    		cin >> tarif;
    
    		switch(tarif)
    		{
    		case 'k':
    			return 160;
    
    		case '1':
    			return 250;
    
    		case '2':
    			return 480;
    
    		case '3':
    			return 720;
    
    		case '4':
    			return 900;
    
    		case 'x':
    			exit(0);
    
    		default:
    			cout << "\tFalsche Eingabe" << endl;
    			break;
    		}
    	}
    }
    
    int muenzenAuswahl(int gefordertInCent)
    {
    	static int MUENZEN[] = {200, 100, 50, 20, 10};
    	int auswahl;
    	int gegeben = 0;
    
    	cout << "\tBitte den Betrag von: " << fixed << setprecision(2) << gefordertInCent/100.0f << " Euro einwerfen.\n";
    	cout << "\tNur mit Muenzen!\n";
    	cout << "\tErlaubt sind:\n\t(1) 2.00 Euro\n\t(2) 1.00 Euro\n\t(3) 0.50 Euro\n\t(4) 0.20 Euro\n\t(5) 0.10 Euro\n";
    
    	while (gefordertInCent > gegeben)
    	{
    		cout << "\tMuenze: ";
    		cin >> auswahl;
    		if (auswahl > 0 && auswahl < 6)
    			gegeben += MUENZEN[auswahl-1];
    		else
    			cout << "\tFalsche Eingabe, es gibt keine Muenze (" << auswahl << ")." << endl;
    
    		if (gefordertInCent > gegeben)
    			cout << "\tEs muss noch " << fixed << setprecision(2) << ((gefordertInCent-gegeben)/100.0f) << " Euro bezahlt werden." << endl;
    	}
    
    	return gegeben;
    }
    
    void rueckgabe(int gefordert, int gegeben)
    {
    	int zuviel = gegeben-gefordert;
    	int rueckgabe[] = {0, 0, 0, 0, 0};
    
    	cout << "\tRueckgabe von " << fixed << setprecision(2) << (zuviel/100.0f) <<" Euro\n";
    
    	while(zuviel >= 200)
    	{
    		++rueckgabe[0];
    		zuviel -= 200;
    	}
    
    	while(zuviel >= 100)
    	{
    		++rueckgabe[1];
    		zuviel -= 100;
    	}
    
    	while(zuviel >= 50)
    	{
    		++rueckgabe[2];
    		zuviel -= 50;
    	}
    
    	while(zuviel >= 20)
    	{
    		++rueckgabe[3];
    		zuviel -= 20;
    	}
    
    	while(zuviel >= 10)
    	{
    		++rueckgabe[4];
    		zuviel -= 10;
    	}
    
    	cout << endl << "\tRueckgabe in folgenden Muenzen:";
    	cout << endl << "\t-------------------------------";
    	cout << endl << "\t" << rueckgabe[0] << " x 2.00 Euro";
    	cout << endl << "\t" << rueckgabe[1] << " x 1.00 Euro";
    	cout << endl << "\t" << rueckgabe[2] << " x 0.50 Euro";
    	cout << endl << "\t" << rueckgabe[3] << " x 0.20 Euro";
    	cout << endl << "\t" << rueckgabe[4] << " x 0.10 Euro";
    }
    
    void automat()
    {
    	int preisInCent, gegeben;
    	char entnehm=0;
    
    	preisInCent = tarifAuswahl();
    	gegeben = muenzenAuswahl(preisInCent);
    	rueckgabe(preisInCent, gegeben);
    
    	cout << endl << endl << "Fahrkarte entnehmen!";
    	while(entnehm != 'j' && entnehm != 'J')
    	{
    		cout << endl << "Haben Sie die Fahrkarte entnommen? j/J=JA\n";
    		cin >> entnehm;
    	}
    }
    
    int main()
    {
    	automat();
    }
    


  • chaos schrieb:

    Danke, das Problem mit void main() ist jetzt gelöst, auch wenn ich meinem Lehrer nicht erklären könnte, wieso int anstatt main. Außer vielleicht, damit das return 0 funktioniert. 😃

    Ganz einfach - main() wird als int deklariert, weil das im C/C++ Standard so festgelegt ist (offiziell erlaubt sind nur "int main(void)", "int main(int,char**)" und "int main(int,char*[])" - die beiden letzten Varianten bieten dir Zugriff auf die Kommandozeilen-Parameter).



  • war die Frage nicht schon beantwortet aber egal, dass mit Funktionen zu machen solltest du auf keinen Fall missen, vorallem nicht wenn du das Programm noch weiter ausbauen möchtest, sonst kannst du dich dann erstma 2 Stunden in deinen Code einlesen, wenn du verstehst was ich meine. Außerdem noch den Rat von mir:
    Versuche zu dokumentieren wenn du weiter an deinem Programm arbeiten willst, vorallem bei größeren Projekten.



  • @result: Danke, aber irgendwie versteh ich den ganzen Aufbau nicht. 😞 Irgendwie hab ich Funktionen anders gelernt bzw. wollte mein Lehrer, dass wir sie lernen. Außerdem versteh ich den halben Quellcode nicht. 😞

    @Kevinus: Ja, die Frage war schon beantwortet, aber doppelt kann auch besser halten. 😃 Wegen den Funktionen werde ich mich mit einem Klassenkameraden zusammensetzen und der soll mir das noch mal alles erklären, bis auch ich es verstehe. 🙄

    Aber noch mal eine paar Fragen bezüglich dem Quellcode von result. Was bedeutet static int? Und das \t? Und C9, CD & BA vor dem x? 😕

    Gruß chaos



  • "static int MUENZEN[]={...};" bedeutet, daß der Wert dieses Arrays sich zwischen den einzelnen Funktionsaufrufen nicht ändert.

    '\t' steht für das Tabulator-Zeichen, '\xAB' und ähnliche stehen für das Zeichen mit dem ASCII-Code AB(hex) - die angegebenen Zeichen ergeben einen Rahmen um dein Auswahlmenü.



  • Die Codes für die Zeichen kann man bei WinXP übrigens in
    Start->Alle Programme->Zubehör->Systemprogramme->Zeichentabelle finden. Um die Tabelle für westeuropäische WinDOS Konsolenprogramme zu sehen muss man die erweiterte Ansicht einschalten und bei Zeichensatz "DOS: Westeuropa" auswählen. Im Internet gibt es diese Zeichentabelle zum Beispiel hier: http://de.wikipedia.org/wiki/Codepage_850. Was die Funktionen angeht, würde mich mal interessieren, was dein Lehrer darunter versteht. Hier übersichtshalber noch mal kleinere Funktionen mit Kommentaren:

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    //Funktion:
    //	Rückgabe : double
    //	Name	 : quadrat
    //	Parameter:
    //		Datentyp: double
    //		Name	: x
    double quadrat(double x)
    {
    	return x*x;
    }
    
    //Eine Funktion ohne Rückgabe nennt man auch Prozedur
    //	Rückgabe : void
    //	Name	 : zeigeQuadrat
    //	Parameter:
    //		Datentyp: double
    //		Name	: x
    //
    //		Datentyp: int
    //		Name	: nachKommaStellen
    void zeigeQuadrat(double x, int nachKommaStellen)
    {
    	//static in Funktion wird NUR beim ersten Aufruf initialisiert
    	static int wieOftAufgerufen = 0;
    
    	//mit dem Pre-Inkrement-Operator um 1 erhöhen (bei jedem Aufruf)
    	++wieOftAufgerufen;
    	cout << "Aufruf " << wieOftAufgerufen << ": " << fixed << setprecision(nachKommaStellen) << quadrat(x) << endl;
    }
    
    int main()
    {
    	zeigeQuadrat(5, 3);
    	zeigeQuadrat(5.3, 3);
    	zeigeQuadrat(7.1432, 3);
    
        cin.get();
    }
    

    Wenn die Parameter Eingangsgrößen sind, werden sie auch gerne Argumente genannt.



  • @result: Ich versuche das jetzt mal zu erklären, wie ich es von meinem Lehrer aufgenommen habe. Dabei hilft mir wohl am besten ein Quellcode.

    //Haupt.cpp
    #include <iostream.h>
    #include "add.h"
    
    void main()
    {
       int zahl1, zahl2, summe;
       cout << "Bitte Zahl1 eingeben: ";
       cin >> zahl1;
       cout << "Bitte Zahl2 eingeben: ";
       cin >> zahl2;
    
       summe=addidition(zahl1, zahl2);
    
       cout << summe;
    }
    

    So habe ich den Aufbau eines Programms gelernt. Die Headerdateien werden bzw. müssen bei meinem Lehrer mit .h versehen werden und using namespace std; benutzen wir gar nicht. Auch schreiben wir ständig void main() und andere Möglichkeiten hat er noch gar nicht erklärt.

    //add.h
    int addition (int x, int z);
    
    //Funktion.cpp
    #include "add.h" //Wobei ich mir hier gar nicht sicher bin, ob wir das überhaupt noch machen müssen.
    //In seinen letzten Programmen war das nämlich nicht der Fall.
    
    int addition (int x, int z),
    {
       int y;
       y=x+z;
       return y;
    }
    

    Du siehst, es ist alles recht einfach gestrickt und ich kann mit den meisten Begriffen kaum etwas anfangen. Und wenn ich meinem Lehrer so einen Quellcode (wie deinen Versuch, mich mit Funktionen zu versöhnen) abgeben würde, würde der denken, ich hab die Arbeit nicht selbst gemacht.

    Gruß chaos



  • Also die Quellcodes die du da geschrieben hast können gar nicht funktionieren. Nur ein Beispiel. Wenn ihr using namespace std; nicht nutzt müsst ihr vor cout oder cin immer std:: schreiben. Using namespace std; macht das ganze nur etwas kürzer weil der Namensraum für die gesamte Datei genutzt wird und der Compiler deshalb cout und cin zuordnen kann. Und das man in ner Header Datei die selbe Headerdatei inkludiert kann gar nicht funktionieren.



  • @Jaschi: Es war einmal vor über 7 Jahren, da war der C++ Standard noch nicht fertig. Damals hat man noch <iostream.h> verwendet, und alles war im globalen namespace definiert.

    @chaos: Wenn von deinem Lehrer verlangt wird, Funktionen in eine oder mehrere Header-Datei zu schreiben, solltest du ihm diesen Gefallen tun. Ansonsten gibt es in dem Quelltext nur sehr wenig neues. Ich glaube du kannst es locker schaffen, das zu verstehen und deinem Lehrer mit eigenen Worten zu erklären.
    Welchen Compiler benutzt eigentlich dein Lehrer bzw. du? Hat der Compiler nie eine Warnung von wegen deprecated (veraltet) ausgegeben? Du solltest gegebenenfalls deinen Lehrer mal darum bitten, sich an den über 7 Jahre alten C++ Standard zu halten.



  • @Spezi L: Ich benutze Microsoft Visual C++ 6.0 und bisher kam so eine Fehlermeldung nicht. Außerdem liegt bei mir nicht das Problem am erklären... Wenn ich etwas verstanden habe, kann ich es auch erklären.

    @Rest: Habe mich an Funktionen versucht. Zwar nicht so aufwendig wie das Programm von result, doch es läuft einigermaßen. Nur habe ich jetzt noch ein Problem in der einen do-while-Schleife. Das Programm soll mir ja ausgegeben, wieviel der Benutzer zahlen muss. Tut es auch und der Benutzer kann sogar eine Münze einwerfen. Doch dann soll ausgegeben werden, wieviel er noch bezahlen muss. Mein Programm gibt aber wieder den gleichen Text aus. Außerdem gibt mein Programm auch aus "Es muss noch -.... bezahlt werden.". Kann mir da noch mal jemand helfen? Weiß immerhin schon, dass es in der int einzahlen ist und wie ich es nicht machen kann. 🙄

    #include <iostream.h>
    #include <stdio.h>
    
    // \xBA senkrechte Linie
    // \xCD waagerechte Linie
    // \xC9, \xC8, \xBB & \xBC Ecken
    
    void menue()
    {
    	cout << "\xC9\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD*****Menue*****\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB" << endl; 
        cout << "\xBA                                        \xBA" << endl;
    	cout << "\xBA FAHRKARTENAUTOMAT                      \xBA" << endl; 
        cout << "\xBA                                        \xBA" << endl; 
        cout << "\xBA                                        \xBA" << endl; 
        cout << "\xBA Preisstufe       Betrag       Taste    \xBA" << endl; 
        cout << "\xBA --------------------------             \xBA" << endl; 
        cout << "\xBA Kurzstrecke      1.60 Euro    k        \xBA" << endl; 
        cout << "\xBA                                        \xBA" << endl; 
        cout << "\xBA 1 Tarifzone      2.50 Euro    1        \xBA" << endl; 
        cout << "\xBA 2 Tarifzonen     4.80 Euro    2        \xBA" << endl; 
        cout << "\xBA 3 Tarifzonen     7.20 Euro    3        \xBA" << endl; 
        cout << "\xBA 4 Tarifzonen     9.00 Euro    4        \xBA" << endl; 
        cout << "\xBA                                        \xBA" << endl; 
        cout << "\xBA                                        \xBA" << endl; 
        cout << "\xBA Unterbrechung                 x        \xBA" << endl; 
        cout << "\xBA --------------------------             \xBA" << endl; 
        cout << "\xBA                                        \xBA" << endl; 
        cout << "\xBA Ihre Auswahl ===============>          \xBA" << endl; 
        cout << "\xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC" << endl; 
    }
    
    int einzahlen(int kohle)
    {
    	double kommabetrag, muenze;
    	int halter;
    
    	do
    	{
    		halter=0;
    		kommabetrag=kohle;
    
    		cout << endl << "Bitte den Betrag von " << kommabetrag/100 << " Euro einwerfen."<<endl;
    		cout << "Nur mit Muenzen!" << endl;
    		cout << "Erlaubt sind nur 2.00, 1.00, 0.50, 0.20 und 0.10 Euro-Muenzen." << endl;
    		cin >> muenze;
    
    		do
    		{
    			if ((muenze==2.00) || (muenze==1.00) || (muenze==0.50) || (muenze==0.20) || (muenze==0.10))
    			{
    				halter=1;	
    			}
    			else
    			{
    				cout<<endl << "Falsche Eingabe, es gibt keine " << muenze << " Muenze." << endl;
    			}
    			if (kommabetrag>muenze)
    			{
    				cout << "Es muss noch " << ((kommabetrag-muenze*100)/100) << " Euro bezahlt werden." << endl;
    			}
    		}
    		while(halter!=1);
    		kohle=kohle-(muenze*100);
    		cout << endl;
    	}
    	while(kohle>0);
    	kohle=kohle*(-1);
    	kommabetrag=kohle;
    	cout << "Sie bekommen " << kommabetrag/100 << " EURO zurueck" << endl;
    	return kohle;
    }
    
    void rueckgabe(int kohle)
    {
    	char entnehm;
    	int zwei=0,eins=0,fuenfzig=0,zwanzig=0,zehn=0;
    	while (kohle>=200)
    	{
    		kohle=kohle-200;
    		zwei++;
    	}
    	while (kohle>=100){
    		kohle=kohle-100;
    		eins++;
    	}
    	while (kohle>=50){
    		kohle=kohle-50;
    		fuenfzig++;
    	}
    	while (kohle>=20){
    		kohle=kohle-20;
    		zwanzig++;
    	}
    	while (kohle>=10){
    		kohle=kohle-10;
    		zehn++;
    	}
    	cout << "Rueckgabe in folgenden Muenzen:" << endl;
    	cout << " " << zwei << " x 2.00 EURO"<<endl;
    	cout << " " << eins << " x 1.00 EURO"<<endl;
    	cout << " " << fuenfzig <<" x 0.50 EURO"<<endl;
    	cout << " " << zwanzig<<" x 0.20 EURO"<<endl;
    	cout << " " << zehn<<" x 0.10 EURO"<<endl;
    	cout << endl << endl << "Fahrkarte entnehmen.";
    
        while(entnehm != 'j' && entnehm != 'J') 
        { 
            cout << endl << "Haben Sie die Fahrkarte entnommen? j/J=Ja "; 
            cin >> entnehm; 
        } 
    }
    
    void main()
    {
    	char tarif;
    	int betrag;
    	do
    	{
    		menue();
    		cout << endl << "Eingabe: ";
    		cin >> tarif;
    
    		switch(tarif)
    		{
    		case 'k':
    			{
    				rueckgabe(betrag=einzahlen(160));
    				break;
    			}
    		case '1':
    			{
    				rueckgabe(betrag=einzahlen(250));
    				break;
    			}
    		case '2':
    			{
    				rueckgabe(betrag=einzahlen(480));
    				break;
    			}
    		case '3':
    			{
    				rueckgabe(betrag=einzahlen(720));
    				break;
    			}
    		case '4':
    			{
    				rueckgabe(betrag=einzahlen(900));
    				break;
    			}
    		}
    
    	}
    	while (tarif!='x');
    }
    

    Gruß chaos



  • Wozu hast du überhaupt die Variable "kommabetrag" in einzahlen() definiert, wenn du dann doch direkt mit dem Parameter "kohle" rechnest?
    oder anders: ersetze die letzte if() in der Schleife durch

    if (kohle>muenze)
    {
      cout << "Es muss noch " << ((kohle-muenze*100)/100) << " Euro bezahlt werden." << endl;
    }
    

    (in "kommabetrag" hast du nur den Startwert angegeben, in "kohle" wird der aktuelle Restbetrag mitgezählt)



  • Vielen Dank für die Hilfe, CStoll. Habe mein Programm jetzt lauffähig bekommen, indem ich die ganze if-Schleife rausgenommen habe. Also Danke! 🙂

    Gruß chaos


Anmelden zum Antworten