Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Kommazahlen auf int-variablen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.03.2003, 05:40 Uhr
Chillmaster




Code:
1:  while(ergebnis < 1 || ergebnis > 3)
2:  {
3:    cout << "Spieler (" << anzahlDerMuenzen << "): ";
4:    cin >> ergebnis;
5:    if(ergebnis<1 || ergebnis>3)
6:      cout << "Sie duerfen nur zwischen 1 und 3 Muenzen nehmen!" << endl;
7:    if(ergebnis > anzahlDerMuenzen)
8:    {
9:      cout<<"So viele Muenzen liegen nicht mehr auf dem Tisch!"<<endl;
10:      ergebnis=0;
11:        }
12:    };


Ich habe obenstehenden Code in meinem Programm.
Wenn man bei der Abfrage nach ergebnis in Zeile 4 keinen int, sondern eine Kommazahl eingibt (Beispiel: 2.3), dann hängt sich das Programm in einer Endlosschleife auf.

Genauer: Es durchläuft die while Schleife, mit ergebnis = 2 (wenn wir beim obigen Beispiel bleiben). Die while - Schleife wird beendet (da while - Bedingung erfüllt), das Hauptprogramm ruft die Schleife erneut auf (soweit läufts nach Plan).
Dann übergeht while jedesmal die Eingabe durch cin und wiederholt die Schleife unendlich oft. (ergebnis hat dabei den Wert 0).

Soweit das Problem. Es ist klar, dass im Eingabe - Puffer oder sonstwo zuerst die Zahl vor dem Komma steht (beim obigen Beispiel 2), welches zuerst an ergebnis übergeben wird. Damit läuft die Schleife erstmal durch.
Beim zweitenmal steht in ergebnis 0 (wegen int(0.3) = 0).

Ich hab nun 3 Fragen:
1. Wieso leert sich dieser Puffer nicht beim zweiten Aufruf von cin.
2. Wie kann ich den Puffer "per Hand" leeren.
3. Wo und wie wird die Kommazahl gespeichert

Vielen Dank im Voraus
Chillmaster
--
With Great Power Comes Great Responsibility

Dieser Post wurde am 28.03.2003 um 05:42 Uhr von Chillmaster editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.03.2003, 10:04 Uhr
~0xdeadbeef
Gast


Es gibt keinen Aufruf von cin. Es gibt genaugenommen einen Aufruf von cin.operator>>(int). cin ist eine Instanz der Klasse istream, also eine Variable.
Der Puffer leert sich dabei nicht, weil das Prinzip eines Streams im Grunde das einer FIFO ist. Das Zeichen bleibt so lange im Puffer, bis es aktiv rausgeholt wird, und vorher kommst du auch an die anderen nicht ran. Das macht auch Sinn - für den Fall, dass du eine vernünftige Fehlerbehandlung planst, wäre es zum Beispiel extrem ungünstig, wenn du nicht mehr an die Daten, die den Fehler verursacht haben, herankommst. Dementsprechend musst du cin mitteilen, dass er seinen Puffer leeren soll, was du mit der Methode ignore(..) tun wirst. Beispiel:

C++:
int ergebnis;
do {
    cin.clear();   //stream-state flags zurücksetzen, damit cin.fail() nicht weiter true zurück gibt
    cin.ignore(); //im Puffer verbleibende Zeichen ignorieren (wegschmeissen)
    cin >> ergebnis; //einlesen
} while(cin.fail()); //solange, bis das Einlesen des ints hingehauen hat

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.03.2003, 12:15 Uhr
~Tesla
Gast


Also ich glaube nicht das ich dir helfen kann, aber vieleicht wenn du hier mal was nachlesen willst, das hat mir bei meinen Fragen meistens geholfen...
www.highscore.de/cpp/einfuehrung/variablen.html
Ich meine was die Variablen definition, und den Speicherzugriff angeht....
Also hoffe das hilft?
MFG Tesla
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: