Snackmaster 3000 sucht Unterstützung
-
Hallo Liebe Community,
Ich habe ein Problem mit meinem geschriebenen "Snackautomaten Programm" und hoffe einer von euch hat hier eine Idee.
Sobald ich bei der Auswahl des Snacks z.B. "t5 oder tk" schreibe stürzt das Programm ab, bzw. bei t5 nimmt er die Auswahl "twix" springt aus dem Switch Statement raus und nimmt direkt die 5 als 5 Eurocent, ich möchte aber das in dem ersten schritt nur die Auswahl des Snacks stattfindet und jede Eingabe die von dem Switch Cases abweicht zu einer Fehlermeldung führt. Bei der Eingabe von "tk" also twix und kitkat hängt sich das Programm aktuell komplett auf.
Ich hoffe einer von euch hat eine Lösung dazu und kann mir bitte helfen.
(PS: Ja ich bin absoluter Beginner was das Programmieren angeht, also bitte nicht zu hart ins Gericht ziehen. ;D)
#include <iostream> using namespace std; void Einwerfen( int Betrag ) { int geld ; int Summe; cout << "Bitte werfen Sie den entsprechenden Betrag in Muenzen ein "<< endl; cout << "Es werden nur 5, 10, 20 und 50 Cent Muenzen angenommen!" << endl << endl; do { cout << "Fehlender Betrag: " << Betrag - Summe << " Eurocent " << endl; cout << "==>"; cin >> geld; if( ( geld != 5 ) && ( geld != 10 ) && ( geld != 20 ) && ( geld != 50 ) ) cout << "\nBetrag entspricht nicht den Vorgaben!\nBitte werfen Sie nur passende Muenzen ein!" << endl; else Summe += geld; } while( Summe < Betrag ); if( Summe > Betrag ) cout << "\n\nIhr Rueckgeld betraegt " << Summe - Betrag << " Eurocent. " << endl; cout << endl << "Guten Appetit" << endl; } int main(int argc, char* argv[]) { char c , p , m , k , e ; char eingabe; cout <<"***************************************" << endl; cout <<"********** Snackmaster 3000 ***********" << endl; cout <<"***************************************" << endl << endl << endl; cout << "Sie haben folgende Snacks zur Auswahl... " << endl; cout << endl; cout << " |" << endl; cout << " V" << endl; cout << endl; cout << "( s ) fuer Snickers " << endl; cout << "( m ) fuer Mars" << endl; cout << "( b ) fuer Bounty" << endl; cout << "( t ) fuer Twix " << endl; cout << "( k ) fuer KitKat" << endl; cout << endl << endl; cout << "Bitte waehlen Sie einen Snack aus... " << endl << endl; cout << "==> "; cin >> eingabe; cout << endl; switch (eingabe) { case 's': cout << "Dieser Artikel kostet 150Eurocent" << endl << endl; Einwerfen( 150 ); break; case 'm': cout << "Dieser Artikel kostet 130 Eurocent" << endl << endl; Einwerfen( 130 ); break; case 'b': cout << "Dieser Artikel kostet 120 Eurocent" << endl << endl; Einwerfen( 120 ); break; case 't': cout << "Dieser Artikel kostet 140 Eurocent" << endl << endl; Einwerfen( 140 ); break; case 'k': cout << "Dieser Artikel kostet 110 Eurocent" << endl << endl; Einwerfen( 110 ); break; default: cout << "Falsche Auswahl getroffen!!!" << endl; } return 0; }
-
Du liest die Eingabe in einen
char
, d.h. bei einer Eingabe von "TK" steht 'T' in deiner Eingabe und das 'K' steht noch ungelesen im Eingabstrom. In derEinwerfen
Funktion liest du dann in einenint
während im Eingabestrom noch dasK
steht. Das magcin
beim Lesen in einenint
aber nicht.
Du könntest im Hauptmenü in einenstring
lesen, dann landen alle Zeichen des Eingabestroms im string und er ist leer, wenn du denint
lesen möchtest.
-
hab das angepasst, jetzt erkennt das Programm aber nicht mehr die Auswahl von "nur" t.
hatte auch versucht die Eingabe als int wert einzulesen aber da macht die switch operation nicht mit und spuckt ne fehlermeldung beim kompilieren aus.
Aber immerhin stürzt es nicht mehr ab, wenn ich es als string einlese
-
switch
funktioniert mit strings nicht, das ist richtig. Du willst dir aber ja auch nicht den ganzen string angucken, sondern nur das erste Zeichen:char choose_product() { std::string input; getline( std::cin, input ); if( input.size() == 1 ) { // Kleinbuchstaben zurückgeben return std::tolower( input[0] ); } return 0; } int main() { char const choice = choose_product(); switch( choice ) { case 's' : ... } }