Switch anweisung



  • Hallo

    ich bin total neu hier und hoffe das ich nich im flaschen thread schreibe,
    ich habe folgendes problem, ich will mit einer Switch anweisung einen Benutzer auswählen lassen was er für ein Programm benutzen will indem ich durch die case funktion dies dann weiterleite, so sieht das bei mir aus.

    int main()
    {
        int auswahl;
    
        cout<<"Welches Program moechten sie Benutzen?.\n"
            <<"Geben Sie dazu bitte die gewuenschte Nummer ein.\n"
            <<"\n\n=======================================================\n\n"
            <<" 1. Flaechenberechnung(1)\n"
            <<" 2. Zinsrechnung wenn Zinsen jedes Jahr abgeholt werden(2)\n"
            <<" 3. Lieferungsberechnung(3)\n"
            <<" 4. Benzinverbrauch(4)\n"
            <<" 5. Volumen und Liter berechnung(5)\n"
            <<" 6. Grundrechnungen(6)\n"
            <<" 7. Jahres lohn und Monatslohn(7)\n"
            <<" 8. Abendkurse kosten(8)\n"
            <<" 9. Casino Chip gewinn insgesamt(9)\n\n"
            <<"=======================================================\n\n"
            <<"Bitte gewuenschte Nummer eingeben: ";
        cin>>auswahl;
    
        switch(auswahl)
            {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
    
            system("cls");
            cout<<"Sie haben "<<auswahl<<". gewaehlt.\n";
            system("pause");
            break;
            }
    

    Ich bin neu im Programmieren und wir brauchen das für die Schule aber nu is mein Problem das das nicht klappt, wenn ich z.B. 4 eintippe dann führt der das 1. aus und das bei jeder zahl, also die ganzen Punkte sind in dem skript mnit dabei und der kompiliert das auch wunderbar, nur dass das Programm immer nur das 1. ausführt egal was für eine Zahl eingetippt wird.
    kann mir einer sagen was ich da falsch mache? oder ob der switch script komplett falsch ist? ich poste mal Den 3. Punkt wo der case hinführen soll.

    int main3(3);
            {
            	double e, r, s, b, R, Z, S, B, erg;
    
    	        cout<<"Geben Sie den Einkaufspreis in euro ein: ";
             	cin>>e;						//Einkaufspreis
              	cout<<"Geben Sie den Lieferantenrabatt in % ein: ";
               	cin>>r;						//Rabatt
               	cout<<"Geben Sie den Lieferantenskonto in % ein: ";
               	cin>>s;						//Skonto
               	cout<<"Geben Sie die Bezugskosten in euro ein: ";
               	cin>>b;						//Bezugskosten
    
               	R=(e*r/100);                 //Lieferantenrabatt in euro
    
    	        cout<<"\nListeneinkauspreis\t"<<e;
    	        cout<<"\n-Lieferantenrabatt\t"<<R<<"\n";
    
    	        Z=e-R ;						// Zieleinkauspreis
    	        S=(Z*s/100) ;				// Lieferantenskonto
    
    	        cout<<"\nZieleinkaufspreis\t"<<Z;
    	        cout<<"\n-Lieferantenskonto\t"<<S<<"\n";
    
    	        B=Z-S;						//Bareinkaufspreis
    	        cout<<"\nBareinkaufspreis\t"<<B;
    	        cout<<"\n+Bezugskosten\t\t"<<b<<"\n";
    
    	        erg=B+b;
    
    	        cout<<"\n\n\n===================================\n";
    
    	        cout<<"Bezugspreis\t\t"<<erg<<"\n";
    
    	        system("pause");
    
    	        return 0;
             }
    

    kann schon sein, dass der Skript ewin bissl umständlich ist aber es funktioniert einzeln sehr gut und darauf bin ich erstmal stolz. 🙂
    also wenn ich jetz 3 eintippe dann funktioniert das nicht. Wenn ihr mehr informationen braucht oder den ganzen skript haben wollt sagt bitte bescheid.

    mfg Kayamoto

    ach ja ich hab mir sämtlich toturials angeschaut und werde davon echt nich schlau



  • Ich habe zwar die Problembeschreibung nicht ganz verstanden, aber dir fehlt auf jeden Fall ein break; bei jedem case, also z.B.

    switch (auswahl) {
        case 1:
            tuwas();
        break;
        case 2:
            tuwasanderes();
        break;
    }
    


  • Hallo erstmal und Willkommen im Forum,

    zuerst solltest du dir angewöhnen hier im Forum die

    Tags zu nutzen, um den Code schöner darstellen zu lassen.
    
    Deine switch Anweisung sieht so auch nicht wirklich richtig aus.
    
    Du brauchst nach jedem "case" auch ein "break", sonst wird das folgende auch ausgeführt. Außerdem sollte ein default drin stehen wenn eine falsche Auswahl getroffen wurde.
    Was du am Ende von deiner switch Anweisung reingeschrieben hast, passt da doch irgendwie nicht unter "case 9:" hin, oder?!
    
    Ein Beispiel:
    
    [cpp]
    switch(auswahl)
    {
      case 1:
        // tu was
        break;
      case 2:
        // tu was
        break;
      default:
        // sagen das die falsche auswahl getroffen wurde
    }
    


  • also die switch anweisung sieht so aus:

    int main() 
    { 
        int auswahl; 
    
        cout<<"Welches Program moechten sie Benutzen?.\n" 
        <<"Geben Sie dazu bitte die gewuenschte Nummer ein.\n" 
        <<"\n\n=======================================================\n\n" 
        <<" 1. Flaechenberechnung(1)\n" 
        <<" 2. Zinsrechnung wenn Zinsen jedes Jahr abgeholt werden(2)\n" 
        <<" 3. Lieferungsberechnung(3)\n" 
        <<" 4. Benzinverbrauch(4)\n" 
        <<" 5. Volumen und Liter berechnung(5)\n" 
        <<" 6. Grundrechnungen(6)\n" 
        <<" 7. Jahres lohn und Monatslohn(7)\n" 
        <<" 8. Abendkurse kosten(8)\n" 
        <<" 9. Casino Chip gewinn insgesamt(9)\n\n" 
        <<"=======================================================\n\n" 
        <<"Bitte gewuenschte Nummer eingeben: "; 
        cin>>auswahl; 
    
        switch(auswahl) 
        { 
        case 1:
        {
            // in diesen block rufst du nun die funktion für den 1. punkt auf bzw.
            // du schreibst hier den code für die 1. funktion hinein.
        }break;
    
        case 2: 
        {
            // ... für 2. funktion
        }break;
    
        case 3: 
        {
            // für 3.funktion
        }break;
    
        // usw.
    }
    

    also wie gesagt, du schreibst einfach in die cases deine programmteile/funktion
    hinein die du machen willst.

    ps: wenn du deinen geposteten quelltext in code-tags hineinpackst, dann ist er
    besser lesbar

    mfg Gaste



  • achso sry wegen dem post,
    also üsste ich den code immer so schreibe ndas die funktion direkt im case steht ja?
    also so hier

    switch(auswahl)
             {
                 case 1:
                 case 2:
                 case 3:
                       {
                        int main3()
                        {
                           //bla bla
                        }break;
                 case 4:
    
                 default:
                 cout<<"Falsche eingabe und so.";
               }
    

    aber siejht das dann nicht unübersichtlich aus wie sau? also die anderen skripe sind ein wenig größer.
    danke für die schnell Antwort ertsma, ich probier das jetzt mal aus.



  • bin ich besoffen? das klappt nich mit dem code Tag sry echt, ich muss doch den code markieren und dann auf C++ code gehn oder?



  • Hi,

    2. Tipps:
    - Du kannst Deine Posts editieren. Du musst nicht jedesmal einen neuen erstellen ...und das würde uns den Überblick deutlich erhöhen.
    - Du kannst beim Erstellen/Editieren eines Posts unten anklicken "BBCode in diesem Beitrag deaktivieren" .... dann werden diese Tags auch nicht ausgewertet.

    Gruß,

    Simon2.



  • achso jetz hab ich es geschnalt danke wa



  • Kayamoto schrieb:

    achso jetz hab ich es geschnalt danke wa

    👍 PEEEEEERFEKT !! 😃

    zu Deiner Frage: Nein, die Funktion muss nicht im switch/case implementiert sein (darf sie syntaktisch AFAIK sogar gar nicht).
    switch/case beeinflussen den "Kontrollfluss", d.h. legen fest, "wo das Programm weitermacht". So schreibst Du also hinter das case den Teil des Programms, der dann ausgeführt werden soll ... dazu braucht's eigentlich nicht mal Klammern:
    und es spielt dabei keine Rolle, ob da eine Funktion aufgerufen wird, eine Zuweisung stattfindet, die umgebende Funktion verlassen wird, ....

    void aeussereFunktion() {
       int x = 0;
       switch(i) {
       case 0:
          x = 4; // Zuweisung
          break; // springe "hinter" das switch -> (*)
       case 1:
          meineFunktion(); // Funktionsaufruf
          break;
       case 2:
          return; // verlässt aeussereFunktion() ... braucht kein break mehr
       case 3:
          cout << x; // Ausgeben ..
          x = x*10 % 6; // anderen Wert berechnen
          meineFunktion(); // Funktionsaufruf
          cout << "Neuer Wert: " << x << "\n"; // nochmal Ausgeben ..
          break;
       }
       cout << "Nach dem switch\n"; // (*)
    }
    

    Sprich: nach einem case kannst Du "machen, was Du willst".

    Danke,

    Simon2.



  • der Code sollte wohl eher so aussehen [edit] war auf den Code vor Simons Änderung bezogen[edit]

    switch(auswahl)
    {
      case 1: break;
      case 2: break;
      case 3: break;
      {
        main3();
        break;
      }
      case 4: break;
      default: cout<<"Falsche eingabe und so.";
    }
    


  • #include <iostream>
    #include <limits>
    
    int main()
    {
    	std::cout	<< "Welches Programm moechten sie benutzen?\n\n
    				<<"=======================================================\n" << std::endl;
    	std::size_t menu_item_count(0);
    	std::cout	<< "(" << ++menu_item_count << ") Flaechenberechnung\n"
    				<< "(" << ++menu_item_count << ") Zinsrechnung (ohne Zinseszins)\n"
    				<< "(" << ++menu_item_count << ") Lieferungsberechnung\n"
    				<< "(" << ++menu_item_count << ") Benzinverbrauch\n"
    				<< "(" << ++menu_item_count << ") Volumenberechnung\n"
    				<< "(" << ++menu_item_count << ") Taschenrechner (Grundrechenarten)\n"
    				<< "(" << ++menu_item_count << ") Jahreslohn und Monatslohn\n"
    				<< "(" << ++menu_item_count << ") Konstenplan \"Abendkurse\"\n"
    				<< "(" << ++menu_item_count << ") Casino: Gesammt Chip-Gewinn berechnen\n" << std::endl;
    	std::cout	<< "=======================================================\n" << std::endl;
    
    	std::size_t	menu_item_sel(0);
    	do {
    		std::cin.sync(); 
    		std::cin.clear(); 
    		std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    		std::cout << "Programm-Nummer: " << std::flush; 
    	} while (!(std::cin >> menu_item_sel) || menu_item_sel > menu_item_count || menu_item_sel == 0) 
    
        switch (menu_item_sel)
        {
    		case 1:
    		{
    			std::cout << "Flächenberechnung" << std::endl;
    		}break;
    		case 2:
    			{}break;
    		case 3:
    			{}break;
    		case 4:
    			{}break;
    		case 5:
    			{}break;
    		case 6:
    			{}break;
    		case 7:
    			{}break;
    		case 8:
    			{}break;
    		case 9:
    			{}break;
    		default:
    			std::cout << "Noch nicht implementiert!" << std::endl;
    	}
    }
    


  • also ich habe jetz in jedem case eine funktion reingepackt die ausgeführt werden soll und nu is das unübersichtlich wie sau aber es funktionier einwandfrei.

    Bei dem Skript seh ich erst recht nicht durch aber ok es funktioniert jetz, ich mach da ausreichend kommentare rein und dann wird das schon

    danke für eure hilfe. 👍



  • (D)Evil schrieb:

    case 1: {
    ...
    

    die ganze Klammerei verwirrt IMHO erstmal nur.
    Sobald man den Scope braucht, kann man das ja immer noch machen...

    Kayamoto schrieb:

    ..nu is das unübersichtlich wie sau ....

    Also eigentlich erhöhen switches die Übersichtlichkeit eher ... zeig doch mal einen Ausschnitt, dann können wir evtl. noch ein paar Tipps geben und Du gewinnst mit der Übersichtlichkeit auch noch Verständnis Deines Codes.

    Gruß,

    Simon2.

    P.S.: In C++ nennt eigentlich niemand sein "Programm" "Script" ... Letzteres suggeriert "klein", "zur Laufzeit interpretiert", "Bestandteil anderer Software", ....



  • also zwei anweisung sehen bei mir jetz so aus

    //Lieferungsberechnung     
            case 3:
                  int main3();
                  {
                       system("cls");
            	       double e, r, s, b, R, Z, S, B, erg;
    
            	       cout<<"\nMit diesem Programm koennen Sie Bezugspreis nach der\n"
            	           <<"Lieferung errechnen.\n";
    	               cout<<"Geben Sie den Einkaufspreis in euro ein: ";
             	       cin>>e;						//Einkaufspreis
              	       cout<<"Geben Sie den Lieferantenrabatt in % ein: ";
               	       cin>>r;						//Rabatt
               	       cout<<"Geben Sie den Lieferantenskonto in % ein: ";
              	       cin>>s;						//Skonto
                   	   cout<<"Geben Sie die Bezugskosten in euro ein: ";
                       cin>>b;						//Bezugskosten
    
               	       R=(e*r/100);                 //Lieferantenrabatt in euro
    
               	       cout<<"\n\n===================================\n";
    	               cout<<"\nListeneinkauspreis\t"<<e;
    	               cout<<"\n-Lieferantenrabatt\t"<<R<<"\n";
    
    	               Z=e-R ;						// Zieleinkauspreis
    	               S=(Z*s/100) ;				// Lieferantenskonto
    
    	               cout<<"\nZieleinkaufspreis\t"<<Z;
    	               cout<<"\n-Lieferantenskonto\t"<<S<<"\n";
    
    	               B=Z-S;						//Bareinkaufspreis
    	               cout<<"\nBareinkaufspreis\t"<<B;
    	               cout<<"\n+Bezugskosten\t\t"<<b<<"\n";
    
    	               erg=B+b;
    
    	               cout<<"\n\n\n===================================\n";
    
    	               cout<<"Bezugspreis\t\t"<<erg<<"\n";
    
    	               system("pause");
    
    	               return 0;
                   }break;
    
            //Benzinverbrauch berechnung
            case 4:
                  int main4();
                  {
                        system("cls");
                        double lt, t, l, K, V;
    
                        cout<<"\nDies ist ein Program in dem Sie ihren Benzinverbauch von 100 km,\n"
                            <<"anhand des km-stands des letzten Tankens und den km-stand\n"
                            <<"beim naechsten Tankens und die getankten Liter, berechnet,\n"
                            <<"wenn der Tank beim letzten Tanken voll gefuellt wurde und dies\n"
                            <<"auch beim naechsten Tanken geschieht.\n\n"
                            <<"Geben Sie bitte nun den km-stand des letzten Tankens in km ein: ";
                        cin>>lt;
                        cout<<"\nGeben Sie bitte nun den km-stand des naechsten Tankens in km ein: ";
                        cin>>t;
                        cout<<"\nGeben Sie nun den Benzinverbaruch zwischen den Tankens in Liter ein: ";
                        cin>>l;
    
                        K=t-lt;
                        V=(l/K)*100;
    
                        cout<<"\n\n=========================================================================\n\n\n";
                        cout<<"Durch die gefahrene Strecke von "<<K<<"km, wurde ein Benzinverbrauch\n"
                            <<"von "<<V<<" l auf 100 km berechnet.\n\n";
                        system("pause");
                        return 0;
                     }break;
    

    und das find ich unübersichtlich.
    ich hab auch gehört das man in der case funktion eine anweisung geben kann wo dann die jeweilige funtion in einem anderen abschnitt ausgeführt wird. Soll ich vor der Funktion ein Label setzen und dann den Befehl goto Label; benutzen?



  • Ich glaube, was dir alle versuchen klarzumachen, ist, dass Du die Funktionen nicht in den switch/case packen sollts:

    void Lieferungsberechnung();
    
    int main() 
    { 
    	int auswahl; 
    
    	cout << "Welches Program moechten sie Benutzen?.\n" 
    		  << "Geben Sie dazu bitte die gewuenschte Nummer ein.\n" 
    		  << "\n\n=======================================================\n\n" 
    		  << " 1. Flaechenberechnung(1)\n" 
    		  << " 2. Zinsrechnung wenn Zinsen jedes Jahr abgeholt werden(2)\n" 
    		  << " 3. Lieferungsberechnung(3)\n" 
    		  << " 4. Benzinverbrauch(4)\n" 
    		  << " 5. Volumen und Liter berechnung(5)\n" 
    		  << " 6. Grundrechnungen(6)\n" 
    		  << " 7. Jahres lohn und Monatslohn(7)\n" 
    		  << " 8. Abendkurse kosten(8)\n" 
    		  << " 9. Casino Chip gewinn insgesamt(9)\n\n" 
    		  << "=======================================================\n\n" 
    		  << "Bitte gewuenschte Nummer eingeben: "; 
    
    	cin>>auswahl; 
    
    	switch(auswahl) 
    	{ 
    		case 1: 
    			Flaechenberechnung();
    		break;
    
    		case 2: 
    			Zinsrechnung();
    		break;
    
    		case 3: 
    			Lieferungsberechnung();
    		break;
    
    		case 4: 
    			Benzinverbrauch();
    		break;
    
    		case 5: 
    			Volumen();
    		break;
    
    		case 6: 
    			Grundrechnungen();
    		break;
    
    		case 7: 
    			Lohn();
    		break;
    
    		case 8: 
    			Abendkurse();
    		break;
    
    		case 9:
    			Gewinn();
    		break;
    
    		default:
    			cout << "Falsche Eingabe" << endl;
    		break; 
    	}
    
    	return 0;
    }
    
    void Lieferungsberechnung()
    {
    	system("cls"); 
    	double e, r, s, b, R, Z, S, B, erg; 
    
    	cout << "\nMit diesem Programm koennen Sie Bezugspreis nach der\n" 
    	<< "Lieferung errechnen.\n"; 
    	<< "Geben Sie den Einkaufspreis in euro ein: "; 
    	cin >> e; // Einkaufspreis 
    	cout << "Geben Sie den Lieferantenrabatt in % ein: "; 
    	cin >> r;                        //Rabatt 
    	cout<<"Geben Sie den Lieferantenskonto in % ein: "; 
    	cin>>s;                        //Skonto 
    	cout<<"Geben Sie die Bezugskosten in euro ein: "; 
    	cin>>b;                        //Bezugskosten 
    
    	R=(e*r/100);                 //Lieferantenrabatt in euro 
    
    	cout<<"\n\n===================================\n"; 
    	cout<<"\nListeneinkauspreis\t"<<e; 
    	cout<<"\n-Lieferantenrabatt\t"<<R<<"\n"; 
    
    	Z=e-R ;                        // Zieleinkauspreis 
    	S=(Z*s/100) ;                // Lieferantenskonto 
    
    	cout<<"\nZieleinkaufspreis\t"<<Z; 
    	cout<<"\n-Lieferantenskonto\t"<<S<<"\n"; 
    
    	B=Z-S;                        //Bareinkaufspreis 
    	cout<<"\nBareinkaufspreis\t"<<B; 
    	cout<<"\n+Bezugskosten\t\t"<<b<<"\n"; 
    
    	erg=B+b; 
    
    	cout<<"\n\n\n===================================\n"; 
    
    	cout<<"Bezugspreis\t\t"<<erg<<"\n"; 
    }
    

    Die restlichen Funktionen sind natürlich noch zu ergänzen.



  • achsoooooo geht das, na das is doch ma geil,genau das wollte ich wissen. danke man. 😃 😃


Log in to reply