C++:wie kann ich das blocken, das bei ner Abfrage auf int nicht char eingegeben wird?

Diskutiere C++:wie kann ich das blocken, das bei ner Abfrage auf int nicht char eingegeben wird? im Developer Network Forum im Bereich Hardware & Software Forum; Mahlzeit. Bin gerade beim fleissig C++ büffeln (hier: VC++) , und stolperte im folgendem Prog. über das o.g. Problem: wenn ich in ner...
  • C++:wie kann ich das blocken, das bei ner Abfrage auf int nicht char eingegeben wird? Beitrag #1
Robelli

Robelli

Bekanntes Mitglied
Dabei seit
18.04.2004
Beiträge
496
Reaktionspunkte
0
Ort
Salzgitter
Mahlzeit.

Bin gerade beim fleissig C++ büffeln (hier: VC++) , und stolperte im folgendem Prog. über das o.g. Problem: wenn ich in ner int-Abfrage n Buchstaben eingebe, hängt sich das Prog auf, bzw. iss die ganze Zeit wie doof am scrollen. Gibts da was EINFACHES um das zu verhindern? Gruss Robert

Habe mal das Prog. mit rangehängt, iss abgewandelt aus ner Aufgabenstellung.

Code:
#include <iostream>
#include <ctime>
using namespace std;

