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 der Einwerfen Funktion liest du dann in einen int während im Eingabestrom noch das Ksteht. Das mag cin beim Lesen in einen int aber nicht.
    Du könntest im Hauptmenü in einen string lesen, dann landen alle Zeichen des Eingabestroms im string und er ist leer, wenn du den int 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' :
             ...
       }
    }
    

Log in to reply