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 :

Déterminer le plus grand mot d'un fichier


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Par défaut Déterminer le plus grand mot d'un fichier
    Bonsoir tout le monde, dans le cadre de mon projet on m'a demandé charger un fichier txt remplie de chaine de charctére

    chaque mot dans une ligne .. pour le moment mon but est de calculer le nombre de caractère le plus grand c a dire le mot le plus long ...

    il y a plusieurs erreur dans la compilation ...

    et j'ai vraiment besoin de votre aide les gars sachant que je débute sur le c++ et j'utilise l'editeur de qt4.8

    voila mon 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
     
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <stdio.h>
      using namespace std;
    int main()
    {
        // le constructeur de ifstream permet d'ouvrir un fichier en lecture
        std::ifstream fichier( "Liste_mots.txt" );
       int k=0;
        if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
        {
            std::string ligne; // variable contenant chaque ligne lue
     
            // cette boucle s'arrête dès qu'une erreur de lecture survient
            while ( std::getline( fichier, ligne ) )
            {
                int i=0;
                if (ligne[i]!=""){
                    std::cout << ligne[i] << std::endl;
                }
     
             while (ligne[i]!='') do{
                i++;
                if (i>k){k=i;
                }
                i=0;
                // afficher la ligne à l'écran
               std::cout << k << std::endl;
            }
        }
     
     
    }

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    Mettre tes erreurs aurait été chouette, m'enfin bon... Je les mets donc moi-même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    t.cpp:23:21: error: empty character constant
    t.cpp: In function \u2018int main()\u2019:
    t.cpp:19: error: ISO C++ forbids comparison between pointer and integer
    t.cpp:31: error: expected 'while' before '}' token
    t.cpp:31: error: expected '(' before '}' token
    t.cpp:31: error: expected primary-expression before '}' token
    t.cpp:31: error: expected ')' before '}' token
    t.cpp:31: error: expected ';' before '}' token
    t.cpp:34: error: expected '}' at end of input
    Donc traitons les erreurs une par une (qui sont toutes plutôt explicites d'ailleurs).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t.cpp:23:21: error: empty character constant
    Ligne 23 on a un magnifique ligne[i] != ''. Comme le dit le compilateur, ça n'existe pas. Je pense que tu cherchais '\0'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t.cpp:19: error: ISO C++ forbids comparison between pointer and integer
    Tu fais char != char* (oui, "" est char* de taille 0).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t.cpp:31: error: expected 'while' before '}' token
    Là ça vient juste du fait que tu ne maîtrises rien du tout. La boucle while ne fonctionne pas comme ça, la boucle do non plus. T'es parti pour relire ton cours. Pareil pour toutes les erreurs qui suivent.

    Bon maintenant la conclusion qui tue : ta boucle "while(ligne[i] != ''" ne sert à strictement rien. Pourquoi ? Hé bien si tu avais lu la doc de la classe string, tu le saurais. Apprendre à lire son cours et à aller chercher les infos est la base de tout apprentissage.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Par défaut
    'est bon probléme régler les gars merci ..... et désoler pour les erreur syntaxique ....

    c'est bon maintenant j'essaie de cherger le fichier dans un vecteur ... et je commence par un vecteur statique ... donc j 'ai calculer les ligne du fichier et puis je l'ai déclarer ... mais il y a un bug aprés l"exécution

    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
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    typedef struct termes{
         string terme;
    }termes;
    termes index[32414];
     
    int main()
    {
     
        // le constructeur de ifstream permet d'ouvrir un fichier en lecture
        std::ifstream fichier( "Liste_mots.txt" );
       int k,i=0;
        if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
        {
           // std::string ligne, terme; // variable contenant chaque ligne lue
              std::string ligne; // variable contenant chaque ligne lue
     
            // cette boucle s'arrête dès qu'une erreur de lecture survient
            std::getline( fichier, ligne );
     
            k=ligne.length();
     
           // terme.assign(ligne, 0,ligne.length());
           // index[i]
     
            index[i].terme.assign(ligne, 0,ligne.length());
         // i++;
            while ( std::getline( fichier, ligne ) )
            {
                i++;
                 if(ligne.length() > k ){
                     k=ligne.length();
                    // terme.assign(ligne, 0,ligne.length());
                     //index[i].assign(ligne, 0,ligne.length());
                      index[i].terme.assign(ligne, 0,ligne.length());
                 }        
     
     
            }
            std::cout << i<< std::endl;
            std::cout << index[i-1].terme << std::endl;
           // std::cout << index[i] << std::endl;
            printf("k=   %d\n",k);
            //std::cout << "k="+k << std::endl;
        }   
     
     
    }
    j'avoue que je suis brouillon .. je laisse toujours d'autre alternative comme commentaire ... maintenant c bon j'ai lu le plus grand caractère

    mais je veux charger le fichier dans un vecteur puis calculer sa taille et de même dans une liste chaînée car je veux faire une comparaison entre les deux pour démontrer la meilleur procédure au niveau de la mémoire

    -

  4. #4
    Membre actif
    Homme Profil pro
    Thésard
    Inscrit en
    Mars 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Thésard
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 54
    Par défaut
    Si tu pars du principe que tes mots sont séparés par des espaces tu peux calculer la différence de position entre deux espaces, ça te donnera la taille des mots.

    Tu peux utiliser la fonction find il me semble pour ça (à confirmer).

    Tu n'as pas besoin de repréciser que tu vas utiliser l'environnement standard pour appeler getline, cout, string... dans la mesure où tu définis un namespace comme std.

  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
    mais je veux charger le fichier dans un vecteur puis calculer sa taille et de même dans une liste chaînée car je veux faire une comparaison entre les deux pour démontrer la meilleur procédure au niveau de la mémoire
    Tout un programme!

    Eh bien il suffit de déclarer un vecteur et une liste (ne pas oublier d'évidence les #include nécessaires)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<std::string> textvec;
    std::list<std::string> textlst;
    puis de rentrer chaque ligne dedans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::fstream fs(cheminDuFichier);
    while (fs) {
      std::string line;
      std::getline(fs, line);
      textvec.push_back(line);
      textlst.push_back(line);
    }
    Après pour étudier les différences dans la gestion de la mémoire, tu vas avoir besoin d'outils supplémentaires...

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Par défaut
    merci les gars ... voila le code aprés l'optimisation et ca marche ..... maintenant je vais faire de même pour une liste chainée ... et la j'aurai vraiment besoin d'aide

    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
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    typedef struct termes{
    	 string terme;
    }termes;
    termes index[32414];
     
    //int * p2 = new termes;
    int main()
    {
     
        // le constructeur de ifstream permet d'ouvrir un fichier en lecture
        std::ifstream fichier( "Liste_mots.txt" );
     
       int k,i=0,j;
        if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
        {
           // std::string ligne, terme; // variable contenant chaque ligne lue
              std::string ligne, termet; // variable contenant chaque ligne lue
     
            // cette boucle s'arrête dès qu'une erreur de lecture survient
            std::getline( fichier, ligne );
     
            k=ligne.length(); 
     
            //termet.assign(ligne, 0,ligne.length());
     
     
            index[i].terme.assign(ligne, 0,ligne.length());
         // i++;
            while ( std::getline( fichier, ligne ) )
            {
                i++;
                 if(ligne.length() > k ){
                 	 k=ligne.length(); 
                 	// termet.assign(ligne, 0,ligne.length());
     
    			 }         
     
                index[i].terme.assign(ligne, 0,ligne.length());
            }
            std::cout << i<< std::endl;
     
            termet.assign(index[i].terme,0,index[i].terme.length());
           // std::cout << termet << std::endl;
            /*
            for(j=0;j<=i;j++){
                              std::cout << index[j].terme << std::endl;
            }
           */
     
            printf("k=   %d\n",k);
     
            printf("sizeof(index)      = %d\n", sizeof(index));
     
            do{}while(1!=2);
        }    
     
     
    }

  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
    Voici mes avis sur ton code:

    En C++, on utilise éventuellement <cstdio>, et on préfère <iomanip> avec un ostream (tel que std::cout)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct termes{
    	 string terme;
    }termes;
    Tu ne penses pas que typedef std::string terme; serait plus simple à utiliser?

    une variable globale de 32414 structures contenant une std::string ?
    Tu devrais:
    • la déclarer dans main()
    • déclarer une macro qui explique ce que signifie ce 32414 (telle que #define MACRO_TERMES_MAX 32414)
    • nous expliquer pourquoi cette valeur de 32414
    • mieux, utiliser un std::vector<terme>

    De plus, ce n'est pas un tableau d'index, mais un tableau de termes, que tu devrais appeler termes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //int * p2 = new termes;
    encore une globale?

    autres remarques, la plus part de tes commentaires n'ont pas d'intérêt.
    tout particulièrement, "cette boucle s'arrête dès qu'une erreur de lecture survient" n'est pas avant une boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    index[i].terme.assign(ligne, 0,ligne.length());
    assign est utile pour copier une partie d'une autre chaine.
    Pour copier toute la chaine, tu peux écrire index[i].terme = ligne;. (c'est-à-dire termes[i] = ligne; avec les corrections précédentes)

    tu aurais avantage à utiliser les tests excluants (if ( !fichier ) return ...;) qui permettent de réduire l'indentation: le reste du code n'est pas dans un if, grace au retour.

    Ces variables ont deux défauts:
    elles sont déclarées trop top.
    elles ne disent pas ce à quoi elles servent.

    Ca, c'est une boucle infinie, que tu aurais pu écrire while(true); (ou for(;;);ou while(1); en style C)


    Voici comment je coderai la meme chose que toi, sans utiliser vector.
    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 <string>
    #include <fstream>
    #include <iostream>
    
    #define MACRO_FILE_SIZE_MAX 32414
    
    namespace erreurs{
       const int OK = 0;
       const int pas_de_fichier = 1;
    }//erreurs::
    
    typedef std::string terme;
    
    int main() {
       std::ifstream fichier( "Liste_mots.txt" );
       if ( !fichier ) return erreurs::pas_de_fichier;
    
       terme termes[MACRO_FILE_SIZE_MAX];
    
       //extraction du premier élément, qui défini le max actuel
       std::getline( fichier, termes[0] );
    
       std::string::size_type max_size = termes[0].length();
       int max_index = 0;
       
       //parcours de la suite du fichier
       int indice_actuel=1;
       while ( indice_actuel < MACRO_FILE_SIZE_MAX && std::getline(fichier, termes[indice_actuel]) ) {
          if (termes[indice_actuel].length() > max_size ) {
             max_size=termes[indice_actuel].length();
             max_index = indice_actuel;
          }
          ++indice_actuel;
       }
       std::cout << indice_actuel << std::endl;
    
       std::cout << "plus grande taille de mot: " << max_size << std::endl;
       std::cout << "sizeof(termes)      = "<< sizeof(termes) << std::endl;
       
       return erreurs::OK;
    }
    Cela dit, tu n'as pas utilisé un vecteur statique, mais un tableau. Avec tous les risques que ca comporte en terme de dépassement de tableaux.

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Par défaut
    je vous remercie beaucoup mon ami ....... une question .. es que pour la liste chaînée ... je fais la même procédure

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Par défaut
    voila j'ai essayé de faire de même pour une liste chainée .. mais je suis pas ou je suis plantée

    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
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    typedef struct termes{
    	 string ligne;
    	 struct termes *next;
    };
    namespace erreurs{
       const int OK = 0;
       const int pas_de_fichier = 1;
    }//erreurs::
    typedef termes* liste;
     termes *next = NULL;
    int main()
    {
         std::ifstream fichier( "Liste_mots.txt" );
       if ( !fichier ) return erreurs::pas_de_fichier;
     
     //extraction du premier élément, qui défini le max actuel
       std::getline( fichier, liste.ligne );
     
     
       std::string::size_type max_size = liste.length();
       int max_index = 0;
     
       termes indice_actuel= liste;
        termes* tmp = liste;
     
       while ( indice_actuel =!NULL && std::getline(fichier, liste.ligne) ) {
          if (liste.ligne.length() > max_size ) {
             max_size=liste.ligne.length();
             max_index = indice_actuel;
          }
          indice_actuel= tmp->nxt;
       }
       std::cout << indice_actuel << std::endl;
     
       std::cout << "plus grande taille de mot: " << max_size << std::endl;
       std::cout << "sizeof(termes)      = "<< sizeof(termes) << std::endl;
     
       return erreurs::OK;
    }

  10. #10
    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
    sizeof retourne la taille de la variable donnée.
    Pour un tableau, ca retourne le nombre d'élément.
    pour un pointeur, la taille du pointeur.


    De plus, tu as encore fait des variables globales.

Discussions similaires

  1. Déterminer le nombre d'occurences des mots dans un fichiers texte
    Par fraisa1985 dans le forum Général Java
    Réponses: 13
    Dernier message: 26/10/2021, 01h58
  2. Déterminer la Valeur la plus grande dans une table
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/08/2014, 23h35
  3. Déterminer le nombre de mots dans deux fichiers de texte
    Par daniel1985 dans le forum Général Java
    Réponses: 1
    Dernier message: 14/12/2012, 11h51
  4. Déterminer que today et plus grand que la date entrée
    Par HWICE dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 21/05/2008, 17h03
  5. Algorithme de plus grand sous-mot commun
    Par nicolas66 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 28/11/2006, 13h24

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