Bonjour,
Je suis toute nouvelle dans l'apprentissage du C++.
Sur un TP d'un site connu j'ai été amenée à réaliser deux codes très basiques de C++. Ces deux codes feront rire les professionnels de ce forum mais pour moi c'est un démarrage essentiel. Je me suis débrouillée toute seule et les deux codes fonctionnent parfaitement ( même si cela m'a pris beaucoup de temps ). Ainsi, j'ai pensé que j'étais faite pour la programmation. Je pense avoir un esprit logique sinon je n'aurais pas pu avancer.
Le premier code consiste à bouleverser l'ordre des lettres d'un mot et le transformer en anagramme.
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
|
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <fstream>
using namespace std;
string fonctionMelange (string motMystere)
{
string melange ;
int x(0);
int nombreAleatoire(0);
int nombreDeLettres(0) ;
nombreDeLettres = motMystere.size() ;
for (x = 0 ; x < nombreDeLettres ; x++)
{
nombreAleatoire = rand() % motMystere.size() ;
melange += motMystere[nombreAleatoire] ;
motMystere.erase(nombreAleatoire,1) ;
}
return melange ;
}
int main()
{
srand (time(0)) ;
string leMotMystere, motMelange, motUtilisateur;
cout <<"Saisissez un mot "<< endl ;
cin >> leMotMystere ; // saisie du mot mystère
cout << leMotMystere << endl ;
motMelange = fonctionMelange(leMotMystere) ;
do
{
cout << motMelange << endl ;
cout <<" ? " << endl ;
cin >> motUtilisateur ;
if ( motUtilisateur == leMotMystere)
{
cout <<"C'est le mot juste, bravo !" << endl ;
}
else
{
cout <<"Ce n'est pas le mot " << endl ;
}
} while ( motUtilisateur != leMotMystere ) ;
return 0;
} |
Le second code est simple aussi, il prend un mot au hasard dans une liste de mots ( un fichier ). Je l'ai mis en pièce jointe dans ce message.
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
| #include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
srand (time(0)) ;
ifstream fichier("dico2.txt") ;
string ligne ;
if(fichier)
{
int a (0), b(0) ;
int nombreAleatoire(0);
while ( getline( fichier, ligne))
{
a++ ;
}
fichier.clear() ;
fichier.seekg(0,ios::beg) ;
cout << "a : " << a << endl ;
nombreAleatoire = rand () % a ;
cout << "nombre aleatoire : " << nombreAleatoire << endl ;
for( b=0 ; b < nombreAleatoire ; b++)
{
getline( fichier, ligne) ;
}
cout << ligne << endl ;
}
else
{
cout << "ERREUR: Impossible d'ouvrir le fichier en lecture." << endl;
}
return 0;
} |
Si vous les essayez, vous verrez que mes deux codes fonctionnent parfaitement.
Maintenant, j'associe les deux codes en un seul. Au lieu d'écrire un mot dont l'ordre des lettres sera changé, j'automatise la recherche aléatoire d'un mot dans la liste. Rien de plus basique ! Ensuite, l'ordre des lettre sera changé.
J'ai dû ajouter la ligne 78 pour rapporter la chaîne string de la liste et la rendre compréhensible pour la suite du programme.
Tout va bien ! C'est la partie la plus simple comparée à trouver les codes de chaque fonction.
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 66 67 68 69 70 71 72 73 74 75 76 77
| #include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <fstream>
using namespace std;
string fonctionMelange (string motMystere)
{
string melange ;
int x(0);
int nombreAleatoire(0);
int nombreDeLettres(0) ;
nombreDeLettres = motMystere.size() ;
for (x = 0 ; x < nombreDeLettres ; x++)
{
nombreAleatoire = rand() % motMystere.size() ;
melange += motMystere[nombreAleatoire] ;
motMystere.erase(nombreAleatoire,1) ;
}
return melange ;
}
int main()
{
srand (time(0)) ;
string leMotMystere, motMelange, motUtilisateur;
//cout <<"Saisissez un mot "<< endl ;
ifstream fichier("dico2.txt") ;
string ligne ;
if(fichier)
{
int a (0), b(0) ;
int nombreAleatoire(0);
while ( getline( fichier, ligne))
{
a++ ;
}
fichier.clear() ;
fichier.seekg(0,ios::beg) ;
cout << "a : " << a << endl ;
nombreAleatoire = rand () % a ;
cout << "nombre aleatoire : " << nombreAleatoire << endl ;
for( b=0 ; b < nombreAleatoire ; b++)
{
getline( fichier, ligne) ;
}
leMotMystere = ligne ;
//
}
else
{
cout << "ERREUR: Impossible d'ouvrir le fichier en lecture." << endl;
}
//cin >> leMotMystere ; // saisie du mot mystère
cout << leMotMystere << endl ;
motMelange = fonctionMelange(leMotMystere) ;
do
{
cout << motMelange << endl ;
cout <<" ? " << endl ;
cin >> motUtilisateur ;
if ( motUtilisateur == ligne )
{
cout <<"C'est le mot juste, bravo !" << endl ;
}
else
{
cout <<"Ce n'est pas le mot " << endl ;
}
} while ( motUtilisateur != leMotMystere ) ;
return 0;
} |
Tout devrait logiquement bien se passer ! Eh bien non, rien ne se passe comme prévu. Sous prétexte que l'origine du mot dont on change les lettres n'est plus la même ( un fichier au lieu de la fonction cin ) on obtient du n'importe quoi :
Le mot mélangé est tronqué.
La ligne
if ( motUtilisateur == ligne )
ne marche plus puisque les deux variables sont absolument identiques mais le programme ne reconnait plus cette égalité. Ben voyons. Où est la logique là dedans ?
Je croyais que le point fort du C++ c'était d'être logique. Je ne suis plus capable de comprendre ce qui m'arrive mais je suis dévastée. Face à un problème qui me dépasse alors que vous avez réussi à atteindre les sommets, je vais abandonner le C++
Quelqu'un peut m'expliquer pourquoi ça ne marche pas ?
Je vous remercie d'avance
Partager