bonjour, je suis en apprentissage C++, j'ai besoin d'aide pour la compilation d'un " Tant que( while) et Cie."
Mais je comprends pas l'erreur. Merci pour votre aide ,meme simple vous parait-il...
![]()
bonjour, je suis en apprentissage C++, j'ai besoin d'aide pour la compilation d'un " Tant que( while) et Cie."
Mais je comprends pas l'erreur. Merci pour votre aide ,meme simple vous parait-il...
![]()
Bonjour,
Il y a en effet des erreurs:
- tu n'as pas compris la syntaxe d'un do { sequence } while(condition_pour_recommencer);. Il n'y a jamais d'expression en parenthèse après le do, c'est toujours après le while. Et peut-être voulais-tu faire un simple if?
- Pour tester si deux chaines sont égales, on ne peut pas écrire "reponse" == "oui", reponse est une variable et "oui" une chaîne. Aucune raison de mettre des guillemets autour d'une variable.
- Pour que reponse contienne la réponse, il faut la mettre à un moment. Il n'y a aucune magie qui fasse que reponse se remplisse spontanément avant la comparaison.
- tu n'as pas compris comment fonctionne un switch(expression_a_rechercher) { case X: .......}. Après chaque case il faut mettre une constante qui peut être un nombre entier ou un caractère, il sera comparé à ce qui est entre les parenthèse du switch, rien d'autre.
Il y a peut-être d'autres erreurs. Le code doit être mis entre balises (bouton [ # ]), merci d'éviter les copies d'écran c'est très pénible à lire, et empêche de te donner de réponses précises.
Merci, dalfab,
mon but est de crée un boucle variée:
-faire .... si la réponse est "oui" (recommencer le programme entièrement+remise a 0)
-initier le compteur
-*saisir char
-décompte du compteur -1
-comparaison du char (oui afficher+demander une réponse , non...-->
-->>comparaison du char (oui afficher - non afficher)
-vérification d'un compteur
=0 ->sortie de boucle +demander une réponse
!=0 ->recommencer la saisie*)
(réponse = oui -->recommencer et ré-initier le compteur
non --> sortie du prog.)
si ca peut t'aider a me corriger.
si t'as des conseils la dessus
Salut, et bienvenue sur le forum
D'abord et avant tout : au lieu de t'emm..der à créer des image de tes différentes fenêtre, lorsque tu dois présenter du code, pourrais tu utiliser le bouton en forme de # qui se trouve juste au dessus de la zone d'édition de ton message (sur la droite de la deuxième ligne de bouton) et faire un copier coller de ton code entre les balises [ CODE ] et [ /CODE ] qui apparaitront
Cela mettra permettra de montrer ton code, en respectant la mise en forme et en proposant une coloration syntaxique de manière plus sympa, parce que cela nous permettra, à nous, de faire un copier coller de ton code au besoin afin de l'analyser à notre aise de notre coté
En faisant une sélection au niveau de la ligne de commande de windows et en appuyant sur les touche <ctrl> + C, tu pourras d'ailleurs utiliser le même principe pour nous indiquer les erreurs émises lors de la compilation![]()
Ceci étant dit : C++ est un ensemble de conventions qui doivent -- comme le français -- impérativement être respectées si on veut que tous les interlocuteurs se comprennent : si tu demandes le "machin" à quelqu'un, il y a peu de chance qu'il te passe la cuiller que tu souhaite avoir! C'est exactement la même chose en C++ : si tu donne une instruction qu'il ne comprend pas au compilateur, il n'y a aucune chance qui accepte ce que tu lui dit
Par exemple, C++ fournit -- comme beaucoup d'autres langages d'ailleurs -- (entre autres) les trois sortes de boucles "classiques", à savoir:
- Les boucles "tant que", qui vérifient si il faut entrer dans la boucle AVANT d'exécuter les instructions de la boucle
- les boucles "jusque", qui vérifier s'il faut entrer "une fois de plus" dans la boucle après que les instructions qu'elle contient aient été exécutées et
- les boucles "pour" qui permettent de compter le nombre de passage dans la boucle, et qui s'arrêtent quand le compteur atteint une certaine valeur
Les boucles "tant que" vont prendre une forme proche deavec la particularité que, si la condition pour entrer dans la boucle est fausse dés le départ, la boucle ne sera jamais exécutée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 while(<condition_pour_entrer_dans_la_boucle>){ // Ce qu'il faut faire }
Les boucles "jusque" vont prendre une forme proche deavec la particularité le fait que la boucle sera au moins exécutée une fois (avant que la condition ne soit vérifiée)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 do{ // ce qu'il faut faire }while(<condition_pour_retourner_dans_la_boucle); // !!! n'oublie pas le ;
et les boucles "pour" vont prendre une forme proche deavec comme particularité le fait que la boucle sera exécutée le nombre de fois que l'on pourra passer "à la valeur suivante" à partir de "la valeur de départ" en respectant la "condition pour continuer".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 for(<type> <variable> = <valeur_de_depart>; <condition_pour_continuer>; <calcul_valeur_suivante>){ // ce qu'il faut faire }
Comme tu peux le voir, il n'y a absolument aucune possibilité dans laquelle nous aurions un code proche deIl faut donc commencer par résoudre ce problème en utilisant une des formes de boucle que le compilateur pourra accepter
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 do (condition){ ce qu'il faut faire } while
Ensuite, il faut faire attention au guillemet ", car ils permettent de créer ce que l'on appelle une "chaine littérale". Ainsi, lorsque tu écris le code "reponse" tu crée une chaine de caractères qui contient explicitement les caractères 'r','e','p','o','n','s' et 'e', ce qui n'a absolument rien à voir avec la variable nommée reponse que tu veux justement utiliser pour ton test
Si tu veux tester la valeur d'une variable qui est de type std::string, le test doit prendre la forme de if(nom_de_la_variable == "valeur souhaitée")En outre, le switch ... case ne s'utilise absolument pas comme un test normal, et pour cause : c'est un test dit "à choix multiple": pour une variable donnée, on peut indiquer "plusieurs valeurs" qui permettent d'activer des comportements différents.
La particularité de ce genre de test, c'est que la variable testée doit obligatoirement représenter une valeur numérique entière. La chance, c'est que le type char représente effectivement une valeur numérique entière (correspondant, pour faire simple, à l'indice du "glyphe" représenté dans une table de caractères). Mais le seul moyen d'utiliser ce genre de test serait proche deAu passage, tu remarqueras que, pour indiquer la valeur d'un caractère unique, on doit utiliser l'apostrophe ' au lieu des guillemets doubles ".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 switch (c){ case 'd' : // ce qu'il faut faire si la variable c représente le caractère d break; case 'f' : // ce qu'il faut faire si la variable c représente le caractère f break; /* ... */ default : // ce qu'il faut faire si la variable c représente n'importe quelle valeur non prise en compte }
Enfin, on essayera -- autant que possible -- de déclarer les différentes variables aussi près que possible de leur première utilisation, et, si possible, on essayera de leur donner un nom qui correspond à ce que l'on attend de leur part.
Au final, ton code devrait donc ressembler à quelque chose comme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 int main(){ /* parce que la réponse doit exister au moment du while */ std::string reponse; do{ int count=0; /* parce que l'on a 5 coups maximum */ while(count <5){ /* ce qu'il faut faire tant que nous sommes sur l'un des cinq coup acceptés * par exemple, accepter un caractère */ char choix; /* bla bla */ if(choix <'k'){ // si choix est plus petit que k } else{ // sinon, c'est qu'il est plus grand ou égal à k } } /* arrivé ici, les cinq coups on été joués, que faut-il faire? */ }while(reponse == "oui"); /* arrivé ici, reponse est different de "oui", on va donc quitter l'application */ return 0; }
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Bonjour,
Merci pour ces conseils Koala01;
je comprends que la logique doit être TRÈS claire pour la programmation , mais beaucoup de terme a respecter ,
et j'y prends très plaisir a faire( même si a des erreurs....). c'est le début.
Voici mon code : ....corriger ?:
Mais comme tu peux le voir, c'est pas encore cohérent. je doute sur un "switch" ou "if".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 #include <iostream> #include <string> int main() { std::string reponse; do{ int count=0; while(count < 5) { char c; std::cout << " Saisir une lettre : "; std::cin >> c; count = count + 1; if(c == 'k') { std::cout << "gagne" << std::endl; std::cout << "recommencer ?" << std::endl; std::cin >> reponse >> std::endl; } else if( c > 'k') { std::cout << "en dessous" << std::endl; std::cout << "perdu" << std::endl; std::cout << "recommencer ?" << std::endl; std::cin >> reponse >> std::endl; } else { std::cout << "au dessus" << std::endl; std::cout << "perdu" << std::endl; std::cout << "recommencer ?" << std::endl; std::cin >> reponse >> std::endl; } if (count == 5) { std::cout << "perdu" << std::endl; std::cout << "recommencer ?" << std::endl; std::cin >> reponse >> std::endl; } } }while(reponse == 'oui'); /* je dois recommencer le prog + remise a 0 du "count" / - je copie a nouveau le code ? */ return 0; }
Pour le "switch" , je n'ai pas tellement de "default"... ou dois je le présenter autrement ?
Merci encore pour ton aide.
Ce qu'il faut comprendre, c'est que l'ordinateur, c'est un brave petit soldat qui va faire exactement ce qu'on lui dit, sans se poser la moindre question: si on lui dit de sauter, il va sauter. Sans se poser de question. Peu importe si, devant lui, il y a le vide, il sautera quand même.
Le code que tu écris pour lui indiquer ce qu'il doit faire doit donc suivre une logique totalement imparable si tu veux qu'il puisse réagir exactement de la manière don tu t'y attend
Alors, dis moi : lorsque tu as une boucle qui s'assure un compteur (count) est "plus petit que cinq" (c'est exactement ce que tu indique avec le code while count < 5)), quelle chance y a-t-il que, dans la boucle, un test qui s'assure explicitement que count est égal à 5 (c'est ce que tu fais avec la ligne if(count == 5) qui est l'une des instructions effectuée dans la boucle) puisse donné un résultat autre que "faux"
Pire encore, si tu suis la logique "ligne par ligne", et que tu rentre plusieurs fois dans la boucle, quelle sera la valeur de count au moment où toutes les instructions comprises dans la boucle (while(count < 5) ) auront été exécutéesEst-ce que le test effectué pour déterminer s'il faut entrer dans la boucle a la moindre chance de donner un résultat autre que vrai
Dans le même ordre d'idée, c'est très bien d'avoir une boucle "jusqu'à" qui s'assure teste la valeur de réponse, mais, quelle est cette valeur au moment du test
Quand tu auras répondu à ces questions et que tu auras corrigé le code en conséquence, tu auras sans doute la réponse aux questions que tu te poses juste avant le return 0![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Partager