void main()
{
int Geld_Bank = 200, 
Verfuegungsrahmen = 100,
Geld_Spieler1 = 0, 
Geld_Spieler2 = 0,
Wahl_Spieler1 = 0,
Wahl_Spieler2 = 0,
Einsatz_Spieler1 = 0,
Einsatz_Spieler2 = 0,
Pott = 0,
Feld = 1;
char Wiederholung = 'j';

	cout << "8h - Projekt, jeder fängt mal klein an.\n";
	cout << "Willkommen beim Roulette fuer 2 Spieler!\n-----------------\n\n";
	cout << "Sie haben am Beginn ihres Spiels 100 Euro zur Verfuegung,\ndie Bank 200 Euro.\n\n";
	cout << "Spielregeln: \n\n";
	cout << "es gibt acht Felder, \n\n1,3,5 = rot,\n2,4,6 = schwarz.\n\n";
	cout << "Sollte die Kugel auf Feld 7 oder 8 kommen,\nverlieren beide Spieler ihren Einsatz an die Bank.\n\n";


/*Grosse Schleife, Hauptprogramm*/
	do {

/* Reset Spieler nach DoppelNull */

		if (Geld_Spieler1 == 0 && Geld_Spieler2 == 0)
		{ Geld_Spieler1 = Geld_Spieler2 = Verfuegungsrahmen;}
		else;




/*Abfrage und Überprüfung Spieler1*/
		if (Geld_Spieler1 > 0) 
		
		{ 
			do {
				cout << endl;
				cout <<"Spieler 1, Einsatz (noch max. "<< Geld_Spieler1 <<" Euro): ";
				cin >> Einsatz_Spieler1;
				if (Einsatz_Spieler1 > Geld_Spieler1) 
				cout << "soviel hast du nicht mehr...\n";
				
			} while(Einsatz_Spieler1 <= 0 || Einsatz_Spieler1 > Geld_Spieler1);

			do {

				cout << "Spieler 1, auf welches Feld setzt du? 1-6 zur Auswahl: ";

				cin >> Wahl_Spieler1;
				if (Wahl_Spieler1 <=0 || Wahl_Spieler1 > 6)
				cout << "Hallo, Feld 1-6!!! nochmal...\n";
			} while (Wahl_Spieler1 <=0 || Wahl_Spieler1 > 6);

		}

		else cout << "Spieler 1 ist pleite, nimmt nicht mehr am Spiel teil.\n";

/*Abfrage und Überprüfung Spieler2*/
		if (Geld_Spieler2 > 0) 
		
		{ 
			do {
				cout << endl;
				cout << "Spieler 2, Einsatz (noch max. "<< Geld_Spieler2 <<" Euro): ";
				cin >> Einsatz_Spieler2;
				if (Einsatz_Spieler2 > Geld_Spieler2) 
				cout << "soviel hast du nicht mehr...\n";
				
			} while(Einsatz_Spieler2 <= 0 || Einsatz_Spieler2 > Geld_Spieler2);

			do {

				cout << "Spieler 2, auf welches Feld setzt du? 1-6 zur Auswahl: ";

				cin >> Wahl_Spieler2;
				if (Wahl_Spieler2 <=0 || Wahl_Spieler2 > 6)
				cout << "Hallo, Feld 1-6!!! nochmal...\n";
			} while (Wahl_Spieler2 <=0 || Wahl_Spieler2 > 6);

		}

		else cout << "Spieler 2 ist pleite, nimmt nicht mehr am Spiel teil.\n";

/*Zufallsgenerator mit Systemzeit füttern*/
		
		srand(time(NULL));

/*Spielbeginn*/

cout << "Geldbestaende\n---------------\n";
cout << "Bank: " << Geld_Bank << " Euro\n\n";
cout << "Spieler 1 " << Geld_Spieler1 << " Euro, geboten: " << Einsatz_Spieler1 << " Euro\n";
cout << "Spieler 2 " << Geld_Spieler2 << " Euro, geboten: " << Einsatz_Spieler2 << " Euro\n\n";
cout << "Spielbeginn...\n" << endl << endl;


Feld = (rand() % 8 + 1);

cout << "Die Kugel ist auf Feld " << Feld << " gelandet.\n\n";


/*Auswertung Spieler1*/
 
if (Wahl_Spieler1 == Feld)
{
	Geld_Bank -= Einsatz_Spieler1;
	Geld_Spieler1 += Einsatz_Spieler1;

	cout << "Spieler 1 hat " << Einsatz_Spieler1 << " Euro gewonnen, Kontostand: " << Geld_Spieler1 << " Euro.\n";
}
else
{
	Geld_Bank += Einsatz_Spieler1;
	Geld_Spieler1 -= Einsatz_Spieler1;

	cout << "\aSpieler 1 hat " << Einsatz_Spieler1 << " Euro verloren, Kontostand: " << Geld_Spieler1 << " Euro.\n";
}

/*Auswertung Spieler2*/
 
if (Wahl_Spieler2 == Feld)
{
	Geld_Bank -= Einsatz_Spieler2;
	Geld_Spieler2 += Einsatz_Spieler2;

	cout << "Spieler 2 hat " << Einsatz_Spieler2 << " Euro gewonnen, Kontostand: " << Geld_Spieler2 << " Euro.\n";
}
else
{
	Geld_Bank += Einsatz_Spieler2;
	Geld_Spieler2 -= Einsatz_Spieler2;

	cout << "\aSpieler 2 hat " << Einsatz_Spieler2 << " Euro verloren, Kontostand: " << Geld_Spieler2 << " Euro.\n";
}

Einsatz_Spieler1 = 0;
Einsatz_Spieler2 = 0;

if (Geld_Bank <= 0 || (Geld_Spieler1 <=0 && Geld_Spieler2 <=0)) 
{cout << "\nSpielende.\n\nBank: " << Geld_Bank << " Euro.\n\nSpieler 1: " << Geld_Spieler1 << " Euro.\nSpieler 2: " << Geld_Spieler2 << " Euro.\n";
}
else;

if ((Geld_Spieler1 <= 0 && Geld_Spieler2 <= 0) || Geld_Bank <= 0 )
{
cout << "\nWiederholung gewuenscht? j/n ";
cin >> Wiederholung;
cout << endl;}

} while(Wiederholung == 'j' || Wiederholung == 'J');

/*(Geld_Spieler1 > 0 || Geld_Spieler2 > 0 );
*/


}
 
  • C++:wie kann ich das blocken, das bei ner Abfrage auf int nicht char eingegeben wird? Beitrag #2
G

Gast49382

Guest
Code:
Verfuegungsrahmen = 100,
Geld_Spieler1 = 0, 
Geld_Spieler2 = 0,
Wahl_Spieler1 = 0,
Wahl_Spieler2 = 0,
Einsatz_Spieler1 = 0,
Einsatz_Spieler2 = 0,
Pott = 0,
Feld = 1;
char Wiederholung = 'j';

