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 :

Piocher des mots dans un dictionnaire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut Piocher des mots dans un dictionnaire
    Bonjour tout le monde,
    Depuis quelques temps, je cherche à faire un programme qui pioche un mot au hasard dans un dictionnaire.
    Qu'est-ce qui cloche dans ce code :
    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
    #include <cstdlib>
    #include <string>
    #include <fstream>
    #include <ctime>
    #include <string>
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    string piocherMot(){
    	int posimot(0);
        int taille(232578);
        string ligne, returnmot;
        ifstream flux("dico.txt");
    	if(flux){
        srand(time(0));
        posimot = rand() % 232578;
     
    	int i(0);
    	while(i != posimot){
    		getline(flux, ligne);
    		i++;
    	}
    	ligne = returnmot;
    	cout << ligne;
    	return ligne;
    	}
    	else{
    		cout << "Impossible d'ouvrir le fichier";
    	}
    }
     
     
    int main()
    {
    	cout << piocherMot();
    	return 0;
    }
    Comment résoudre ce problème ?

    Merci d'avance de votre aide,
    Alestrio

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 515
    Par défaut
    C'est tout pourri avec des valeurs en durs dans tous les coins et usage de fonction C complètement obsolètes et hors de leurs limites d'utilisation.

    Simplifiez-vous la vie, utilisez les primitives C++, au moins pour les tirages aléatoires.
    Stockez l'ensemble des mots dans un std::vector pour ne pas voir de valeur en durs.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut
    Oui mais justement, c'est un entrainement pour moi de piocher dans un fichier dictionnaire. De quoi parlez-vous quand vous dites "fonctions C primitives" ?

  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
    Bonsoir.

    Il parle des fonctions srand, time et rand qui sont des fonctions C, et à qui on préfère les fonctions de l'entête random.

    Quelques soucis qui sautent aux yeux dans ce code :
    La fonction piocher s'occupe d'ouvrir le fichier, de le lire jusqu'à atteindre une position donnée, puis de retourner la ligne en question. Ça fait beaucoup de responsabilités et à chaque fois qu'on veut avoir un mot aléatoire on réouvre le fichier alors qu'on pourrait juste stocker son contenu.
    Le nombre de lignes 232578 est codé en dur. Donc si on rajoute ou supprime une ligne il peut planter. Pareil pour le nom de fichier, codé en dur.
    La fonction affiche ET retourne le mot recherché. C'est soit l'un soit l'autre.

    Un main propre, selon moi, serait :
    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
    //Charge le fichier en mémoire, et stocke chaque mot dans le vector
    std::vector<std::string> loadDictionary(const std::string& fileName);
     
    //Extrait un mot au hasard du dictionaire
    std::string getRandomWord(const std::vector<std::string>& dico);
     
    int main() {
        std::string word;
        std::vector<std::string> dico;
     
        dico = loadDictionary("dico.txt");
        word = getRandomWord(dico);
     
        std::cout << word << '\n';
    }
    Je te laisse le soin d'implémenter ces deux fonctions

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    En dehors du problème de conception souligné dans les précédentes remarques, il y a deux problèmes plus concrets:
    1) tu ne testes pas l'état du flux dans la boucle qui utilise getline; cela te permettrait d'arrêter de lire le fichier s'il est terminé. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (flux && i < posimot) {
      ...
    }
    2) tu ne prévois pas de valeur de retour lorsque le fichier ne peut pas être ouvert, ou lorsque posimot est supérieur au nombre de mots du fichier.
    Cela est à corriger impérativement.

    Pour la conception, je ne suis pas d'accord avec les remarques faites. On peut décider de piocher un mot sans charger l'ensemble du dictionnaire, qui pourrait être d'une taille très importante -ou bien le programme pourrait tourner sur une machine avec une mémoire très limitée. Néanmoins, il faudrait s'y prendre autrement; je pense à deux solutions:
    1) on détermine la taille en caractère du fichier. Cela peut-être fait rapidement grâce aux méthodes seekg et tellg d'un ifstream. Voir l'exemple: http://www.cplusplus.com/reference/i...istream/seekg/ On prend comme nombre aléatoire un numéro de caractère dans le fichier et on décale le curseur jusqu'au précédent retour à la ligne; enfin on avance le curseur d'un caractère: on est au début du mot choisi aléatoirement.
    2) on commence par compter le nombre de retours à la ligne dans le fichier. Puis on procède comme tu l'as fait. Je pense cette méthode plus lente. Elle deviendra peut-être idiomatique avec l'introduction des ranges dans le standard, mais ce n'est pas la question pour le moment

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut
    Bonjour, j'ai refait mon code avec vos conseils, mais le random n'est pas très "random" .
    Comment avoir quelque chose de vraiment aléatoire ?
    Sachant qu'en plus, j'en ai besoin dans "piocherMot()" et dans "melangerMot()", c'est très embetant de ne pas avoir quelque chose d'aléatoire car c'est la même suite de nombre.
    Le vector, comme l'a dit stendhal666, n'est pas franchement le mieux, sachant que quand je part en voyage (merci Git) je suis sur une Surface qui n'a pas beaucoup de mémoire.

    Merci d'avance,
    Alestrio

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/01/2007, 00h43
  2. [COM] Trouver des mots dans des PDF et autres documents ?
    Par zyongh dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 02/11/2006, 14h23
  3. [Word] Comment mettre en évidence des mots dans un document ?
    Par ecocentric dans le forum Framework .NET
    Réponses: 1
    Dernier message: 03/08/2006, 16h31
  4. Chercher des mots dans une ligne
    Par chemouz dans le forum C++
    Réponses: 1
    Dernier message: 17/12/2005, 12h42
  5. Comment changer des mots dans un fichier?
    Par ptitbonum dans le forum Linux
    Réponses: 5
    Dernier message: 07/04/2004, 23h42

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