PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Unbeabsichtigte Endlosschleife


pippo
2004-10-23, 19:23:59
Habe folgendes Programm geschrieben:

// Uebungsblatt 3
//

#include <iostream>
using namespace std;
short int Aufgabe, a=1, Jahr, Zahl;
char Buchstabe;


int main()
{
cout<<"Informatik I: Uebungsblatt 3\n1 - Schaltjahrueberpruefung\n2 - Art eines Buchstabens"<<endl;
cout<<"\n\nWaehlen sie die Aufgabe: "; //Auswahl der Aufgabe
cin>>Aufgabe;
switch (Aufgabe)
{
case 1: //Beginn Aufgabe 1
{
cout<<"\nGeben sie das Jahr ein: ";
cin>>Jahr;
if(Jahr%4==0)
if(Jahr%100==0&&Jahr%400!=0)
cout<<Jahr<<" ist kein Schaltjahr!\n"<<endl;
else
cout<<Jahr<<" ist ein Schaltjahr!\n"<<endl;
};
break;

case 2: //Beginn Aufgabe 2
{
cout<<"\n\nGeben sie den Buchstaben ein: ";
cin>>Buchstabe;
while(a)
{
Zahl=Buchstabe;
if(Zahl>65&&Zahl<91||Zahl>96&&Zahl<123)
{
if(Zahl==65||Zahl==69||Zahl==73||Zahl==79||Zahl==85||Zahl==97||Zahl==101||Zahl== 105||Zahl==111||Zahl==117) //Vokale
cout<<"Es handelt sich um einen Vokal!\n"<<endl;
else
cout<<"Es handelt sich um einen Konsonanten!\n"<<endl;
a--;
}
else
{
if(Zahl==-102||Zahl==-103||Zahl==-108||Zahl==-114||Zahl==-124||Zahl==-127) //Umlaute
{
cout<<"Es handelt sich um einen Umlaut!\n"<<endl;
a--;
}
else
{
cout<<"Falsche Eingabe, bitte wiederholen sie: ";
cin>>Buchstabe;
}
}
}
};
break;

default: //Ausgabe für eine falsche Auswahl der Aufgabe
{
while(a)
{
if(Aufgabe==1 || Aufgabe==2)
a--;
else
{
cout<<"Falsche Eingabe, bitte wiederholen sie: ";
cin>>Aufgabe;
}
} }
}
return 0;
}

Es sind 2 Programme in einem und mein Problem liegt im 2., genauer gesagt im Dick markierten Bereich. Jedesmal wenn ich etwas eingebe, was ausserhalb des Bereichs von "short int" ist ( einen Buchstaben oder eine große Zahl ), geht des Programm in eine Endlosschleife und spuckt immer das letzte cout aus. Wie könnte ich das ändern?

Edit: Hier noch was der Debugger ausspuckt:
'Uebung3.exe': Loaded 'C:\Dokumente und Einstellungen\Chef\Eigene Dateien\Visual Studio Projects\Uebung3\Debug\Uebung3.exe', Symbols loaded.
'Uebung3.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'Uebung3.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
The thread 'Win32 Thread' (0xdac) has exited with code -1073741510 (0xc000013a).
The program '[3736] Uebung3.exe: Native' has exited with code 0 (0x0).

Coda
2004-10-23, 20:03:33
Also das Problem ist das cin wenn es erstmal eine falsche Eingabe hat bei weiterem Aufruf einfach nichts macht.
Das kann man irgendwie abprüfen, aber wie genau weiß ich grad auch nicht. Im Stroustrup hab ich spontan auch nix gefunden :/

Trap
2004-10-23, 20:49:23
cin.ignore wäre eine Möglichkeit, getline(cin,stringvar) und dann istringstream in(stringvar) eine andere

pippo
2004-10-23, 21:34:22
Wie genau ist das cin.ignore dann anzuwenden?

Trap
2004-10-23, 21:41:08
So: http://www.cplusplus.com/ref/iostream/istream/ignore.html

In deinem Programm würd ich es so benutzen:
cout<<"Falsche Eingabe, bitte wiederholen sie: ";
cin.ignore(100000,'\n'); // alte eingabe ignorieren
cin >> Aufgabe;

pippo
2004-10-24, 03:32:19
So wie du das geschrieben hast, ändert das leider garnichts. Immernoch das gleiche wie vorher. Wenn ich morgen/heute mal zeit hab, werd ich mir das cin.ignore mal genauer ansehen

Gast
2004-10-31, 20:18:07
Wozu hast du das Programm eigentlich mit C++ geschrieben?
Du benutzt doch sowieso keine wirklichen Elemente davon - normales C hätte es auch getan.

Nur mal so...

Gast
2004-11-04, 16:32:46
Schon mal was von Spagetti-Code gehört???