Du bist nicht angemeldet.

Werbeanzeige

hellea

Frischling

  • »hellea« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Bayern

  • Private Nachricht senden

1

17.08.2016, 17:01

for Schleife mit Bool Variable

Hallo Zusammen,
hoffentlich könnt Ihr mir bei einem kleinem Problem helfen.
Ich wollte für das Listing 3.3 aus dem Buch eine kleine Eingabe Fehler Schleife einbauen die so lange läuft bis eine korrekte Eingabe gemacht wird.
Allerdings läuft diese nur 2mal und springt dann weiter oder läuft unendlich weiter egal ob ich eine richtige Eingabe mache oder nicht...

Hier der Codeauszug:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//Variablen deklarieren Namen und Datentyp zuweisen
    //
    int SpielerAnzahl;
    char chSpielmodus;

    // Spieler Anzahl Abfrage
    cout << "Bitte geben Sie die Anzahl der Spieler ein." << endl;
    cin >> SpielerAnzahl;


        for (; SpielerAnzahl == 0;)
        {
            cout << "Falsche Eingabe" << endl;
            cout << "Bitte geben Sie eine gueltige Spieleranzahl ein" << endl;
            cin >> SpielerAnzahl;
        }
if (SpielerAnzahl == 1)
    {
        cout << "Einzelspieler Modus wird gestartet.\n Sie spielen gegen den Computer." << endl;
    }
    else
    {
        cout << "Bitte wählen Sie den Spielmodus aus.\n\n (J)eder gegen Jeden oder (T)eamspiel." << endl;
        cin >> chSpielmodus;

        //Falsche Eingabe Schleife bis eine gueltige Eingabe erfolgt
        
        for (bool bKorrekteEingabe = true; bKorrekteEingabe == true;)
        {
            if ((chSpielmodus != 'j') || (chSpielmodus != 'J') || (chSpielmodus != 't') || (chSpielmodus != 'T'))
            {
                bKorrekteEingabe = true;

                cout << "Bitte wählen Sie einen korrekten Spielmodus aus" << endl;
                cout << "gueltige Eingaben sind j J t T" << endl;
                cin >> chSpielmodus;
            }
                    
        }
        if ((chSpielmodus == 'j') || (chSpielmodus == 'J'))
        {
            cout << " Jeder gegen Jeden Spielmodus wird gestartet" << endl;
        }
        else if ((chSpielmodus == 't') || (chSpielmodus == 'T'))
        {
            cout << "Teamspiel wird gestartet." << endl;
        }
}


Vielleicht seht ihr das Problem oder habt ein paar Tips für mich.
Danke schonmal

Nox

Supermoderator

Beiträge: 5 214

Beruf: Student

  • Private Nachricht senden

2

17.08.2016, 17:42

Welche Entwicklungsumgebung nutzt du? Bist du mit dem Konzept des Debuggens bereits vertraut? Falls nicht ist das der perfekte Moment um sich damit vertraut zu machen :) . Ansonsten hilft es ungemein genau zu beschreiben was dein erwartetes Verhalten und das aktuell beobachtete Verhalten ist (sprich genaue Zeilenangaben). Ansonsten könnten dir ggf Schlüsselworte wie "do while","break","continue" ggf weiterhelfen, wenn ich das ganze richtig einschätze.
bKorrekteEingabe ist übrigens immer true, wenn ich das richtige sehe.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy

hellea

Frischling

  • »hellea« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Bayern

  • Private Nachricht senden

3

17.08.2016, 17:51

also ich arbeite mit, wie im Buch vorgeschlagen, Microsoft Visual Studio 2015.

Die Idee war dass wenn j,J oder t,T eingegeben wird die Variable bKorrekteEingabe auf false gesetzt wird und so aus der Schleife springt.
Hab ich da einen Denkfehler?

Das Debuggen kenne ich bisher noch nicht... werde mich mal schlau machen.

Wirago

Alter Hase

Beiträge: 1 103

Wohnort: Stockerau

Beruf: IT - Online Sevices

  • Private Nachricht senden

4

17.08.2016, 18:07

Gleiches Problem, anderer Ansatz: While-Schleife geht nicht auf korrekte Angabe ein
;)