Es ist äußerst unübersichtlich bei so einer langen Liste von Variabeln sie alle in einer Verkettung zu schreiben.
Wenn dann es trozdem sein muss dann so, dient der Übersicht.

Ungefähr so:

Code:
int Geld_Bank, Verfuegungsrahmen = 100, Geld_Spieler1 = 0, Geld_Spieler2 = 0, Wahl_Spieler 1 = 0, Wahl_Spieler2 = 0, Einsatz_Spieler1 = 0, Einsatz_Spieler2 = 0, Pott = 0,Feld = 1;
char Wiederholung = 'j';


mfg
 
Zuletzt bearbeitet von einem Moderator:
  • C++:wie kann ich das blocken, das bei ner Abfrage auf int nicht char eingegeben wird? Beitrag #3
Robelli

Robelli

Bekanntes Mitglied
Dabei seit
18.04.2004
Beiträge
496
Reaktionspunkte
0
Ort
Salzgitter
guten Morgen. Ja, ist ja in Ordnung, für mich war es vorerst so in Ordnung. Der ganze Block ist allerdings als int deklariert, sonst hätte mich der compiler schon verhauen.... Aber ne wirkliche Lösung zu meinem Problem schwebt dir noch net so vor, hm?
 
  • C++:wie kann ich das blocken, das bei ner Abfrage auf int nicht char eingegeben wird? Beitrag #4
G

Gast49382

Guest
Ah und noch was struckturier dein Programm mal vernünftig, rücke die "If" ein und überdenke nochmal deine Geschweiften-Klammern.
Dann löst sich das Problem von selber ich denke das du irgendwo ne Endlosschleife drin hast.
 
  • C++:wie kann ich das blocken, das bei ner Abfrage auf int nicht char eingegeben wird? Beitrag #5
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Code:
Verfuegungsrahmen = 100,
Geld_Spieler1 = 0, 
Geld_Spieler2 = 0,
Wahl_Spieler1 = 0,
Wahl_Spieler2 = 0,
Einsatz_Spieler1 = 0,
Einsatz_Spieler2 = 0,
Pott = 0,
Feld = 1;
char Wiederholung = 'j';
Es ist äußerst unübersichtlich bei so einer langen Liste von Variabeln sie alle in einer Verkettung zu schreiben.
Wenn dann es trozdem sein muss dann so, dient der Übersicht.

Ungefähr so:

Code:
int Geld_Bank, Verfuegungsrahmen = 100, Geld_Spieler1 = 0, Geld_Spieler2 = 0, Wahl_Spieler 1 = 0, Wahl_Spieler2 = 0, Einsatz_Spieler1 = 0, Einsatz_Spieler2 = 0, Pott = 0,Feld = 1;
char Wiederholung = 'j';

Bloß nicht! Die erste Variante ist um Längen übersichtlicher. Die Liste kann ich auf einen Blick erfassen, eine 200 Zeichen lange Zeile aber nicht.

Zum eigentlichen Problem:
Dir fehlt eine Fehlerbehandlung. Wenn Du einen Buchstaben eingibst, das Programm aber eine Zahl erwartet, dann gibt's einen Fehler, den Du abfragen mußt. In etwa so:
Code:
...
                cin >> Einsatz_Spieler1;

                if (!cin) {
                    cin.clear();
                    cin.sync();
                }
 
  • C++:wie kann ich das blocken, das bei ner Abfrage auf int nicht char eingegeben wird? Beitrag #6
Robelli

Robelli

Bekanntes Mitglied
Dabei seit
18.04.2004
Beiträge
496
Reaktionspunkte
0
Ort
Salzgitter
Code:
                cin >> Einsatz_Spieler1;

                if (!cin) {
                    cin.clear();
                    cin.sync();
                }

Hey super, :goil: DANKE!, das ist genau der Teil den ich brauchte. Jetzt muss ich mir ja nur noch nen Kopf darüber machen, was die Anweisungen überhaupt genau machen...


aber das kriege ich hin...

Robert
 
Thema:

C++:wie kann ich das blocken, das bei ner Abfrage auf int nicht char eingegeben wird?

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben