[C++] - do..while Abbruch

BjH

Ensign
Registriert
Aug. 2004
Beiträge
199
Hallo,

habe ein Problem mit dem Abbruch einer do..while Schleife.
Ich soll für eine Aufgabe Lottozahlen erzeugen, sortieren und ausgeben.
Nach der Ausgabe wir der Benutzer gefragt, ob er neuen Zahlen erzeugen will, dazu soll er 'j' eingeben.
Mit jeder anderen mit 'n' und allen anderen Tasten wird das Programm beendet.

Mein Problem ist, dass das Programm teilweise nicht endet, wenn man n oder eine andere Taste drückt und in einer Endloschleife bleibt. (Fenster schließt nicht, keine Eingabe möglich)
Wenn ich das Programm aber nochmal starte läuft es tadellos.

Code:
int main(void)
{
	vector<int> lotto (7,0);	//Vector Deklaration, initialisiert mit 0
	randomize();

	cout << "\nLotto-Programm" << endl ;
	do
	{
		tippErzeugen(lotto);	//Erzeugen von Zufallszahlen 1-49, und einer Superzahl
		tippSortieren(lotto);   //Sortieren des Feldes mit BubbleSort
		tippAusgabe(lotto);     //Formatierte Ausgabe des Feldes
		cout << "\nEinen neuen Tipp erzeugen ? [j/n]";

	} while (getch()=='j');    	//Abbruch der Schleife, wenn Eingabe nicht j

	return 0;

}

Vielleicht kann mir jemand dabei helfe... ich weiß nämlich nicht weiter.

Gruß,
BjH
 
Zuletzt bearbeitet:
Kann grad nicht konkret testen, aber benutzt du eclipse?

Probier mal vor der Eingabenaufforderung ein
Code:
fflush(null);

Evtl. müssteste's dann auch etwas umschreiben. Könnte auch am getchar() liegen. Haste's mal mit einem std::cin versucht?
Generell würde ich eher das Ergebnis der Eingabe in einer Variablen abspeichern, finde ich persönlich "saubrer".
 
Benutze den Borland C++ Builder. Hab std::cin schon probiert, ändert an der Sache nix.
fflush(null); hilst auch nicht weiter!

Habs grad noch ein paarmal probiert. Es läuft ja teilweise wunderbar, und dann wieder hängt er sich beim beenden auf!?
 
Hat man da früher nicht noch ein end als Programmende gemacht?
Mein C++ ist leider 18 Jahre her...

Weil nur ein aus der Schleife springen als Programmende ist ein bissl brutal.
Da kannst du gleich schreiben: "Wenn nein, dann drücke ALT + F4"
 
Sicher, dass die Mainroutine hängt? Vielleicht läuft eine Subroutine unendlich?

und die Zeile hier kann ich nicht nachvollziehen:
cout << "\nLotto-Programm" << endl ;

hab mit cout nie gearbeitet.
 
Sein beenden ist absolut richtig. Die Funktion main wird von Windows aufgerufen und Windows erwartet im Erfolgsfall, dass die Funktion mit return 0 verlassen wird. Bei Fehlern sollte man den Return-Wert auf einen Wert ungleich 0 setzen.

Ich denke auch, dass sein Problem mit irgendwelchen Zeichen im Eingabepuffer zu tun hat.

cout << "\nLotto-Programm" << endl ;
Die Zeile erzeugt nur die Ausgabe und zeigt, dass er sich nicht zwischen C und C++ entscheiden kann, denn eigentlich sollte man es so schreiben
Code:
cout << endl << "Lotto-Programm" << endl ;

Sicher, dass die Mainroutine hängt?
Das kann man am einfachsten prüfen, wenn man vor jeden Funktionsaufruf in der Main-Funktion eine Ausgabe einbaut.
 
Zuletzt bearbeitet:
ich glaube du solltest das ein bisschen anders machen

//*********************************************************
int main(void)
{
vector<int> lotto (7,0); //Vector Deklaration, initialisiert mit 0
randomize();


cout<<"Tipp erzeugen ja oder nein?:"<<endl;
char szVariable=getch();

while (szVariable == 'j') {
tippErzeugen(lotto); //Erzeugen von Zufallszahlen 1-49, und einer Superzahl
tippSortieren(lotto); //Sortieren des Feldes mit BubbleSort
tippAusgabe(lotto); //Formatierte Ausgabe des Feldes

cout << "\nEinen neuen Tipp erzeugen ? [j/n]";
szVariable=getch();
}

return 0;
}

So ungefähr sollte es gehen. Du kannst aber auch cin benutzen anstatt getch! Jetzt kannst du beim ersten mal schon abbrechen und dann wird immer wieder in der while Schleife nochmal abgefragt ob du weitermachen möchtest.
 
Zuletzt bearbeitet:
Danke für die Tipps,

es scheint nicht die main-Routine zu hängen.
@le_Chuck

Hab deine Version mal getestet, verursacht aber das selbe Problem.
Zudem sollen wir laut Aufgabenstellung eine do while schleife benutzen, da das Programm in jeden fall einmal ausgefürht werden soll
 
Probier mal deine Eingaben mit cin zu machen.

Nachdem du mit der While Schleife ausgewertet hast ob der Benutzer j eingegeben hat, gleich wieder Puffer löschen und zwar so.
cin.clear();
cin.sync();

oder benutze klassische Befehle wie "scanf" wie hier z.B.
int main ()
{
char str [80];
int i;

printf ("Enter your family name: ");
scanf ("%s",str);
printf ("Enter your age: ");
scanf ("%d",&i);
printf ("Mr. %s , %d years old.\n",str,i);
printf ("Enter a hexadecimal number: ");
scanf ("%x",&i);
printf ("You have entered %#x (%d).\n",i,i);

return 0;
}
 
Hi,

bei der frage ob noch ein Tipp ausgegeben werden soll, muss du die Variable deklarieren.

Du hast es als getch() deklarieren was ich dir nicht empfehlen würde, weil es ein befehl ist, jedenfals bei C++.


Verbesserte Version

Code:
int main(void)
{
	vector<int> lotto (7,0);	//Vector Deklaration, initialisiert mit 0
	randomize();

	cout << "\nLotto-Programm" << endl ;
	do
	{
		tippErzeugen(lotto);	//Erzeugen von Zufallszahlen 1-49, und einer Superzahl
		tippSortieren(lotto);   //Sortieren des Feldes mit BubbleSort
		tippAusgabe(lotto);     //Formatierte Ausgabe des Feldes
		cout << "\nEinen neuen Tipp erzeugen ? [j/n]";
                cin>>frage
	} while (frage=='j');    	//Abbruch der Schleife, wenn Eingabe nicht j

	return 0;

}


;) :)
 
Zuletzt bearbeitet:
Zurück
Oben