PDA

Afficher la version complète : [Réglé] débutant coince sur boucle do while



moniroje
19/02/2013, 19h06
Le job que je suis en train de faire
avec beaucoup de comments qui (me) montrent ce que je fais ou veux faire:


#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;
// page 139 du tuto
int main()
{
// lettre d'un mot tirée aléatoirement
string motMystere ("mysteres"); // ne pas oublier les guillemets!
// je préserve mysteres dans la variable solution car motMystere va être par la suite traficoté:
string const solution (motMystere);
// faut aussi créer un string motMelange qui montrera au joueur 2 le mot-mystere
string motMelange ("sans nom");
int position (); // déclaré ici car while qui en a eu besoin a fait error
// maintenant une boucle do while:
do
{
srand (time(0));
int position = rand() % motMystere.size(); /* motMystere.size() donne le nb de lettres que
contient le mot mystère
rand (): la machine choisit au hasard (random) */
cout <<"Lettre prise au hasard: "<< motMystere [position];
/* essai: il a choisi t; donc ça marche
mais il ne me de dit pas que c'est la cinquième case du tableau!
faut maintenant mettre ce motMystere [position] dans une variable motMelange */
motMelange = motMystere [position];
//puis retirer la lettre qui a été piochée pour éviter qu'elle ne soit à nouveau choisie:
motMystere.erase (position,1) ; // je demande qu'il efface 1 lettre, celle qui est à position
}

//} while (position <= motMystere.size()) ;
/* zut! error: 'position' was note declared in this
scope; vais déclarer cette variable avant la ligne do
zut encore error: ISO C++ forbids comparison between pointer and integer; vais commenter devant
ce while pour le laisser en mémoire et y revenir plus tard pour voir ce qui ne va pas.
la condition après le mot while: faire cette boucle do tant que
position est inférieur ou égal à la taille du tableau motMystere */
//while (position <= 7);
/* je sais que le mot-mystère est constitué de 8 lettres alors 8-1
ici aussi error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
donc il n'aime pas que j'utilise position */
while (motMystere.size() = 0); /* la condition est: si le nb de lettres =0
grrr, là encore il me balance error lvalue required as left operand of assignment */
cout << "Le mot-mystere à découvrir est: " << motMelange << endl;

return 0 ;
}
et si je fais while (motMystere.size(0) il me dit error: no matching function for call to 'std::basic_string<char>::size(int)'
Bon, là, je sèche.

linux5623
19/02/2013, 20h04
while (motMystere.size() = 0); /* la condition est: si le nb de lettres =0



Cette ligne est fausse !
Le = utilisé seul est pour l'affectation

a = 10;

Pour l'égalité il faut le doublé


motMystere.size() == 0

moniroje
19/02/2013, 21h37
Super!!! ça a marché!
merci linux 5623
mais heu... ça n'a pas marché comme je voulais; il m'a sorti cela:

lettre prise au hasard: yLe mot mystere à découvrir est:y
je voulais qu'il retire y de motMystere qu'il le mette dans le string motMelange
puis, boucle, qu'il retire une autre lettre de motMystere pour la mettre dans motMelange
et ce jusqu'à ce qu'il n'y ait plus de lettre dans motMystere
puis qu'il affiche: Le mot mystère à découvrir est : yeersmst par exemple.
Bon, vais réfléchir... mais hou que c'est compliqué!!!

linux5623
19/02/2013, 21h57
Alors il y a deux erreurs dans ton code !

Dans un

while { } do ( )

On reconnence tant que la condition est vrai et on sort si elle est fausse !!!

Et dans ton code
motMelange = motMystere [position]; motMelange ne vaut pas la concatenation des lettres prises au hasard mais la derniére choisie !

moniroje
20/02/2013, 18h18
:D oufff!!! j'ai réussi!!!
grâce à toi.... mais j'y ai mis le temps, nom de nom!
Tiens, pour le plaisir, je vous montre mon job qui fonctionne:

#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;
// page 139
int main()
{
// lettre tirée aléatoirement d'un mot-mystère
string motMystere ("mysteres");
// je préserve mysteres dans la variable solution car motMystere va être par la suite traficoté:
string const solution (motMystere);
/* faut aussi créer un string motMelange qui montrera au joueur 2 les lettres du mot-mystere en
désordre : */
string motMelange; // une chaîne vide: page 125 en bas
int position ();

/* une boucle; avec do... while, on recommence la boucle tant que la condition est vraie et on
sort si elle est fausse (linux5623) */
do
{
srand (time(0));
int position = rand() % motMystere.size(); /* motMystere.size() donne le nb de lettres que
contient le mot mystère
rand (): la machine choisit au hasard (random) */
cout <<"Lettre prise au hasard: "<< motMystere [position]<< endl;
/* faut maintenant mettre ce motMystere [position] dans une variable motMelange: */
motMelange += motMystere [position]; // j'ajoute à la chaîne vide motMelange la lettre
//puis retirer la lettre qui a été piochée pour éviter qu'elle ne soit à nouveau choisie:
motMystere.erase (position,1) ; // je demande qu'il efface 1 lettre, celle qui est à position
// maintenant, recommencer la boucle avec une autre lettre du motMystere
} while (motMystere.size() > 0); // on recommence la boucle tant que la taille est supérieure à 0

cout << "Le mot-mystere à découvrir est: " << motMelange << endl;


return 0 ;
}

qui donne ceci en console:1614
merci à toi linux5623, hi hi...

linux5623
20/02/2013, 19h29
Il reste juste un petit défaut la ligne srand(time(0)); ne devrait pas être dans la boucle !

Ca fonctionne mais c'est un coup à se retrouver avec des valeurs pas aléatoires.

moniroje
20/02/2013, 20h08
ah bon???
OK, vais y réfléchir demain; là, mon neurone est épuisé et vais le laisser reposer avec une bière devant la téloch.
Mais j'en profite pour une question qui me travaille:
j'ai adopté l'IDE CodeBlocks selon les conseils du site du zéro où j'ai acheté mon bouquin C++.
L'ennui, c'est que avec Suse, il ne fonctionne pas bien (CPU à donf + ventilos).
J'ai vaguement essayé kdevelop; surprise, les extensions de fichiers ne sont pas les mêmes; je ne peux donc utiliser avec kdevelop ce que j'ai fait avec CodeBlocks.
Coup d'oeil sur QtCreator; là encore, ça diffère; chacun son truc.
Et pour un néophyte comme ma pomme, avaler un tuto de chaque IDE, dur à avaler quand il faut déjà s'initier au C++
N'y a-t-il pas moyen de faire du C++ sans pour cela être tributaire d'une IDE ? moyen pour néophyte s'entend...

velo_love
20/02/2013, 21h52
Bonsoir,

N'y a-t-il pas moyen de faire du C++ sans pour cela être tributaire d'une IDE ? moyen pour néophyte s'entend...
Un traitement de texte de base (emacs, nedit, vim, ...) + une fenêtre terminal pour lancer les commandes :

g++ -Wall mon_programme.cpp -o mon_programme
./mon_programme
suffisent pour un apprentissage du c++ quand on n'a pas une tonne de fichiers à gérer mais seulement un par exemple d'apprentissage.