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 algo anagrame


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Concepteur 3D
    Inscrit en
    Septembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Concepteur 3D
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2012
    Messages : 2
    Par défaut Problème algo anagrame
    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.

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

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

    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
    #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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Loe,

    Il faudrait commencer par améliorer la mise en page de ton code (indentation régulière, éviter x lignes vides successives ...) pour en faciliter la lecture.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    As-tu essayé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "-" << leMotMystere << "-" << motUtilisateur << "-" << endl
    ?

    Sinon ton fichier .txt peut contenir \r\n au lieu de \n pour les retours à la ligne si tu es sous windows.
    Essaye de comparer la taille des deux strings pour voir si tu n'a pas un caractère non-imprimable dans l'un d'entre eux.

  4. #4
    Candidat au Club
    Femme Profil pro
    Concepteur 3D
    Inscrit en
    Septembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Concepteur 3D
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2012
    Messages : 2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "-" << leMotMystere << "-" << motUtilisateur << "-" << endl
    Ça fonctionne, merci beaucoup.
    En fait c'est un peu difficile à comprendre. Qu'est ce que c'est \r\n et \n ?
    Je suis sous Linux

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    '\n' est un retour à la ligne et '\r' est un retour chariot (on revient au début de la ligne).
    mais sous Windows, le retour à la ligne est '\r\n' dans les fichiers textes, je ne sais pas trop pourquoi, à part enquiquiner les programmeurs je n'en vois pas l'utilité^^
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char tab[6] = {'e', 'f', '\r', 'p', 0};
    //affichage : pf
    char tab[5] = {'-', 'r', '\n', '-', 0};
    /* affichage : -r
    - */

  6. #6
    Membre averti
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    Citation Envoyé par Neckara Voir le message
    '\n' est un retour à la ligne et '\r' est un retour chariot (on revient au début de la ligne).
    mais sous Windows, le retour à la ligne est '\r\n' dans les fichiers textes, je ne sais pas trop pourquoi, à part enquiquiner les programmeurs je n'en vois pas l'utilité^^
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char tab[6] = {'e', 'f', '\r', 'p', 0};
    //affichage : pf
    char tab[5] = {'-', 'r', '\n', '-', 0};
    /* affichage : -r
    - */
    peut-être une explication de l'histoire https://en.wikipedia.org/wiki/Newline#History

Discussions similaires

  1. Poker - Problème Algo
    Par xinu1.1 dans le forum Langage
    Réponses: 9
    Dernier message: 17/06/2009, 16h54
  2. Problème algo [calcul de moyenne]
    Par Nathan66 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/10/2008, 08h15
  3. [Tableaux] Problème algo récursif
    Par Invité dans le forum Langage
    Réponses: 38
    Dernier message: 03/10/2006, 15h49
  4. problème algo
    Par petitgato dans le forum C
    Réponses: 1
    Dernier message: 17/03/2006, 12h32
  5. Problème algo de parcour de graphe
    Par goblin dans le forum Langage
    Réponses: 1
    Dernier message: 11/12/2005, 15h04

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