Preis Berechnung if-Verweigungen



  • #include<iostream>

    int main() {
    char auswahl;
    char Zucker, Milch;
    double getraenkPreis = 0.0;

    //Vorratsmengen
    int KaffeeVorrat = 1000;
    int EspressoVorrat = 1000;
    int Wasservorrat = 5000;
    int MilchVorrat = 1000;
    int ZuckerVorrat = 500;
    
    //Benötigte Portionsmengen
    const int KaffeePortion = 5;
    const int EspressoPortion = 5;
    const int WasserKaffee = 125;
    const int WasserEspresso = 25;
    const int ZuckerPortion = 3;
    const int MilchPortion = 30;
    
    //Grundpreis
    const double Grundpreis = 1.0;
    const double Milch_Zucker = 0.2;
    const double Milchaufpreis = 0.1;
    const double Zuckeraufpreis = 0.1;
    
    //Startbildschirm
    while (true) {
    	std::cout << '\n';
    	std::cout << "Herzlich Willkommen beim Kaffee-Automaten!" << std::endl;
    	std::cout << "Preis pro Tasse :" << std::endl;
    	std::cout << "Kaffee oder Espresso:" << Grundpreis << "€" << std::endl;
    	std::cout << "Milch oder Zucker:" << Milch_Zucker << "€" << std::endl;
    	std::cout << '\n';
    	std::cout << "Bitte wählen Sie aus" << std::endl;
    	std::cout << "(k) Kaffee" << std::endl;
    	std::cout << "(e) Espresso" << std::endl;
    	std::cout << "(s) Service-Mode" << std::endl;
    
    	//Eingabe vom Kunden abwarten
    	std::cout << "Ihre Auswahl" << std::endl;
    	std::cin >> auswahl;
    
    	switch (auswahl) {
    	case  'k':
    		std::cout << "Sie haben sich f\x81r die Auswahl Kaffee entschieden" << std::endl;
    		std::cout << "Möchten Sie Zucker (j/n)?";
    		std::cin >> Zucker;
    		if (Zucker != 'j' && Zucker != 'n') {
    			std::cout << "Falsche Eingabe ";
    			break;
    		}
    
    		if (Zucker == 'j') {
    			std::cout << "Möchten Sie Milch (j/n)?";
    			std::cin >> Milch;
    			if (Milch != 'j' && Milch != 'n') {
    				std::cout << "Falsche Eingabe";
    				break;
    			}
    
    		}
    		else {
    			Milch = 'n';
    		}
    		if (Zucker != 'j' && Zucker != 'n') {
    			std::cout << "Falsche Eingabe ";
    			break;
    		}
    		if (Zucker == 'n') {
    			std::cout << "Möchten Sie Milch (j/n)?";
    			std::cin >> Milch;
    			if (Milch != 'j' && Milch != 'n') {
    				std::cout << "Falsche Eingabe";
    				break;
    			}
    		}
    		else {
    			Milch = 'n';
    		}
    
    		//Vorrat überprüfen
    		if (KaffeeVorrat >= KaffeePortion && Wasservorrat >= WasserKaffee && ZuckerVorrat >= (Zucker == 'j' ? ZuckerPortion : 0) && MilchVorrat >= (Milch == 'j' ? MilchPortion : 0)) {
    
    			//Berchnung des Grundpreis
    			
    		
    
    			std::cout << "Bitte " << getraenkPreis << "Euro eingeben und bestätigen";
    			double bezahlterBetrag;
    			std::cin >> bezahlterBetrag;
    
    			//Prüfen, ob genügend bezahlt wurde
    			if (bezahlterBetrag >= getraenkPreis) {
    				std::cout << "Ihr Getränk wird zubereitet...." << std::endl;
    				std::cout << "Bitte " << (bezahlterBetrag - getraenkPreis) << " Euro Rückgeld und das Getränk entnehmen";
    
    				// Vorratmenge reduzieren
    				KaffeeVorrat -= KaffeePortion;
    				Wasservorrat -= WasserKaffee;
    				ZuckerVorrat -= (Zucker == 'j' ? ZuckerPortion : 0);
    				MilchVorrat -= (Milch == 'j' ? MilchPortion : 0);
    			}
    			else {
    				std::cout << "Zu wenig Geld, Bestellung abgebrochen" << std::endl;
    			}
    		}
    		else {
    			std::cout << "Vorgang abgebrochen! Unzureichender Vorrat von: ";
    			if (KaffeeVorrat < KaffeePortion) std::cout << "Kaffee";
    			if (Wasservorrat < WasserKaffee) std::cout << "Wasser";
    			if (ZuckerVorrat < ZuckerPortion) std::cout << "Zucker";
    			if (MilchVorrat < MilchPortion) std::cout << "Milch";
    		}
    
    		break;
    
    	case 'e':
    		std::cout << "Sie haben sich f\x81r die Auswahl Espresso entschieden" << std::endl;
    		std::cout << "Möchten Sie Zucker (j/n)?";
    		std::cin >> Zucker;
    
    		if (Zucker == 'j') {
    			std::cout << "Möchten Sie Milch (j/n)?";
    			std::cin >> Milch;
    		}
    		else {
    			Milch = 'n';
    		}
    		if (Zucker == 'n') {
    			std::cout << "Möchten Sie Milch (j/n)?";
    			std::cin >> Milch;
    		}
    		else {
    			Milch = 'n';
    		}
    		//Vorrat überprüfen für Espresso
    		if (EspressoVorrat >= EspressoPortion && Wasservorrat >= WasserKaffee && ZuckerVorrat >= (Zucker == 'j' ? ZuckerPortion : 0) && MilchVorrat >= (Milch == 'j' ? MilchPortion : 0)) {
    			getraenkPreis = Grundpreis;
    
    
    			//Berechnung Espresso
    
    			
    
    			std::cout << "Bitte " << getraenkPreis << "Euro eingeben und bestätigen";
    			double bezahlterBetrag;
    			std::cin >> bezahlterBetrag;
    
    			//Prüfen, ob genügend bezahlt wurde
    			if (bezahlterBetrag >= getraenkPreis) {
    				std::cout << "Ihr Getränk wird zubereitet...." << std::endl;
    				std::cout << "Bitte " << (bezahlterBetrag - getraenkPreis) << " Euro Rückgeld und das Getränk entnehmen";
    
    				//Vorratsmenge überprüfen
    				EspressoVorrat -= EspressoPortion;
    				Wasservorrat -= WasserEspresso;
    				ZuckerVorrat -= (Zucker == 'j' ? ZuckerPortion : 0);
    				MilchVorrat -= (Milch == 'j' ? MilchPortion : 0);
    			}
    			else {
    				std::cout << "Zu wenig Geld, Bestellung abgebrochen" << std::endl;
    			}
    		}
    		else {
    			std::cout << "Vorgang abgebrochen! Unzureichender Vorrat von: ";
    			if (KaffeeVorrat < KaffeePortion) std::cout << "Kaffee";
    			if (Wasservorrat < WasserKaffee) std::cout << "Wasser";
    			if (ZuckerVorrat < ZuckerPortion) std::cout << "Zucker";
    			if (MilchVorrat < MilchPortion) std::cout << "Milch";
    		}
    
    
    		break;
    	case 's':
    		std::cout << "Service-Interface" << std::endl;
    		std::cout << "-------------------------------------------" << std::endl;
    		std::cout << "Noch vorhandene Mengen:" << std::endl;
    		std::cout << "Kaffee : " << KaffeeVorrat << " g   Milch: " << MilchVorrat << " ml" << std::endl;
    		std::cout << "Espresso: " << EspressoVorrat << " g   Wasser: " << Wasservorrat << " ml" << std::endl;
    		std::cout << "Zucker: " << ZuckerVorrat << " g" << std::endl;
    		std::cout << "-------------------------------------------" << std::endl;
    		std::cout << "Mengen pro Tasse :" << std::endl;
    		std::cout << "Kaffee: " << KaffeePortion << " g   Milch: " << MilchPortion << " ml" << std::endl;
    		std::cout << "Espresso: " << EspressoPortion << " g   Wasser fuer Kaffee: " << WasserKaffee << " ml" << std::endl;
    		std::cout << "Zucker: " << ZuckerPortion << " g   Wasser fuer Espresso: " << WasserEspresso << " ml" << std::endl;
    		std::cout << "-------------------------------------------" << std::endl;
    		std::cout << "Drücken Sie eine beliebige Taste . . ." << std::endl;
    		std::cin.ignore();
    		std::cin.get();
    		break;
    	default:
    		std::cout << "Falsche Eingabe!" << std::endl;
    		std::cout << "Drücken Sie eine beliebige Taste . . ." << std::endl;
    		std::cin.ignore();
    		std::cin.get();
    		continue;
    
    	}
    
    }
    
    return 0;
    

    }

    Wie kriege ich es in meinem Code hin, dass der Preis für Milch und Zucker 1.2 betragen soll und für eins von beidem 1.1 und wenn man nichts auswählt soll der Preis 1.0 betragen. Ich habe gefühlt alles, was mein Wissen beherbergt, probiert. Auch Chatgpt konnte mir nicht weiterhelfen. Hat jemand vielleicht einen Ansatz?



  • double preis = Grundpreis;
    if(Milch == 'j')
    {
         preis +=Milchaufpreis;
    }
    
    if(Zucker == 'j')
    {
         preis += Zuckeraufpreis;
    }
    

    so?



  • Hallo, danke für die schnelle Antwort.
    Nun ist es für Kaffee oder Milch definiert und für keins von beidem, aber wenn Kaffee und Milch gewünscht sind kommt immer noch der Preis von 1.1 raus.
    Gruß



  • also wenn milch und zucker gewünscht sind, dann wird der preis in zeile 4 von 1,0 um 0,1 auf 1,1 erhöht und in zeile 9 von 1,1 um 0,1 auf 1,2. so soll das doch sein, oder nicht?

    geh das mal ruhig mit dem debugger für die fälle "keine milch, kein zucker", "milch, kein zucker", "keine milch, zucker" und "milch, zucker" durch!



  • @Peter-Viehweger sagte in Preis Berechnung if-Verweigungen:

    n

    Jaa genau, das verstehe ich auch so weit, aber es sieht irgendwie danach aus dass er den Preis nicht speichert wenn man für Kaffee und Milch 'j' eingibt. Beim Debuggen stimmt alles soweit außer wenn ich für Kaffee und Milch 'j' eintippe.



  • double getraenkPreis = Grundpreis;
    if (Zucker == 'j' && Milch == 'j') {
    getraenkPreis += Milchaufpreis + Zuckeraufpreis;
    }
    else if (Zucker == 'n' || Milch == 'n') {
    getraenkPreis += Milchaufpreis;
    }

    std::cout << "Bitte " << getraenkPreis << "Euro eingeben und bestätigen";
    double bezahlterBetrag;
    std::cin >> bezahlterBetrag;

    hab auch schon so etwas ausprobiert aber das funktioniert auch nicht



  • Warum hast du es denn nicht beim richtigen Code von @Peter-Viehweger belassen?
    Dein Code würde ja immer den Milchaufpreis benutzen.

    Ansonsten zeige mal deine Ein- und Ausgabe in der Konsole (per C&P).



  • @Th69
    Da es nicht funktioniert hat, habe ich weiter probiert, aber ich bin noch nicht auf die Lösung gekommen



  • Herzlich Willkommen beim Kaffee-Automaten!
    Preis pro Tasse :
    Kaffee oder Espresso:1€
    Milch oder Zucker:0.2€

    Bitte wählen Sie aus
    (k) Kaffee
    (e) Espresso
    (s) Service-Mode
    Ihre Auswahl
    k
    Sie haben sich fr die Auswahl Kaffee entschieden
    Möchten Sie Zucker (j/n)?j
    Möchten Sie Milch (j/n)?j
    Bitte 1.1Euro eingeben und bestätigen
    das kommt aus der Konsole raus



  • Dann liegt es an etwas anderem in deinem Code.
    Ändere den Code noch mal zurück und teste es erneut (d.h. gehe mit dem Debugger nach der Eingabe Zeile für Zeile durch deinen Code).

    Edit: Warum gibst du Milch oder Zucker:0.2€ (d.h. Milch_Zucker) aus? Sollte dort nicht 0.1€ stehen?



  • @Th69 Jaa da hast du recht, danke für den Hinweis!



  • @Th69 Ich denke ich habe den Fehler gefunden, wenn ich den getraenkPreis nach Zeile 6 Ausgebe habe, werde ich schon beides gefragt ob es mit Milch und/oder Zucker sein soll, allerdings ist mein Code da ja noch nicht so weit, dass er den getraenkPreis speichert und nochmal 0.1 addiert
    double getraenkPreis = Grundpreis;
    Code:
    if (Zucker == 'j') {
    getraenkPreis += Zuckeraufpreis;
    }
    std::cout << getraenkPreis;

    Ausgabe:
    Herzlich Willkommen beim Kaffee-Automaten!
    Preis pro Tasse :
    Kaffee oder Espresso:1€
    Milch oder Zucker:0.1€

    Bitte wählen Sie aus
    (k) Kaffee
    (e) Espresso
    (s) Service-Mode
    Ihre Auswahl
    k
    Sie haben sich fr die Auswahl Kaffee entschieden
    Möchten Sie Zucker (j/n)?j
    Möchten Sie Milch (j/n)?j
    1.1

    ich hoffe man versteht was ich sagen möchte



  • Und wo steht jetzt

    if (Milch == 'j')
    {
         getraenkPreis += Milchaufpreis;
    }
    

    ?



  • @Th69
    if (Zucker == 'j') {
    getraenkPreis += Zuckeraufpreis;
    }
    std::cout << getraenkPreis;
    if (Milch == 'j') {
    getraenkPreis += Milchaufpreis;
    }
    std::cout << "Bitte " << getraenkPreis << "Euro eingeben und bestätigen";
    double bezahlterBetrag;
    std::cin >> bezahlterBetrag;

    so wäre der Abschnitt für mein Code



  • Und wenn du für Zucker und Milch jetzt jeweils j eingibst, wird nur "Bitte 1.1 Euro eingeben und bestätigen" (anstatt "1.2") ausgegeben?
    Dann überprüfe mal, ob wirklich die Abfrage sowie die Zuweisung für Milch ausgeführt wird.

    Was mir außerdem noch aufgefallen ist: deine Eingabe könntest du codetechnisch verkürzen, indem du immer nacheinander nach Zucker und Milch fragst (anstatt zweimal verschachtelt).

    Außerdem: Weißt du schon, was Funktionen (mit Parametern) sind? Dann könntest du z.B. die beiden Fälle für Kaffee und Espresso mit einer allgemeinen Funktion abdecken (anstatt wie bisher eine Codekopie zu haben).



  • @Th69 sagte in Preis Berechnung if-Verweigungen:

    Und wenn du für Zucker und Milch jetzt jeweils j eingibst, wird nur "Bitte 1.1 Euro eingeben und bestätigen" (anstatt "1.2") ausgegeben?
    Dann überprüfe mal, ob wirklich die Abfrage sowie die Zuweisung für Milch ausgeführt wird.

    Was mir außerdem noch aufgefallen ist: deine Eingabe könntest du codetechnisch verkürzen, indem du immer nacheinander nach Zucker und Milch fragst (anstatt zweimal verschachtelt).

    Außerdem: Weißt du schon, was Funktionen (mit Parametern) sind? Dann könntest du z.B. die beiden Fälle für Kaffee und Espresso mit einer allgemeinen Funktion abdecken (anstatt wie bisher eine Codekopie zu haben).

    Genau wenn ich jeweils ein j eingebe dann erscheint Bitte 1.1 Euro eingeben und bestätigen.
    Dann überprüfe mal, ob wirklich die Abfrage sowie die Zuweisung für Milch ausgeführt wird. Wie mache ich das genau ?
    und Funktionen kenne ich noch nicht.



  • Hab den Fehler gefunden. Danke für deine ganzen Antworten. Mein Fehler war das ich Milch auf n gesetzt habe davor schon. Siehe mein Ursprungscode in Zeile 58 bis 60 oder 73 bis 75.



  • Stimmt, wenn du bei Zucker j eingegeben hast, wurde Milch wieder auf 'n' gesetzt (daher auch mein Hinweis bzgl. Vereinfachung des Codes zur Eingabe).

    @xTheUhu sagte in Preis Berechnung if-Verweigungen:

    @Th69 sagte:

    Dann überprüfe mal, ob wirklich die Abfrage sowie die Zuweisung für Milch ausgeführt wird.

    Wie mache ich das genau ?
    und Funktionen kenne ich noch nicht.

    Am einfachsten mit dem Debugger deiner Entwicklungsumgebung (IDE), z.B. Visual Studio.
    Haltepunkt in die Zeile setzen und dann zeilenweise den Code durchgehen ("Step to next line") - außerdem kannst du dir dann die Variablenwerte direkt anschauen (die Maus über die Variable im Code bewegen) bzw. im Debug-Fenster ("Watch").

    Funktionen solltest du bestmöglich als nächstes lernen, denn dadurch wird dein Code viel strukturierter (und kürzer). Außerdem sollte der Code für Ein-/Ausgabe sowie Logik getrennt voneinander sein (im ersten Schritt sind dafür Funktionen ausreichend, später wirst du bei C++ noch Strukturen und Klassen kennenlernen - auch für die Datenhaltung).

    Mit welchem Buch oder Tutorial lernst du denn C++?



  • @xTheUhu sagte in Preis Berechnung if-Verweigungen:

    Beim Debuggen stimmt alles soweit außer wenn ich für Kaffee und Milch 'j' eintippe.

    da solltest du aber dringend nochmal den umgang mit dem debugger üben, das kommt normalerweise gleich nach cout << "Hello World!" << endl;


Anmelden zum Antworten