IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Problème de sélection random dans un fichier externe d'une ligne pour un programme console


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Septembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : en reconversion

    Informations forums :
    Inscription : Septembre 2015
    Messages : 3
    Par défaut Problème de sélection random dans un fichier externe d'une ligne pour un programme console
    Bonjour

    Je débute en c++ et comme premier exercice je dois réaliser un jeu.
    Le jeu consiste à trouver un mot dont les lettres ont été mélangées. Le programme va chercher un mot aléatoirement dans un fichier, mélange les lettres et demande de trouver le mot. La où j'ai un problème c'est dans l'écriture de la fonction est censé aller chercher le mot aléatoirement dans le fichier.
    Vous verrez que dans mon code cette section est partiellement faite. Pourriez vous m'aider s'il vous plait? La section à problème commence au string const dico et se termine au return motMystere;. Merci d'avance.
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
     
    #include<iostream>
    #include<string>
    #include<ctime>
    #include <cstdlib>
    #include <fstream>
     
     
    using namespace std;
     
     
     
    string melangerLettres(string mot)
    {
    	string melange;
    	int position(0);
     
    	//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[position];
    		//On retire cette lettre du mot mystère
    		//Pour ne pas la prendre une deuxième fois
    		mot.erase(position, 1);
    	}
     
    	//On renvoie le mot mélangé
    	return melange;
    }
     
     
    string const dico("c:/users/dally/documents/visual studio 2015/projects/motmystereseul/dico.txt");
    ifstream monflux(dico.c_str()); // je déclare mon flux dans le fichier bibliothèque
     
    	if (monflux)
    	{
    		//je demande à cette fonction d'aller chercher une ligne du fichier aléatoirement
    		int i = 0;
    		int aleatoire = rand() % ;
    		for (i = 0; i < 323577; i++)
    		{
    			aleatoire = rand();
     
    		}
     
     
    		getline(monflux, ligne);
    		motmystere = ligne;
    	}
    	else
    	{
    		cout << "erreur : impossible d'accéder au fichier." << endl;
    	}
    	// je teste que la lecture dans la fichier est bonne
     
     
    	monflux >> motmystere; //je vais chercher un mot dans le fichier
     
    	return motMystere; //On renvoie le mot mystere
     
     
     
     
     
     
     
     
     
     
    int main()
    {
    	int  essai(5);
    	string motMystere, motMelange, motUtilisateur;
    	char rejouer;
     
     
    	//Initialisation des nombres aléatoires
    	srand(time(0));
     
     
     
    	do// la boucle pour que le programme reprenne au début
    	{
     
    		motMelange = melangerLettres(motMystere);
     
    		for (essai; essai > 0; --essai)
    		{
    			cout << "Quel est ce mot? " << motMelange << endl;
    			cout << "Vous avez " << essai << " essais pour trouver le mot mystere !" << endl;
    			cin >> motUtilisateur;
     
    			if (motUtilisateur == motMystere)
    			{
    				cout << endl << "Bravo !! Vous avez trouve le mot! " << endl;
    				cout << endl << "Vous avez eu besoin de " << (5 - essai) << " essai pour trouver le mot mystere" << endl;
    				break;
    			}
     
    			else (motUtilisateur != motMystere);
    			{
    				cout << endl << "Ce n'est pas la bonne reponse !" << endl;
    			}
    			switch (essai) 
    			{
    			case 5:
     
    				cout << endl << "Il ne vous reste que " << essai - 1 << " " << " tentative" << endl;
    				break;
     
    			case 4:
     
    				cout << endl << "Il ne vous reste que " << essai - 1 << " " << " tentative" << endl;
    				break;
     
    			case 3:
     
    				cout << endl << "Il ne vous reste que " << essai - 1 << " " << " tentative" << endl;
    				break;
     
    			case 2:
     
    				cout << endl << "Il ne vous reste que " << essai - 1 << " " << " tentative" << endl;
    				break;
     
    			default:
     
    				cout << endl << "La bonne reponse est " << motMystere << endl;
    				break;
    			}
    		}
     
    		cout << " Voulez continuer la partie y/n ? " << endl;
    		cin >> rejouer;
     
    		if (rejouer == 'y')
    		{
    			cout << " Tres bien ! Faisons une autre partie ! " << endl;
    		}
     
    		else  (rejouer == 'n');
    		{
    			cout << "au revoir !" << endl;
    		}
     
     
    	} while (rejouer == 'y'); 	//On recommence si le joueur veut bien
     
     
    	system("pause");
     
    	return 0;
     
    }

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Bonjour et bienvenue sur le forum !

    Ce forum dispose d'une fonction pour colorer et mettre en page le code (le bouton # dans l'éditeur), je t'invite à l'utiliser pour ton code afin qu'on puisse mieux t'aider.

    Pour ton problème, tu devrais prendre une feuille de papier, un crayon et à réfléchir comment tu ferais sur le papier.
    Quand tu sauras comment faire, tu pourras le traduire en code.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Septembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : en reconversion

    Informations forums :
    Inscription : Septembre 2015
    Messages : 3
    Par défaut
    Merci beaucoup pour votre réponse.

    Je tacherais à l'avenir de faire attention à la manière dont j'expose mes problèmes.
    Veuillez m'excuser encore pour mon manque d'expérience en la matière.

    J'ai suivi votre conseil et j'ai mis sur papier ce que je voulais faire.
    - Je crois qu'il faut que je déclare tout d'abord mon fichier
    - Ensuite j'importe chaque ligne de mon fichier dans un vector
    - Ensuite je cree une fonction qui va aléatoirement choisir une ligne de ce tableau
    - Ligne qui sera une référence de mon mot mystere que j'implanterais dans mon main pour avoir un fichier propre.
    Que pensez vous de ce découpage?

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Bonjour.

    C'est un très bon début.

    Maintenant, tu dois transformer chacune de ces étapes en fonctions.

    Pour importer chaque ligne du fichier dans ton vector, tu devrais utiliser dans une boucle la fonction getline qui retourne les lignes d'un flux (ici ifstream).
    Ensuite, une fois que tu auras ce vector, tu pourras accéder à ses éléments aléatoirement.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Si tu regardes dans notre FAQ, tu trouveras comment utiliser efficacement std::getline.
    Je ne te dis pas où, pour que tu lises la faq

  6. #6
    Futur Membre du Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Septembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : en reconversion

    Informations forums :
    Inscription : Septembre 2015
    Messages : 3
    Par défaut
    Bonjour

    Merci pour toute vos suggestions. Voici ce que j'ai fait du coup.

    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
    string dico(string ligne)
    {
    	string const dictionnaire("dico/dico.txt");
     
    	ifstream monFlux("dico/dico.txt");// je déclare mon flux dans le fichier bibliothèque
     
     
    	if (monFlux)
    	{
    		vector <string> bibliotheque(1, "ligne sans nom"); // j'initialise mon tableau vector
     
    		while (getline(monFlux, ligne)) // tant que il reste des lignes dans le fichier on en prend
    		{
     
    			bibliotheque.push_back(ligne); // on rajoute les lignes du fichiers dans le vector bibliotheque
     
    		}
    		int nbAleatoire = rand() % (bibliotheque.size(); //on applique un tirage aleatoire aux données du vector par rapport à sa taille total
     
    		cout << bibliotheque[nbAleatoire]; //et on en sort une ligne
    	}
    	else
    	{
    		cerr << "ERREUR : Impossible d'accéder au fichier." << endl; // verification de l'ouverture du chier texte
    	}
    	// je teste que la lecture dans la fichier est bonne
     
     
     
    	return ligne;
    Qu'en pensez vous?

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    C'est un bon point de départ.

    Mais ton code tel quel ne compile pas en l'état.
    Il est dommage de charger tout le dictionnaire à chaque fois que tu veux un mot.
    Il vaudrait mieux avoir des fonctions atomiques:
    • une première qui charge le fichier dans un vector
    • une second qui tire un élément au hasard d'un vector


    On pourrait faire une classe de dictionnaire.

    Idéalement, quelque soit le choix, tu dois pouvoir en faire des templates (mais c'est probablement trop tot pour toi)
    Cela permettrait d'écrire une fonction de chargement qui fonctionne aussi bien avec un vector qu'un set, une list ou un deque.
    Cela pourrait aussi servir si tu veux charger autre chose que des std::string. Des nombres, par exemple.


    Il y a juste une paire de bémols: tu utilises la fonction rand, qui vient du C, et tu n'utilises pas sa fonction compagnon, srand(time(0)).
    La fonction rand possède plusieurs inconvénients, dont celui d'être biaisée pour certains modulos.

    En C++ moderne, tu disposes de tout #include <random>.
    Tu trouveras tous les détails dans un site de référence, tel que cppreference.com.

Discussions similaires

  1. Comment repérer dans quel fichier se situe une ligne de code
    Par Atilili dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 29/08/2012, 20h14
  2. Enregistrer un script dans un fichier externe
    Par Furius dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 30/11/2005, 12h57
  3. Réponses: 9
    Dernier message: 25/09/2005, 16h33
  4. Réponses: 22
    Dernier message: 29/01/2005, 11h29
  5. Problème lecture de nombre dans un fichier en c++
    Par knecmotet dans le forum C++
    Réponses: 1
    Dernier message: 28/10/2004, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo