probleme mit switch



  • Hi
    wir haben die aufgabe in Informatik bekommen ein programm mit einem switch zu schreiben.

    Der programm teil mit dem switch sieht folgendermaßen aus:

    switch (a)
     {
    		case '1': b=1;"\n\n"; break;
    		case '2': b=2;"\n\n"; break;
    		case '3': b=3;"\n\n"; break;
    		case '4': b=4;"\n\n"; break;
    		case '0': return;
    		default : b=0;
    }
    if (b==0)
    {cout<<"Falsche eingabe";
    system ("cls");
    continue;
    break;
    

    dann nach kommt eine Variablen eingabe (cin>>) wenn ich jetzt aber für a (switch) eine mehr stelligezahl eingebe, benutzt er die erste für die caseauswahl die zweite fügt er als erste variableneingabe ein. wie kann ich das verhindern. und wenn ich zb für a "99999999992" eingebe öffnet er dann den case 2 wie kann ich das verhindern.

    wäre überragend wenn mir da jemand weiterhelfen könnte.



  • Zum einen...poste den ganzen Code...
    Lass mich raten...a ist ein character?
    was sollen die "\n\n" ?
    Verwende Klammern {}
    Was soll continue; break; ?
    Wozu brauchst du b? - du könntest direkt if(a==DefaultCase) verwenden

    Nimm doch einfach einen Integer (int) statt char



  • Kuldren schrieb:

    Verwende Klammern {}

    Nicht nötig innerhalb von switch -Blöcken. Trägt auch nicht unbedingt zur Steigerung der Übersicht bei...



  • Nexus schrieb:

    Kuldren schrieb:

    Verwende Klammern {}

    Nicht nötig innerhalb von switch -Blöcken. Trägt auch nicht unbedingt zur Steigerung der Übersicht bei...

    Ist mir klar und finde ich schon.
    Klammern tragen immer zur Übersicht bei



  • Kuldren schrieb:

    Ist mir klar und finde ich schon.

    Eben, es ist eher Geschmackssache. Deshalb sollte man es auch nicht anderen vorschreiben. 😉

    Tatsache ist, dass geschweifte Klammern in switch -Blöcken nicht erforderlich sind. Ob man sie dennoch macht, ist einem selbst überlassen.



  • Nexus schrieb:

    Kuldren schrieb:

    Ist mir klar und finde ich schon.

    Eben, es ist eher Geschmackssache. Deshalb sollte man es auch nicht anderen vorschreiben. 😉

    Tatsache ist, dass geschweifte Klammern in switch -Blöcken nicht erforderlich sind. Ob man sie dennoch macht, ist einem selbst überlassen.

    Übersicht sollte in der Programmierung aber eine allgemeine Definition haben. Deshalb sollte man sich an gewisse Richtlinien halten, damit einem bei Schwierigkeiten besser geholfen werden kann. 🙂



  • root2k schrieb:

    Übersicht sollte in der Programmierung aber eine allgemeine Definition haben. Deshalb sollte man sich an gewisse Richtlinien halten, damit einem bei Schwierigkeiten besser geholfen werden kann. 🙂

    Allgemein stimmt das natürlich schon.

    Aber was willst du damit sagen? Dass der Einsatz von geschweiften Klammern innerhalb von switch eine solche Richtlinie ist, die es anderen erleichtert, einem zu helfen? Ich hoffe nicht.



  • Nein, keine Angst, ich wollte nur eine allgemeine Aussage treffen, die für den ein oder anderen vielleicht sehr wichtig sein könnte. 😉

    Allerdings sind mir beim groben Drüberschauen im obigen Codeschnipsel schon mehrere Fehler aufgefallen.

    1. Escape-Sequenzen ("\n") kannst du nur in Verbindung mit Ausgabefunktionen benutzen. (z.B. cout << "\n"; ... alternativ: cout << endl;)

    2. Was soll das continue; und das break; nach dem CLearScreen-Befehl?

    3. Entweder du lässt hier die geschwungene Klammer ganz weg, oder fügst noch eine geschlossene nach dem Semikolon ein. Achtung! Die Klammern kannst du nur komplett weglassen, wenn die Kontrollstruktur anschließend eine einzige Zeile verarbeiten muss.

    if (b==0) cout << "Falsche Eingabe";
    


  • Gerade in dem Fall ist es wichtig Klammern zu setzen...
    Wen ner mal ne Schleife in einem case drin hat und dann per break; rausspringt aber bei der schleife selbst vergessen hat klammern zu setzen wird da vermutlich blödsinn herauskommen.



  • Kuldren schrieb:

    Wen ner mal ne Schleife in einem case drin hat und dann per break; rausspringt aber bei der schleife selbst vergessen hat klammern zu setzen wird da vermutlich blödsinn herauskommen.

    Wieso sollte man bei der Schleife vergessen, Klammern zu setzen? Dann würde ja sowieso nur eine Anweisung in der Schleife stehen. Ausserdem ging es nicht um Schleifen, sondern geschweifte Klammern bei case -Marken.

    Abgesehen davon sind Schleifen innerhalb von switch -Blöcken bereits ein Hinweis darauf, dass man in Funktionen auslagern könnte.



  • Nexus schrieb:

    Kuldren schrieb:

    Wen ner mal ne Schleife in einem case drin hat und dann per break; rausspringt aber bei der schleife selbst vergessen hat klammern zu setzen wird da vermutlich blödsinn herauskommen.

    Wieso sollte man bei der Schleife vergessen, Klammern zu setzen? Dann würde ja sowieso nur eine Anweisung in der Schleife stehen. Ausserdem ging es nicht um Schleifen, sondern geschweifte Klammern bei case -Marken.

    Abgesehen davon sind Schleifen innerhalb von switch -Blöcken bereits ein Hinweis darauf, dass man in Funktionen auslagern könnte.

    Ne

    Bei sowas

    case xy: for(int z=0;z<=10;z++)t++; if(t=5)break;x--;break;
    

    (ja ... is ein schlechtes beispiel)
    würde ich Klammern generell verwenden.
    Und extra eine Funktion für die loop zu schreiben wäre überflüssig.



  • Kuldren schrieb:

    case xy: for(int z=0;z<=10;z++)t++; if(t=5)break;x--;break;
    

    (ja ... is ein schlechtes beispiel)

    Ja, und wie. So schreibt keiner eine Schleife, schon gar nicht auf einer Zeile.

    Kuldren schrieb:

    Und extra eine Funktion für die loop zu schreiben wäre überflüssig.

    Wie du meinst. So wird der switch -Block nämlich aufgebläht und unübersichtlich.

    Aber so langsam hab ich sowieso das Gefühl, das bringt hier nichts. Ich muss mich ständig wiederholen, dabei ging es doch nur darum, dass geschweifte Klammern nach case -Marken überflüssig seien. Und du versuchst nun, mit weit hergeholten Argumenten wie Schleifen das Gegenteil zu beweisen. Naja...



  • Woher willst du wissen dass keiner eine Schleife so anschreiben würde?
    Ich habs grad getan...Also wohl kaum "keiner"

    Außerdem finde ich

    case xy:{
        // foo();
        // bar();
        break;
    }
    

    übersichtlicher als

    case xy:
        // foo();
        // bar();
        break;
    

    Und selbst wenn man das oben genannte Beispiel mit der Schleife nicht in einer Zeile anschreiben würde könnte es trotzdem Verwirrung schaffen.
    Durch die Klammern hat man bei einer größeren Verzweigung mehr Orientierung



  • Nexus schrieb:

    Abgesehen davon sind Schleifen innerhalb von switch -Blöcken bereits ein Hinweis darauf, dass man in Funktionen auslagern könnte.

    Nicht immer. Wenn ich unter einer case -Marke eine Hilfsvariable brauche, nehm' ich gerne einen Block, anstatt die im übrigen Kontext unnütze Variable mitzuschleppen. In eine Funktionen auslagern kann man fast alles - Aus einem aus og. Grund eingeführten Block, der Code beinhält, der nicht universell wiederverwendbar ist, eine Funktion zu machen, nur weil's ein Block ist, bringt's ned wirklich.

    cheers, Swordfish


Log in to reply