Switch Anweisung nicht verlassen



  • Servs zusammen,

    hab folgendes Problem:

    /*
     *	Beispiel für switch anhand der vier Grundrechenanrten
     */
    #include<iostream>
    using namespace std;
    
    int main()
    {
    	float zahl_1, zahl_2, erg;
    	char wahl;
    
    	cout << "\n\n*** Rechner ***\n\n";
    	cout << "Bitte die erste Zahl eingeben: ";
    	cin >> zahl_1;
    	cout << "Bitte die zweite Zahl eingeben: ";
    	cin >> zahl_2;
    	cout << "\nBitte waehlen Sie: <a>ddieren\n"
    		 << "\t\t   <s>ubtrahieren\n"
    		 << "\t\t   <m>ultiplizieren\n"
    		 << "\t\t   <d>ividieren\n";
    	cin >> wahl;
    
    	switch(wahl)
    	{
    		case 'a': erg = zahl_1 + zahl_2;
    				  cout << "Ergebnis: " << zahl_1 << " + " << zahl_2 << " = " << erg << endl;
    				  break;
    		case 's': erg = zahl_1 - zahl_2;
    				  cout << "Ergebnis: " << zahl_1 << " - " << zahl_2 << " = " << erg << endl;
    				  break;
    		case 'm': erg = zahl_1 * zahl_2;
    			      cout << "Ergebnis: " << zahl_1 << " * " << zahl_2 << " = " << erg << endl;
    				  break;
    		case 'd': if(zahl_2 == 0)
    					  cout << "Ich mag heute nicht durch null dividieren!";
    				  else
    				  {
    					  erg = zahl_1 / zahl_2;
    					  cout << "Ergebnis: " << zahl_1 << " / " << zahl_2 << " = " << erg << endl;
    				  }
    				  break;
    		default : cout << "Wer nicht will, der hat schon mal!\n\n";
    	}
    
    	return 0;
    }
    

    Nun will ich das wenn er mir ein Ergebnis ausspuckt, er mir trotzdem die Möglichkeit bietet eine andere Grundrechenart durchzuführen. Auf gut Deutsch, er soll die Switch Anweisung nicht verlassen, sondern nach jedem abgearbeitetem Case die Switch Anweisung nochmal ausführen 😉
    Ich hab versucht die breaks mit continue zu ersetzen, doch da hat mir mein Compiler folgendes erzählt: Schluesselwort 'continue' ungueltig
    Wieso will er es nicht annehmen ? Bzw. wie kann ich an mein Ergebnis kommen ?

    Bin wie immer über zahlreiche Antworten sehr dankbar 😉

    Xecutor



  • Wie wäre es mit einer while-Schleife?

    Wenn du das ganze auch noch in andere Funktionen auslagerst, wirds auch noch "schön".



  • Danke dir Artchi,
    wusste ich es doch das ich einen Denkfehler hatte *g*
    Hier der überarbeitete Code:

    /*
     *	Beispiel für switch anhand der vier Grundrechenanrten
     */
    #include<iostream>
    using namespace std;
    
    int main()
    {
    	float zahl_1, zahl_2, erg;
    	char wahl;
    	bool rechnen = true;
    
    	cout << "\n\n*** Rechner ***\n\n";
    	cout << "Bitte die erste Zahl eingeben: ";
    	cin >> zahl_1;
    	cout << "Bitte die zweite Zahl eingeben: ";
    	cin >> zahl_2;
    
    	while(rechnen)
    	{
    			cout << "\nBitte waehlen Sie: <a>ddieren\n"
    			 << "    \t\t   <s>ubtrahieren\n"
    			 << "    \t\t   <m>ultiplizieren\n"
    			 << "    \t\t   <d>ividieren\n"
    			 << "	 \t   <b>eenden\n";
    		cin >> wahl;
    
    		switch(wahl)
    		{
    			case 'a': erg = zahl_1 + zahl_2;
    					  cout << "Ergebnis: " << zahl_1 << " + " << zahl_2 << " = " << erg << endl;
    					  break;
    			case 's': erg = zahl_1 - zahl_2;
    					  cout << "Ergebnis: " << zahl_1 << " - " << zahl_2 << " = " << erg << endl;
    					  break;
    			case 'm': erg = zahl_1 * zahl_2;
    					  cout << "Ergebnis: " << zahl_1 << " * " << zahl_2 << " = " << erg << endl;
    					  break;
    			case 'd': if(zahl_2 == 0)
    						  cout << "Ich mag heute nicht durch null dividieren!";
    					  else
    					  {
    						  erg = zahl_1 / zahl_2;
    						  cout << "Ergebnis: " << zahl_1 << " / " << zahl_2 << " = " << erg << endl;
    					  }
    					  break;
    			case 'b': rechnen = false;
    					  break;
    			default : cout << "Wer nicht will, der hat schon mal!\n\n";
    		}
    	}
    
    	return 0;
    }
    

    Aber sag mal was meinst du mit "Wenn du das ganze auch noch in andere Funktionen auslagerst, wirds auch noch "schön"." ?

    Xecutor



  • er meint, dass du dein programm ein wenig mehr unterteilen solltest, z.b. so:
    aus

    _asm_main:
    	enter   0, 0
    	pusha
    
            mov     augen, nextPost ; im nächsten post
    
    	popa
    	mov     eax, 0
    	leave
    	ret
    

    dann hast am ende vielleicht mehrere funktion, die passen aber alle auf eine (bildschirm-)seite, und sind so leichter verständlich. zusätzlich wird die fehlersuche erleichtert.

    mfg



  • /*
     *	Beispiel für switch anhand der vier Grundrechenanrten
     */
    #include<iostream>
    using namespace std;
    
    void zahl(float *a, float *b)
    {
       	cout << "\n\n*** Rechner ***\n\n";
    	cout << "Bitte die erste Zahl eingeben: ";
    	cin >> *a;
    	cout << "Bitte die zweite Zahl eingeben: ";
    	cin >> *b;
    }
    
    char waehlen(void)
    {
       cout << "\nBitte waehlen Sie: <a>ddieren\n";
       cout << "    \t\t   <s>ubtrahieren\n";
       cout << "    \t\t   <m>ultiplizieren\n";
       cout << "    \t\t   <d>ividieren\n";
       cout << "	\t   <b>eenden\n";
       char c; // was für ein m*st! aber ich wollte es ja in funktionen unterteilen...
       cin >> c;
     return c;
    }
    
    int main()
    {
    	float zahl_1, zahl_2, erg;
    	zahl(&zahl_1, &zahl_2);
    
            char wahl;
    
    	while(true)
    	{
                    wahl = waehlen();
    		switch(wahl)
    		{
    			case 'a': erg = zahl_1 + zahl_2;
    					  cout << "Ergebnis: " << zahl_1 << " + " << zahl_2 << " = " << erg << endl;
    					  break;
    			case 's': erg = zahl_1 - zahl_2;
    					  cout << "Ergebnis: " << zahl_1 << " - " << zahl_2 << " = " << erg << endl;
    					  break;
    			case 'm': erg = zahl_1 * zahl_2;
    					  cout << "Ergebnis: " << zahl_1 << " * " << zahl_2 << " = " << erg << endl;
    					  break;
    			case 'd': if(zahl_2 == 0)
    						  cout << "Ich mag heute nicht durch null dividieren!";
    					  else
    					  {
    						  erg = zahl_1 / zahl_2;
    						  cout << "Ergebnis: " << zahl_1 << " / " << zahl_2 << " = " << erg << endl;
    					  }
    					  break;
    			case 'b': return 0;
    			default : cout << "Wer nicht will, der hat schon mal!\n\n";
    		}
    	}
    
    	return 0;
    }
    

    so, fertig 😉

    mfg



  • Danke dir terraner für Antwort und Source 😉

    Das mit dem Unterteilen ist aber nur sinnvoll wenn man an größeren Projekten arbeitet oder sehe ich das falsch ?
    Weil für diese simple Aufgabe den Code gleich so aufzupuschen, ich weiß ja nicht oder gehört dieses Unterteilen zum guten Programmierstil ?

    Xecutor



  • bei so kleinen programmen kann man das kurz mal vergessen, aber ansonsten sollte man es oft einsetzen, unter anderem auch weil alle veriablen beim verlassen der funktion zerstört werden. weiterhin hat man dann viele kleine programm teile, die man leicht integrieren bzw rausschmeissen kann (trifft zwar mehr auf klassen und templates zu, aber egal).

    mfg



  • @xecuter ja das ist guter programmierstil,und nicht nur das, der code ist wiederverwendbar und noch oben drauf übersichtlich

    @terraner und nu erklär mir mal was der asm hier zu suchen hat^^


Anmelden zum Antworten