Wie beende ich zwei select-cases / for-schleife richtig?



  • Hallo,

    ich möchte in einer Funktion mehrere Benutzereingaben in einer Switch-Case Auswahl abfangen und diese verarbeiten. Wie löse ich das Problem, dass in einer Funktion zwei Switch-Cases zu funktionieren haben und beide mit einer for-Schleife so lange ausgeführt werden, bis eine 4 bei der ersten Auswahl, oder eine 3 bei der zweiten Auswahl gedrückt wird?

    void Benutzereingabe1(MeinDatenTyp & MeinStruct, MeinZweiterDatentyp & MeineZweiterStrukt)
    {
    	int                          Auswahl = 0;
    	int                          AuswahlZwei = 0;
    
    	for (Auswahl = 0; Auswahl < 3; Auswahl ++)
    	{
    		cin >> Auswahl;
    
    		if (Auswahl != 1 && Auswahl != 2 && Auswahl != 3)
    		{
    			printf("Nur Zahlen von 1 bis 4 eingeben: \n");
    			break;
    		}
    
    		switch (Auswahl)
    		{
    		case 1:
    //Mach etwas
    			cin >> AuswahlZwei;
    			//TODO: Errorhandling iChoiceEditor
    
    			switch (AuswahlZwei)
    			{
    			case 1:
    				printf("eins");
    				//funktion1();
    				break;
    			case 2:
    				printf("zwei");
    				//funktion2();
    				break;
    			case 3:
    				printf("drei");
    				//funktion3();
    				break;
    			default:
    				printf("Nur 1,2 oder 3 eingeben!");
    				//no break
    			}
    			break;
    
    		case 2:
    			for (;;)
    			{
    				funktion4();
    					continue;
    				}
    				break;
    			}
    			funktion5();
    			break;
    		case 3:
    			printf("Wird beendet!");
    			break;
    
    		default:
    			printf("Nur 1 bis 4 moeglich.");
    			// no break
    		}
    		printf("\n Eine beliebige Taste druecken um weiterzumachen.\n");
    	}
    }
    


  • Do one thing and one thing right.

    Deine Funktion tut mehrere Dinge: Eingabe, Bereichsprüfung, Verarbeitung 1. Eingabe, dito 2. Eingabe, Endlosschleife (waaah) usw.
    Trenne das Ganze erstmal in mehrere Funktionen, die EINE Sache richtig machen. Dann kriegt das mehr Struktur.



  • Wenn Du diese Funktion durch 'nen Compiler bekomnmst, wirf ihn weg.

    Die Zeile 49 schließt die Klammer in Zeile 46.

    Die Zeile 51 schließt daher die Klammmer in Zeile 17

    Die Zeilen 54 und 58 sind deshalb außerhalb eines switch und daher nicht zulässig.

    Die Zeile 64 hat kein Gegenstück und ist daher auch unzulässig.

    Von 45 bis 49 hat Du eine Endlosschleife, des Rest des Caseblocks ist daher unnötig. Das continue am Ende der Schleife ist ebenfalls unnötig.

    Ansonsten schließe ich mich minastaros' Anmerkungen an.

    mfg Martin



  • Um Deine Frage zu beantworten, Nachtrag:

    Ein break beendet immer nur die direkt umschließende Schleife/Switch-statement. Mehrere geschachtelte Schleifen/switches zu beenden ist mit einem break nicht möglich. Zu Lösung gibt es mehrere Möglichkeiten:

    1. Du definierst eine Fehlervariable, die Du an geeigneter Stelle überprüfst:

    bool errFlag = false;
    
    for( xyz )
    {
        for( abc )
        {
            if( irgendwas )
            {
                 errFlag = true;
                 break;
            }
        }
        if( errFlag )
            break;
    
        blabla;
    }
    

    2. Du wirfst eine Exception:

    try
    {
        for( xyz )
        {
            for( abc )
            {
                if( irgendwas )
                     throw true;
            }
    
            blabla;
        }
    }
    catch( ... )
    {
    }
    

    3. Du benutzt einen Sprung (Aber nur, wenn Performanz ein Problem darstellt):

    for( xyz )
    {
        for( abc )
        {
            if( irgendwas )
                 goto errExit;
        }
    
        blabla;
    }
    errExit:
    

    mfg Martin



  • goto für break2 halte ich für weniger verwerflich als die künstliche variable und beides ist um lichtjahre weniger verwerlich als eine reine kontrollflussexception.

    normalerweise kann man die innere schleife rauslösen und mit gutem namen und eigenem zweck (wichtig!) in eine funktion auslagern und irgendwie verschwindet das problem (man sieht die variable nicht mehr).



  • volkard schrieb:

    goto für break2 halte ich für weniger verwerflich als die künstliche variable und beides ist um lichtjahre weniger verwerlich als eine reine kontrollflussexception.

    Das ist auch der einzige Fall, wo ich ein goto akzeptiere.

    volkard schrieb:

    normalerweise kann man die innere schleife rauslösen und mit gutem namen und eigenem zweck (wichtig!) in eine funktion auslagern und irgendwie verschwindet das problem (man sieht die variable nicht mehr).

    Das wiederum ist meistens die beste Lösung.

    mfg Martin


Log in to reply