Après avoir fini de construire le code d'un quiz qui consiste à saisir un mot, l'afficher, le mélanger et demander à le réécrire tant qu'il n'a pas été saisi comme à l'origine, j'ai remarqué que le mot saisi au départ s'affichait deux fois alors que visiblement cela n'est demandé nulle part dans ledit code :
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;
void melangerLettres(string *mot);
int main()
{
//1 : On demande de saisir un mot
cout << "Saisissez un mot a l abri des regards : ";
string motMystere;
cin >> motMystere;
//2 : On mélange les lettres du mot
string *motMelange(nullptr);
motMelange = new string(motMystere);
melangerLettres(motMelange);
//3 : On demande à l'utilisateur quel est le mot mystère
string motUtilisateur;
while(motUtilisateur != motMystere)
{
cout << "Quel est ce mot ? " << *motMelange << endl;
cin >> motUtilisateur;
if (motUtilisateur == motMystere)
{
cout << "Bravo !" << endl;
}
else
{
cout << "Ce n'est pas le mot !" << endl;
}
}
delete motMelange;
motMelange = 0;
return 0;
}
void melangerLettres(string *mot)
{
string melange;
int position(0);
std::cout << *mot << endl;
//Tant qu'on n'a pas extrait toutes les lettres du mot
while (mot->size() != 0)
{
//On choisit un numéro de lettre au hasard dans le mot
position = rand() % mot->size();
//On ajoute la lettre dans le mot mélangé
melange += mot->at(position);
//On retire cette lettre du mot mystère
//Pour ne pas la prendre une deuxième fois
mot->erase(position, 1);
}
//On assigne le mot mélangé au pointeur
*mot = melange;
}
J'ai également testé le code proposé comme corrigé mais le résultat fût le même :
//
// main.cpp
// Priority
//
// Created by Ranga Gonnage on 15/12/2021.
//
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include "main.hpp"
using namespace std;
void melangerLettres(string *mot)
{
string melange;
int position(0);
std::cout << *mot << endl;
//Tant qu'on n'a pas extrait toutes les lettres du mot
while (mot->size() != 0)
{
//On choisit un numéro de lettre au hasard dans le mot
position = rand() % mot->size();
//On ajoute la lettre dans le mot mélangé
melange += mot->at(position);
//On retire cette lettre du mot mystère
//Pour ne pas la prendre une deuxième fois
mot->erase(position, 1);
}
//On assigne le mot mélangé au pointeur
*mot = melange;
}
int main()
{
string motMystere, motUtilisateur, *motMelange(nullptr);
//Initialisation des nombres aléatoires
srand(time(0));
//1 : On demande de saisir un mot
cout << "Saisissez un mot à l’abri des regards : ";
cin >> motMystere;
motMelange = new string(motMystere);
//2 : On récupère le mot avec les lettres mélangées dans motMelange
melangerLettres(motMelange);
//3 : On demande à l'utilisateur quel est le mot mystère
while (motUtilisateur != motMystere)
{
cout << endl << "Quel est ce mot ? " << *motMelange << endl;
cin >> motUtilisateur;
if (motUtilisateur == motMystere)
{
cout << "Bravo !" << endl;
}
else
{
cout << "Ce n'est pas le mot !" << endl;
}
}
//On recommence tant qu'il n'a pas trouvé
delete motMelange;
return 0;
}
Pourtant au début du quiz une image montre qu'un code n'a affiché le mot de départ qu'une seule fois :
De plus en essayant le code suivant qui demande le prénom de l'utilisateur puis le nombre pi pour vérifié s'il se comporte pareil, chaque saisi s'affiche qu'une seule fois comme voulu après que l'utilisateur les ait écrit contrairement aux deux précédents :
#include <iostream>
using namespace std;
int main()
{
cout << "Quel est votre prenom ?" << endl;
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
cin >> nomUtilisateur; //On remplit cette case avec ce qu'écrit l'utilisateur
cout << "Combien vaut pi ?" << endl;
double piUtilisateur(-1.); //On crée une case mémoire pour stocker un nombre réel
cin >> piUtilisateur; //Et on remplit cette case avec ce qu'écrit l'utilisateur
cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
return 0;
}
Comment pourrait-on modifier le premier code de sorte que la saisi de l'utilisateur ne s'affiche qu'une seule fois comme avec le code ci-dessus ?
Ligne 48 tu premier code ou ligne 21 du deuxième code, tu penses afficher quoi ?
Aussi, pourquoi utiliser ce pointeur sur string (Les pointeurs sont à éviter en C++), tu pouvais très bien faire en sorte que ta fonction prenne un string en entrée (mot en clair) et retourne un string (du mot mélangé).
A savoir qu'il existe aussi en C++ un algorithme qui permet de mélanger un container : std:shuffle
Il a été stupide de ma part de ne pas l'avoir vu. Je tente d'écrire une version du même code sans pointeur mais je ne suis pas certain de bien utiliser std::shuffle pour des string sachant que ma tentative de changer le code ne marche pas :
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <vector> //pour la version sans pointeur
using namespace std;
void melangerLettres(string *mot);
int main()
{
//1 : On demande de saisir un mot
cout << "Saisissez un mot a l abri des regards : ";
string motMystere;
cin >> motMystere;
//2 : On mélange les lettres du mot
string motMelange;
motMelange = motMystere;
motMelange = melangerLettres(motMelange);
//3 : On demande à l'utilisateur quel est le mot mystère
string motUtilisateur;
while(motUtilisateur != motMystere)
{
cout << "Quel est ce mot ? " << *motMelange << endl;
cin >> motUtilisateur;
if (motUtilisateur == motMystere)
{
cout << "Bravo !" << endl;
}
else
{
cout << "Ce n'est pas le mot !" << endl;
}
}
delete motMelange;
motMelange = 0;
return 0;
}
void melangerLettres(string mot)
{
std::shuffle(mot.begin(), mot.end());
shuf(mot);
}
Il semblerait que std::shuffle nécessite une façon spéciale pour être utiliser avec des string. Quelle est-elle ?
Voici le nouveau code avec deux nouvelles versions de la fonction :
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;
void melangerLettres(string mot);
int main()
{
//1 : On demande de saisir un mot
cout << "Saisissez un mot a l abri des regards : ";
string motMystere;
cin >> motMystere;
//2 : On mélange les lettres du mot
string motMelange;
motMelange = motMystere;
motMelange = melangerLettres(motMelange);
//melangerLettres(motMelange);
//3 : On demande à l'utilisateur quel est le mot mystère
string motUtilisateur;
while(motUtilisateur != motMystere)
{
cout << "Quel est ce mot ? " << motMelange << endl;
cin >> motUtilisateur;
if (motUtilisateur == motMystere)
{
cout << "Bravo !" << endl;
}
else
{
cout << "Ce n'est pas le mot !" << endl;
}
}
delete motMelange;
motMelange = 0;
return 0;
}
//void melangerLettres(string mot)
//{
// std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});
// shuf(mot);
//}
void melangerLettres(std::string &mot)
{
for(int i {0}; i < mot.size(); i++)
{
std::swap(mot[i], mot[rand()%mot.size()]);
}
}
J'ai beau commenter une version de la fonction et décommenter l'autre j'ai toujours une erreur au niveau de l'appel de la fonction alors qu'apparemment elle a été normalement écrit :
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;
void melangerLettres(string mot);
int main()
{
//1 : On demande de saisir un mot
cout << "Saisissez un mot a l abri des regards : ";
string motMystere;
cin >> motMystere;
//2 : On mélange les lettres du mot
string motMelange;
motMelange = motMystere;
//motMelange = melangerLettres(motMelange);
melangerLettres(motMelange);
//3 : On demande à l'utilisateur quel est le mot mystère
string motUtilisateur;
while(motUtilisateur != motMystere)
{
cout << "Quel est ce mot ? " << motMelange << endl;
cin >> motUtilisateur;
if (motUtilisateur == motMystere)
{
cout << "Bravo !" << endl;
}
else
{
cout << "Ce n'est pas le mot !" << endl;
}
}
//delete motMelange;
//motMelange = 0;
return 0;
}
string melangerLettres(string mot)
{
std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});
return mot;
}
//void melangerLettres(std::string &mot)
//{
// for(int i {0}; i < mot.size(); i++)
// {
// std::swap(mot[i], mot[rand()%mot.size()]);
// }
//}
Lorsque je commente "motMelange = melangerLettres(motMelange);" et décommente "melangerLettres(motMelange);" j'ai une erreur au niveau de la fonction :
Et lorsque je commente "melangerLettres(motMelange);" et décommente "motMelange = melangerLettres(motMelange);" j'ai directement une erreur à sa ligne :
#include <iostream>
#include <string>
#include <algorithm>
#include <random>
using namespace std;
string melangerLettres(string mot);
int main()
{
//1 : On demande de saisir un mot
cout << "Saisissez un mot a l abri des regards : ";
string motMystere;
cin >> motMystere;
//2 : On mélange les lettres du mot
string motMelange;
//motMelange = motMystere;
motMelange = melangerLettres(motMelange);
//melangerLettres(motMelange);
//3 : On demande à l'utilisateur quel est le mot mystère
string motUtilisateur;
while(motUtilisateur != motMystere)
{
cout << "Quel est ce mot ? " << motMelange << endl;
cin >> motUtilisateur;
if (motUtilisateur == motMystere)
{
cout << "Bravo !" << endl;
}
else
{
cout << "Ce n'est pas le mot !" << endl;
}
}
//delete motMelange;
//motMelange = 0;
return 0;
}
string melangerLettres(string mot)
{
std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});
return mot;
}
//void melangerLettres(std::string &mot)
//{
// for(int i {0}; i < mot.size(); i++)
// {
// std::swap(mot[i], mot[rand()%mot.size()]);
// }
//}
Cette fois-ci, il se lance mais le mot mélangé n'apparait pas alors que dans la boucle while, il est indiqué qu'il devrait apparaître :
Merci de la correction, les erreurs passés m'avaient poussé à commenter la ligne "motMelange = motMystere;" que j'avais finalement oublié :
#include <iostream>
#include <string>
#include <algorithm>
#include <random>
using namespace std;
string melangerLettres(string mot);
int main()
{
//1 : On demande de saisir un mot
cout << "Saisissez un mot a l abri des regards : ";
string motMystere;
cin >> motMystere;
//2 : On mélange les lettres du mot
string motMelange;
motMelange = motMystere;
motMelange = melangerLettres(motMelange);
//melangerLettres(motMelange);
//3 : On demande à l'utilisateur quel est le mot mystère
string motUtilisateur;
while(motUtilisateur != motMystere)
{
cout << "Quel est ce mot ? " << motMelange << endl;
cin >> motUtilisateur;
if (motUtilisateur == motMystere)
{
cout << "Bravo !" << endl;
}
else
{
cout << "Ce n'est pas le mot !" << endl;
}
}
//delete motMelange;
//motMelange = 0;
return 0;
}
string melangerLettres(string mot)
{
std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});
return mot;
}
//void melangerLettres(std::string &mot)
//{
// for(int i {0}; i < mot.size(); i++)
// {
// std::swap(mot[i], mot[rand()%mot.size()]);
// }
//}
Désormais le code est bien opérationnel avec la fonction string melangerLettres(string mot) :
puisque tu fais ton mot mélangé à partir de motMystere.
- Edité par rouIoude 11 juin 2023 à 18:32:21
...
Affichage en trop d'un mot dans la console
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.