Tandis que les boucles avec minuterie en c++
Je suis en train de créer une boucle while que lorsque la chaîne de condition ou de la minuterie condition est remplie, le programme va sortir de la boucle et imprimer le résultat souhaité. Et lors de l'impression de la sortie souhaitée, la sortie contient la différence de temps avant et après la comparaison de la réponse.
Mais la boucle ne s'exécute pas la façon dont je l'attend. Si quelqu'un peut m'aider à comprendre où est le problème avec ce morceau de code?
Ci-dessous mon code:
void startGame(time_t cd,int gl){
string guessWord;
time_t start, end, diff,timeLeft;
cout << "Scrambled word is " << randomizeWord(gl) << endl;
while (timeLeft != cd || guessWord.compare(originalWord) == 0)
{
start = time(0);
cout << "You have " << cd << " seconds to guess." << endl;
cout << "Enter guess : ";
cin >> guessWord;
end = time(0);
diff = end - start;
//total_time = total_time + diff;
timeLeft = cd - diff;
if(guessWord.compare(originalWord) != 0)
{
cout << "WRONG! Attempt ... You have " << timeLeft << "seconds left... Try Again" << endl;
cout << "Enter guess : ";
cin >> guessWord;
}
else
{
cout << "You are CORRECT! "<< timeLeft <<" seconds left. Your timing is "<< diff <<" seconds." << endl;
break;
}
}
}
- Changement:
timeLeft >= cd
- Ne pas le faire
guessWord.compare(...)
deux fois, l'une dans le corps de la boucle et un dans la condition de la boucle. L'utilisation d'un "réussi" à la variable. Si l'un dans le corps de la boucle réussit, définissez cette variable à true. Dans la condition de la boucle, utilisez!succeeded
. Le temps de la condition de la boucle doit être écrit plus clairement, trop - je ne comprenais pas, après l'avoir regardé pendant cinq secondes, et c'est un signe rouge les conditions de boucle. Aussi,cd
est un mauvais choix pour un nom de paramètre. - Merci je l'ai fait. Mais mon problème persiste toujours. - Je entrer une mauvaise réponse la 1ère fois et que le programme est censé continuer à m'invite pour la réponse. Puis-je entrer une réponse incorrecte 2ème temps, il justs casse la boucle.
- Vous avez besoin de déboguer votre code. Si il n'est pas clair pour vous ce qui se passe, utilisez les messages de trace pour vous aider.
- par corps de boucle en u qui fait référence à la "tandis que" la boucle et de la condition de boucle u se référant à la "if-else" déclaration?
- Pour commencer, vous pouvez initialiser
timeLeft
avant lawhile
. Comme l'écrit, vous avez un comportement indéfini. - Le corps de la boucle sont toutes les lignes contenues entre
while (timeLeft != cd || guessWord.compare(originalWord) == 0)
et la}
qui ferme le tout. - Oh, et comme @James dit que vous devriez toujours, toujours, toujours initialiser vos variables. Vous ne devez jamais travailler avec une variable non initialisée.
Vous devez vous connecter pour publier un commentaire.
Condition explication
Changer votre condition de boucle trop:
Vous sortir si l'une des conditions n'est pas vérifiée. C'est parce que le résultat de la
&&
est faux si l'une des conditions d'échec. De sorte que cela va continuer touta)
il Vous reste du temps etb)
vous n'avez pas deviné le mot. Yur utilisation de||
fera de continuer la boucle si l'une est vraie (donc les deux ont à l'échec de la boucle de sortie).Note
: Personnellement, je pense extra accolades()
sont agréables à entendre pour rendre l'expression plus lisible pour l'homme. Pour un inexpérimenté programmeur, ils n'auront pas besoin de deviner(look-up) à l'ordre de préséanceDe Temps De Calcul:
confuses
mais cherche peut-être laides et donc plus difficile à lire. Vous devez équilibrer les deux et la situation et pour les grandes expression briser en plusieurs petites expressions intermédiaires bien nommé variables.Votre heure de Départ et de fin des temps les deux sont de temps(de 0) que pourrait être le problème.
time(0)
vous êtes tout simplement la fourniture d'un pointeur null à la place d'untime_t*
. Cela aura pour résultat l'obtention de l'heure en cours avant et après, je crois que c'est ce que l'OP est en train de faire.Comme @JoshGreifer dit, vous devez d'abord changer
timeLeft != cd
àtimeLeft > cd
(ou>=
, mais je voudrais aller avec l'ancien).En outre, avant d'aborder un bug, je vois un problème avec votre programme en ce que si l'utilisateur prend beaucoup de temps et
diff > cd
, puistimeLeft
sera négatif. Il va encore permettre à l'utilisateur d'un autre imagine, parce que laif(guessWord.compare(originalWord) != 0)
condition est toujours remplie.Dans ta boucle while, vous vérifiez
guessWord.compare(originalWord) == 0
avant une supposition a été faite (mais c'est bien parce que c'est nul). Vous êtes également à la vérification detimeLeft != cd
avanttimeLeft
a été initialisé.Je ne vois pas où vous sont en cours d'initialisation
originalWord
, merci de poster le code pertinent. Est-il une variable globale? Si oui, ce pourrait être la source de votre erreur.Hé les gars, son travail maintenant, après avoir fait quelques modifications merci donc de prendre un coup d'oeil à ma réponse et me dire si il y a autre chose que je doit changer la logique ou de la façon dont je le code de mon programme. Si je peux apprendre à coder des programmes à l'avenir le droit chemin.
Ci-dessous le nouveau code est:
}