Schleifen funktionieren nicht so wie ich will



  • Hallo liebe Gemeinde.

    Ich habe folgenden Programmcode aufgesetzt:

    #include <iostream>
    using namespace std;
    
    int main()
    {
      int number;
    
      cout << "Schleifen im Vergleich!" << endl;
      cout << endl;
      cout << "(1) for - Schleife" << endl;
      cout << "(2) do...while - Schleife" << endl;
      cout << "(3) while - Schleife" << endl;
      cout << "(0) Abbruch!" << endl;
      cin  >> number;
    
      switch(number)
      {
       case 1:
         cout << "Sie haben sich fuer eine for - Schleife entschieden!" << endl;
         cout << "Jetzt wird die for - Schleife ausgefuehrt!" << endl;
         for (int i=0; i < 1000; i++)
         {
           cout << "Wie oft soll Hallo ausgegeben werden?" << endl;
           cin  >> i;
           cout << "Hallo!" << endl;
         }
         break;
        case 2:
         int k;
         cout << "Sie haben sich fuer eine do...while - Schleife entschieden"<<endl;
         cout << "Jetzt wird die do...while - Schleife ausgefuehrt!" << endl;
         cout << "Abbruchbedinung ist die Ziffer 0" << endl;
         do
         {
           cout << "Wie oft soll Hallo ausgegeben werden?" << endl;
           cin  >> k;
           if (k!=0)
           {
             cout << "Hallo" << endl;
           }
           else
           {
             cout << "Abbruch!" << endl;
           }
         }while(k!=0);
         break;
        case 3:
         int j;
         cout << "Sie haben sich fuer eine while - Schleife entschieden!" << endl;
         cout << "Jetzt wird die while - Schleife ausgefuehrt!" << endl;
         cout << "Abbruchbedingung ist die Ziffer 0!" << endl;
         while(j!=0)
         {
           cout << "Wie oft soll Hallo ausgegeben werden?" << endl;
           cin  >> j;
           if (j!=0)
           {
             cout << "Hallo" << endl;
           }
           else 
           {
             cout << "Abbruch!" << endl;
           }
         }
         break;
        case 0:
         cout << "Abbruch!" << endl;
         break;
      }
      return 0;
    }
    

    Nun zu den Fehlern:

    1.) Wenn ich bei der Menüauswahl 1, also die for-Schleife, aussuche kommt die
    Fehlermeldung "Run-Time Check Failure #3 - The variable 'i' is being
    used without being initialized."
    Ich sehe den Fehler nicht, da ich dachte, dass ich die Variable i in der
    for - Schleife richtig deklariert und somit verwendet hätte.

    2.) Bei den anderen beiden Schleifen wird "Hallo" nur einmal ausgegeben, egal
    welche Zahl ich eingebe. Wo liegt dort den Fehler? Ich sehe ihn nicht...

    Ich bedanke mich schon einmal im Voraus für die Antworten.

    Gruß

    Max



  • Zu 1): Ist doch klar, du musst i mit = 0 initialisieren.
    Übrigens benutzt du auch einige andere Variablen uninitialisiert. ⚠


  • Mod

    1. Deklariert, Definiert, alles klar. Aber eben nicht initialisiert. int i = 0; willst du wohl haben.
    2.

    1. Die Abfrage nach der Anzahl der Durchläufe steht ja auch innerhalb der Schleife!
    2. Wenn du die Abfrage vorziehst wirst du das Problem bekommen, dass die Laufvariablen nicht verändert werden, du also eine Endlosschleife bekommen wirst. Du willst also vermutlich irgendwo während eines Durchlaufs die Laufvariablen um 1 erniedrigen.


  • Vor der Abfrage einer Variablen, solltes du ihr einen Wert zuweisen.

    Bei deinem Fall 1 passiert das schon bei i<1000.
    Eine Definition ist keine Initialisierung. Eine Deklaration schon gar nicht.

    Ich vermisse die Definition von k. Außerdem fehlen Klammern. Dann ist das nicht das Programm das du compilierst.
    Also erübrigt sich jede weitere Fehlersuche.



  • scnr, wo bleibt der hide-Button? 🤡

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	cout	<< "Schleifen im Vergleich!\n\n"
    			<< "(1) for - Schleife\n"
    			<< "(2) do...while - Schleife\n"
    			<< "(3) while - Schleife\n"
    			<< "(0) Abbruch!\n";
    
    	int number = -1;
    	cin >> number;
    
    	switch( number ) {
    
    		case 1: {
    
    			cout	<< "Sie haben sich fuer eine for - Schleife entschieden!\n"
    					<< "Jetzt wird die for - Schleife ausgefuehrt!\n"
    					<< "Wie oft soll Hallo ausgegeben werden?\n";
    
    			int i = 0;
    			cin >> i;
    
    			if( !i ) {
    
    				cout << "Abbruch!\n";
    				break;
    			}
    
    			for ( ; i; --i ) cout << "Hallo!\n";
    
    			break;
    		}
    
    		case 2: {
    
    			cout	<< "Sie haben sich fuer eine do...while - Schleife entschieden\n"
    					<< "Jetzt wird die do...while - Schleife ausgefuehrt!\n"
    					<< "Abbruchbedinung ist die Ziffer 0\n"
    					<< "Wie oft soll Hallo ausgegeben werden?\n";
    
    			int k = 0;
    			cin >> k;
    
    			do {
    
    				if( k ) cout << "Hallo\n";
    				else cout << "Abbruch!\n";
    
    			} while( k-- );
    
    			break;
    		}
    
    		case 3:
    		{
    			cout	<< "Sie haben sich fuer eine while - Schleife entschieden!\n"
    					<< "Jetzt wird die while - Schleife ausgefuehrt!\n"
    					<< "Abbruchbedingung ist die Ziffer 0!\n"
    					<< "Wie oft soll Hallo ausgegeben werden?\n";
    
    			int j;
    			cin  >> j;
    
    			++j;
    
    			while( j-- ) {
    
    				if( j ) cout << "Hallo\n";
    				else cout << "Abbruch!\n";
    			}
    
    			break;
    		}
    
    		case 0:
    			cout << "Abbruch!\n";
    			break;
    
    		default:
    			cout << "Eingabefehler!\n";
    	}
    }
    


  • Ersteinmal Danke für die Antworten.

    Sorry, ich habe im obigen Code die Zeile

    int k;
    

    vergessen.

    Werde ich gleich ausbessern.

    Ich habe jetzt die for-Schleife optimiert... Jetzt kommt wie bei den anderen beiden Schleifen zwar die Frage "Wie oft soll Hallo ausgegeben werden?", aber auch da kann ich jede beliebige Zahl eingeben und "Hallo" wird bloß einmal ausgeführt.

    Was mache ich falsch bzw. welchen Denkfehler habe ich??



  • Das cin steht in der Schleife.

    Also musst du auch entsprechen oft einen Wert eingeben.



  • Ohne Frage ist es sinnvoller den Wert vor der Schleife abzufragen. 😉



  • Nun habe ich die besagte Endlosschleife bei Menüpunkt 2 und 3...



  • Poste vollständigen Code per copy and paste!



  • Kann ich nicht machen, da ich gerade bei einem Freund bin und über seinen PC im Internet bin und der Code auf meinem Netbook ist...



  • Ich habe nochmal über den Code drüber geschaut ... der müsste jetzt soweit passen.

    Ich sehe aber dennoch den Fehler nicht.



  • Liest du auch die Hinweise durch? Alle?

    Es ist allerdings auch blöd den Code auf der ersten Seite zu ändern, ohne es anzukündigen.

    Wie oft gibst du Werte ein?
    Oder anders gefragt:
    Wie oft erscheint das "Wie oft soll Hallo ausgegeben werden?" ?



  • silent_max schrieb:

    [...] müsste jetzt soweit passen.

    Njet. Ich spendier' noch ein Semikolon am Ende von Zeile 45 - dann kompiliert das Ding wenigstens.
    int i im case 1 wird immer noch uninitialisiert verwendet.
    Du scheinst keinen der gemachten Vorschläge bzw. Erleuterungen beachtet zu haben.



  • Es erscheint einmal.



  • Bei welcher Auswahl? 1 für "for-Schleife"? Reiner Zufall.



  • Bei welchen Eingabewerten?



  • Also der gesamte Code sieht jetzt so aus:

    #include <iostream>
    using namespace std;
    
    int main()
    {
     int number;
    
     cout << "Schleifen im Vergleich!" << endl;
     cout << endl;
     cout << "Welche Schleife wollen Sie ausfuehren?" << endl;
     cout << "(1) for - Schleife" << endl;
     cout << "(2) do ... while - Schleife" << endl;
     cout << "(3) while - Schleife" << endl;
     cout << "(0) Abbruch!" << endl;
     cin  >> number;
    
     switch (number)
     {
      case 1:
       int i;
       cout << "Sie haben sich fuer eine for - Schleife entschieden!" << endl;
       cout << "Jetzt wird die for - Schleife ausgefuehrt!" << endl;
       cout << "Wie oft soll Hallo ausgegeben werden?"<< endl;
       cin  >> i;
       for (; i <1000; i++)
       {
        cout << "Hallo";
       }
       break;
      case 2:
       int k;
       cout << "Sie haben sich fuer eine do...while - Schleife entschieden!"<< endl;
       cout << "Jetzt wird die do...while - Schleife ausgefuehrt!" << endl;
       cout << "Abbruchbedingung ist die Ziffer 0" << endl;
       cout << "Wie oft soll Hallo ausgegeben werden?" << endl;
       cin  >> k;
       do
       {
        if (k!=0)
          cout << "Hallo";
        else
          cout << "Abbruch;
       }while(k!=0);
       break;
      case 3:
       int j;
       cout << "Sie haben sich fuer eine while - Schleife entschieden!" << endl;
       cout << "Jetzt wird die while - Schleife ausgefuehrt!" << endl;
       cout << "Abbruchbedingung ist die Ziffer 0!" << endl;
       cout << "Wie oft soll Hallo ausgegeben werden?" << endl;
       cin  >> j;
    
       while(j!=0)
       {
        if(j!=0)
         cout << "Hallo" << endl;
        else 
         cout << "Abbruch!" << endl;
       }    
       break;
      case 0:
       cout << "Abbruch!" << endl;
       break;
      } 
     return 0;
    }
    

    Bei Menüauswahl 1 werde ich zwar gefragt, wie oft "Hallo" ausgegeben werden soll, aber die Schleife läuft wohl bis 1000 durch.

    Bei Menüauswahl 2 werde ich zwar gefragt, wie oft "Hallo" ausgegeben werden soll, aber es erscheint eine Endlosschleife, wie SeppJ schon geschrieben hat.

    Bei Menüauswahl 3 werde ich zwar gefragt, wie oft "Hallo" ausgegeben werden soll, aber es erscheint eine Endlosschleife, wie SeppJ schon geschrieben hat.

    Bloß wo liegt der Fehler???????????????????????



  • silent_max schrieb:

    Also der gesamte Code sieht jetzt so aus: [...]

    Glaube ich nicht.

    1>main.cpp(28): error C2143: syntax error : missing ';' before '}'
    1>main.cpp(42): error C2001: newline in constant
    1>main.cpp(43): error C2143: syntax error : missing ';' before '}'
    


  • Bei 1. fängst du bei i an zu zählen. Wenn du für i mal 998 eingibst, kommen weniger Ausgaben.

    Zu 2. und 3.
    Wenn du zählen willst, musst du einen Wert auch mal verändern.


Anmelden zum Antworten