2016-06-07 5 views
3

Ich bin neu in der Programmierung, und ich versuche, C++ selbst zu lernen, und ich folge "Programmierungsprinzipien und Praxis mit C++".Warum wartet "keep_window_open()" nicht auf die Eingabe eines Zeichens?

Ich habe versucht, eine Übung zu tun, die nach verschiedenen anderen Schritten, mich

"zu

gefragt ... dem Körper der Schleife ändern, so dass es nur ein Doppel jedes Mal liest. Definieren Sie zwei Variablen, um zu verfolgen, welcher der kleinste und welcher der größte Wert ist, den Sie bisher gesehen haben .. Schreiben Sie den Wert jedes Mal durch die Schleife. Wenn es der kleinste Wert ist, schreiben Sie den kleinsten so weit nach der Zahl es ist das größte bisher, schreibe das größte bisher nach der Zahl ".

Ich schrieb den folgenden Code so weit:

#include<iostream> 
#include<string> 
#include<vector> 
#include<algorithm> 
#include<cmath> 
using namespace std; 
inline void keep_window_open() { cout<<"\nType a character to exit: "; char ch; cin>>ch; } 

int main() 
{ 
double val1 = 0, smallest = 0, largest = 0; 
int flag = 0; 
while (cin >>val1) { 
    if (val1=='|') 
     break; 
    else 
     cout <<val1 <<'\n'; 
    if (flag==0) { 
     smallest = val1; 
     cout <<smallest <<" it's the smallest value so far.\n"; 
    } 
    if (val1<smallest) { 
     smallest = val1; 
     cout <<smallest <<" it's the smallest value so far.\n"; } 
    else if (val1>largest) { 
      largest = val1; 
      cout <<largest <<" it's the largest value so far.\n"; } 
    ++flag; 
} 

keep_window_open(); 

return 0; 
} 

Mein Problem ist, dass, wenn ich Eingabe eines Zeichens, z ‚C‘, das Programm beendet, obwohl das Programm sollte, hypothetisch beenden, nur wenn ich eingeben ‚|‘, und ich bekomme:

c 

Type a character to exit: 
Process returned 0 (0x0)  execution time : ... 
Press any key to continue. 

und "keep_window_open()" warte nicht, bis ein Zeichen eingegeben werden. Ich kann einfach nicht verstehen, was passiert und warum. Hat jemand eine Ahnung?

Antwort

0

Nun, ich denke, das Problem liegt in der Art, wie Sie Ihren Loop-Ausdruck definiert haben. Weder cin noch sein Operator ">>" geben einen Wahr/Falsch-Wert zurück, mit dem Sie arbeiten können. Sie geben ein iStream-Objekt zurück, das durch ein automatisiertes Casting, das hinter den Vorhängen passiert, eine zweifelhafte Übersetzung in wahr oder falsch ist. Sie geben jedoch null zurück, wenn die Eingabe nicht innerhalb Ihrer Variablen gesetzt werden kann, wie im Fall, dass versucht wird, "c" in ein Double zu setzen, und null in false umwandelt.

Was ich für Sie vorschlagen, ist eine einfache while (true) Schleife zu erstellen und wenn Sie das "|" Zeichen vom Benutzer (als String) brechen Sie die Schleife. Bis dahin läuft die Schleife weiter. dann innerhalb der Schleife parsen Sie Ihren Wert und arbeiten Sie nach Ihrer Logik (Minimum/Maximum)

0

Problem

while (cin >>val1) liest Eingang in ein Doppel. Wenn Sie etwas eingeben, das nicht als Doppel gelesen werden kann, wie "|" Dann wird dies fehlschlagen und Ihre Schleife beendet werden.

Sie versuchen dann, mehr Eingabe zu lesen, während sich cin in einem Fehlerzustand befindet.

Lösung

Anruf cin.clear() zunächst alle Fehlerflags zu löschen und cin.ignore(1000, '\n') dann in dem Eingangsstrom hängen etwas wegzuwerfen links.

inline void keep_window_open() 
{ 
    cout << "\nType a character to exit: "; 
    char ch; 

    cin.clear(); 
    cin.ignore(1000, '\n'); 
    cin >> ch; 
} 

Hinweis

if (val1=='|') 
    break; 

Dieser Code wird da nie wahr sein, wenn Sie Eingabe versuchen, die Pipe-Zeichen Ihrer while-Schleife, bevor fällt durch immer darauf zu bekommen.