Zum Thema Debugging gerne hier:
http://www.kleincodiert.at/articles/general/debugger
kleincodiert.at
Deine Seite für den schnellen Einstieg in C++, C# und Java

hellea

Frischling

  • »hellea« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Bayern

  • Private Nachricht senden

5

17.08.2016, 18:23

Danke für die Tips!!
Jetzt tut sich ein neues Problem auf mit der Änderung wie Wirago vorgeschlagen hat das || in && zu ändern wie im anderen Thread beschrieben, Stoppt das Programm einfach bei einer zulässigen Eingabe und setzt sich nicht fort...

Eine Idee?

Wirago

Alter Hase

Beiträge: 1 103

Wohnort: Stockerau

Beruf: IT - Online Sevices

  • Private Nachricht senden

6

17.08.2016, 18:30

Mal ins Blaue geraten.

Abgesehen davon, dass ein for nicht unbedingt die beste Wahl ist, an welcher Stelle genau, wird innerhalb dieser Schleife

for (bool bKorrekteEingabe = true; bKorrekteEingabe == true; )

bKorrekteEingabe zu false? ;)
kleincodiert.at
Deine Seite für den schnellen Einstieg in C++, C# und Java

hellea

Frischling

  • »hellea« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Bayern

  • Private Nachricht senden

7

17.08.2016, 18:42

hmm bin nicht sicher ob ich den Wink gerade verstehe...
aber in der If - Bedingung habe ich ja festgelegt dass
bKorrekteEingabe = true ist solange chSpielmodus != 'j'
also wird
bKorrekteEingabe = false wenn chSpielmodus == 'j' oder?

Wirago

Alter Hase

Beiträge: 1 103

Wohnort: Stockerau

Beruf: IT - Online Sevices

  • Private Nachricht senden

8

17.08.2016, 18:48

Nope. Wenn da nicht steht, dass es false ist, dann ist es nicht false. Du initialisierst im Schleifenkopf die Variable mit true. Und die bleibt so lange true bis die auf false gesetzt wird.

Trotzdem, verwende für solche Dinge lieber eine while-Schleife.
Pseudocode

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool foo = true;

while(foo)
{
  if(irgendwas)
  {
    //mach etwas
  }
  else
  {
    //mach etwas anderes
    foo = false;
  }
}
kleincodiert.at
Deine Seite für den schnellen Einstieg in C++, C# und Java

hellea

Frischling

  • »hellea« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Bayern

  • Private Nachricht senden

9

17.08.2016, 19:12

So ich hab noch eine zweite if Bedingung eingebaut damit die Variable auf false springt und jetzt geht.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        for (bool bKorrekteEingabe = true; bKorrekteEingabe == true;)
        {
            if ((chSpielmodus != 'j') && (chSpielmodus != 't'))
            {
                bKorrekteEingabe = true;

                cout << "Bitte wählen Sie einen korrekten Spielmodus aus" << endl;
                cout << "gueltige Eingaben sind j J t T" << endl;
                cin >> chSpielmodus;

                if ((chSpielmodus >= 65) && (chSpielmodus <= 90))
                    chSpielmodus = chSpielmodus + 32;
            }
            else if ((chSpielmodus == 'j') || (chSpielmodus == 't'))
            {
                bKorrekteEingabe = false;
            }
                    


Danke nochmal an alle für die Hilfe!!

Schorsch

Supermoderator

Beiträge: 4 930

Wohnort: Wickede

Beruf: Student

  • Private Nachricht senden

10

17.08.2016, 20:30

Nochmals der Hinweis, verwende eine andere Schleife. Versuch das ganze zumindest mal umzuschreiben. Sieh es als Übung an. Und rein logisch, solange etwas gilt soll wiederholt werden. Das sagt ja quasi schon aus "while ...", was oft ein gutes Zeichen für die Schleife ist. Andere Möglichkeit wäre do-while. Nach dem Motto, mache eine Eingabe, verarbeite die Eingabe und als Abbruch Bedingung nimmst du dann dass die Eingabe korrekt war. Dann brauchst du deine bool-Variable an sich gar nicht mehr.
Zu deinem aktuellen Konzept, wenn du die bool-Variable mit false initialisierst dann kannst du dir dein else sparen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige