Zahlen raten



  • Hallo Zusammen,
    ich bin ein C++ Neuling und versuche mich gerade an einem kleinen Zahlen raten. Das Programm lässt sich starten allerdings hängt es sich in der While-Schleife auf.

    Kann mir jemand helfen bitte?

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int limit, zahl, zufall_zahl, versuche, versuche_input, trY;
    
    int main () 
    {
    
    	cout << "Willikommen beim Zahlenraten!" << endl;
    	cout << "Bitte gib die hoechstmoegliche Zahl ein:" << endl;
    	cin >> limit; // Eingabe "limit" für die höchstmögliche Zahl
    
    	cout << "Wieviele Versuche willst du Maximal brauchen?" << endl;
    	cin >> versuche_input; // Eingabe "versuche_input" für die höchstmögliche Zahl
    
    	// Zufalls Zahl generieren
    	srand((unsigned)time(0)); // Zufallszahl aus Time-Seed (immer ander Zahl)
    	zufall_zahl = (rand() %limit + 1); // Limit der zahl ein binden +1 damit Null nicht vorkommt
    	cout << zufall_zahl << endl;
    
    	// While-Schleife solange zahl und zufalls_zahl != und versuche <= versuche_input
    	while ((zahl != zufall_zahl) && (versuche <= versuche_input));
    	{
    		cout << "Wie lautet dein Tip? " << endl;
    		cin >> zahl; //Eingabe Zahl
    		versuche++;
    
    		// Versuche übrig
    		if (versuche <= versuche_input)
    		{
    			trY = versuche_input - versuche;
    			cout << "Du hast noch " << trY << " Versuche!" << endl;
    		}
    
    		if (zahl < zufall_zahl) // zahl kleiner als zufall_zahl
    		{
    			cout << "Die gesuchte Zahl ist groesser" << endl << endl;
    		}
    
    		if (zahl > zufall_zahl) // zahl größer als zufall_zahl
    		{
    			cout << "Die gesuchte Zahl ist kleiner" << endl << endl;
    		}
    	}
    
    	// Ende des Programms
    	cout << "Du hast die Zahl eraten:" << zufall_zahl << endl << endl << "Well done !!!" << endl;
    
    	system("Pause"); // Programm Pausieren 
    	return 0;
    }
    


  • Tut mir leid der Beitrag ist von mir. War leider nicht eingeloggt. 😞



  • Definiere "hängt sich auf".



  • Es bleibt stehen und es blinkt nur noch der Courser. VS17 gibt keinen Fehler aus.



  • g++ -Wall schrieb:

    z.cpp: In function ‘int main()’:
    z.cpp:25:5: warning: this ‘while’ clause does not guard... [-Wmisleading-indentation]
    while ((zahl != zufall_zahl) && (versuche <= versuche_input));
    ^~~~~
    z.cpp:26:5: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘while’
    {
    ^

    Beachte das Zeilenende bei while



  • AmadeusMotzart schrieb:

    Es bleibt stehen und es blinkt nur noch der Courser. VS17 gibt keinen Fehler aus.

    Stelle das Warnlevel höher ein. In Zeile 25 greifst du nämlich im ersten Schleifendurchlauf auf die nicht initialisierten Variablen "zahl" und "versuche" zu.



  • Danke für die schnelle Hilfe. 🙂
    Danke für die info mit dem Warnlevel, werde mich sofort darum kümmern.


  • Mod

    Biolunar schrieb:

    In Zeile 25 greifst du nämlich im ersten Schleifendurchlauf auf die nicht initialisierten Variablen "zahl" und "versuche" zu.

    Ausnahmsweise mal nicht.
    Nicht-lokale Variablen -> statische Speicherdauer -> Value-Initialisierung.



  • Ich habe meinen Code jetzt mal fertig. Ein Bekannter meinte gerade der wäre absoluter Mist. Mit der Aussage kann ich halt nichts anfangen... 😞
    Wärt ihr so nett und schaut es euch mal an?

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int limit, zufall_zahl, versuche_input;
    int zahl = 0;
    int versuche = 0;
    int trY;
    
    int main()
    {
    	cout << "Willikommen beim Zahlenraten!" << endl;
    	cout << "Bitte gib die hoechstmoegliche Zahl ein:" << endl;
    	cin >> limit; // Eingabe "limit" für die höchstmögliche Zahl
    
    	cout << "Wieviele Versuche willst du Maximal brauchen?" << endl;
    	cin >> versuche_input; // Eingabe "versuche_input" für die höchstmögliche Zahl
    
    	// Zufalls Zahl generieren
    	srand((unsigned)time(0)); // Zufallszahl aus Time-Seed (immer ander Zahl)
    	zufall_zahl = (rand() % limit + 1); // Limit der zahl ein binden +1 damit Null nicht vorkommt
    	cout << zufall_zahl << endl;
    
    	// While-Schleife solange zahl und zufalls_zahl != und versuche <= versuche_input
    
    	while ((zahl != zufall_zahl) && (versuche <= versuche_input))
    	{
    		cout << "Wie lautet dein Tip? " << endl;
    		cin >> zahl; //Eingabe Zahl
    		versuche++;
    
    		// Versuche übrig
    		if ((versuche < versuche_input) && (zahl != zufall_zahl))
    		{
    			trY = versuche_input - versuche;
    			cout << "Du hast noch " << trY << " Versuche!" << endl;
    		}
    
    		if (zahl < zufall_zahl) // zahl kleiner als zufall_zahl
    		{
    			cout << "Die gesuchte Zahl ist groesser" << endl << endl;
    		}
    
    		if (zahl > zufall_zahl) // zahl größer als zufall_zahl
    		{
    			cout << "Die gesuchte Zahl ist kleiner" << endl << endl;
    		}
    
    		// Ende des Programms
    
    		if (versuche == versuche_input)
    		{
    			cout << "Game Over" << endl;
    			system("Pause");
    			return 0;
    		}
    		else
    		{
    			cout << endl << "Du hast die Zahl eraten:" << zufall_zahl << endl << "Du hast nur " << versuche << " gebraucht!" << endl << endl << "Well done !!!" << endl;
    			system("Pause"); // Programm Pausieren 
    			return 0;
    		}
    	}
    }
    


  • Ohne die Logik zu überprüfen hier einige Dinge:
    []rand() ist obsolet, benutze die Funktionen aus <random>
    [
    ]globale Variablen sind meist nicht nötig, hier erst recht nicht. Benutze lokale Variablen.
    []using namespace std; ist zu vermeiden, vor allem wenn es um solche kleinen Namen wie std geht.
    [
    ]system für Pausierungszwecke ist Overkill und hier auch platformabhängig. Nutze std::cin.get() oder starte das Programm gleich direkt aus einer Konsole heraus.
    [*]Dein Programm sollte stets an einer einzigen Stelle beendet werden.



  • Techel schrieb:

    Ohne die Logik zu überprüfen hier einige Dinge:
    []using namespace std; ist zu vermeiden, vor allem wenn es um solche kleinen Namen wie std geht.
    [
    ]Dein Programm sollte stets an einer einzigen Stelle beendet werden.

    Bei beiden: warum?

    zu std: gerade bei kleinen Programmen, die nicht irgendwie viele Libraries haben, finde ich "using namespace std" durchaus legitim.

    zu Beenden: das höre ich jetzt zum ersten Mal. Begründung? Ich beende z.B. meine Programme regelmäßig direkt nach commandline-Parsing, wenn die Parameter nicht dem entsprechen, was ich suche. Das ist ein Ende. Bei Datenfehlern beende ich es auch hart. Und dann natürlich gibt es auch noch ein Ende, wenn alles ok durchläuft. Daher: was ist der Grund?


  • Mod

    AmadeusMotzart schrieb:

    Ich habe meinen Code jetzt mal fertig. Ein Bekannter meinte gerade der wäre absoluter Mist. Mit der Aussage kann ich halt nichts anfangen... 😞

    Hast du dein Programm schon einmal mit verschiedenen Eingaben getestet?


Log in to reply