2016-06-07 1 views
3

Je suis novice en programmation, et j'essaie d'apprendre le C++ par moi-même, et je suis "Programmation des principes et de la pratique en utilisant C++".Pourquoi "keep_window_open()" n'attend pas qu'un caractère soit entré?

Je tentais de faire un exercice qui, après diverses autres mesures, m'a demandé de

"... changer le corps de la boucle de sorte qu'il se contente de lire une double chaque fois. Définir deux Les variables à suivre sont les plus petites et la valeur la plus grande que vous ayez vue jusqu'à présent.Si vous écrivez la valeur chaque fois, écrivez la plus petite valeur possible jusqu'à présent. c'est le plus grand jusqu'ici, écrivez le plus grand jusqu'ici après le nombre ".

j'ai écrit le code suivant à ce jour:

#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; 
} 

Mon problème est que quand je entrer un caractère, par exemple « C », le programme se termine, bien que le programme devrait se terminer, hypothétiquement, que quand je rentre « | », et je reçois:

c 

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

et "keep_window_open()" n'attend pas un caractère à saisir. Je ne peux pas comprendre ce qui se passe, et pourquoi. Est-ce que quelqu'un a une idée?

Répondre

0

Eh bien, je pense que le problème réside dans la façon dont vous avez défini votre expression de boucle. Ni cin ni son opérateur ">>" ne renvoient une valeur true/false avec laquelle vous pouvez travailler. Ils retournent un objet iStream qui pourrait être une traduction douteuse à true ou false via un casting automatisé qui se passe derrière les rideaux. Ils renverront cependant null quand l'entrée ne peut pas être placée dans votre variable comme dans le cas d'essayer de mettre 'c' dans un double, et null se traduit par faux. Ce que je suggère pour vous est de créer une simple boucle while (true) et quand vous obtenez le "|" caractère de l'utilisateur (sous forme de chaîne) vous cassez la boucle. jusque là la boucle continue. puis à l'intérieur de la boucle analyser votre valeur et travailler dessus selon votre logique (minimum/maximum)

0

Problème

while (cin >>val1) lit entrée dans un double. Si vous entrez quelque chose qui ne peut pas être lu comme un double comme "|" alors cela échouera et provoquera la sortie de votre boucle.

Vous essayez ensuite de lire plus d'entrée pendant que cin est dans un état d'erreur.

Solution

Appel cin.clear() d'abord effacer les drapeaux d'erreur et cin.ignore(1000, '\n') de jeter quoi que ce soit laissé suspendu dans le flux d'entrée.

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

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

Remarque

if (val1=='|') 
    break; 

Ce code ne sera jamais vrai parce que si vous essayez d'entrer le caractère pipe votre boucle while tombera par avant jamais arriver à lui.