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 avec les algos, itérateurs ...


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 33
    Points
    33
    Par défaut Problême avec les algos, itérateurs ...
    Bonjour

    J'vous explique ce que j'aimerais faire, un programme qui prendrait en argument une option "-w" suivi d'un ou plusieurs mots et d'un fichier en entrée,
    exemple : ./prog -w coucou < text

    Le but serait de "sortir" les lignes contenant UNIQUEMENT le mot.


    Mon (gros) souci c'est les itérateurs et algorithmes, presque jamais vu, (du coup j'sais même pas quoi choisir entre find et search par exemple )

    J'vous montre 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
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
     
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;
    using std::vector;
     
     
    int main(int argc, char const * argv[])
    {
        vector<string> lines;
        string line;
     
        string wanted[argc];
     
        for(int index = 1 ; index < argc ; ++index){
            string arg = argv[index];
            wanted[index] = arg;
     
            if((index == 1 || index == 2) && wanted[index] == "-w"){
                    cout << "MODE W" << endl;
                    index2 = index + 1;
                    vector<string>::iterator res = std::find(lines.begin(), lines.end(), wanted[index2]);
                    cout << res << endl;
            }
        }
        return 0;
    }
    En gros c'est un peu n'importe quoi (ne serait que si j'me référe aux lignes d'erreurs, j'ai arreter de les compter aprés 1000 lignes )

    Si quelqu'un pouvait m'expliquer déjà ce qui cloche, ensuite la manière de fonctionner de ses algorithmes ... merci bien.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce qui cloche :

    Un tableau dont la taille n'est pas connue à la compilation ne se déclare pas comme ceci, il faut utiliser new ou std::vector.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<string>::iterator res = std::find(lines.begin(), lines.end(), wanted[index2]);
    Tu n'as pas rempli lines. Et puis là, tu vas rechercher un ligne égale à ton mot dans la liste des lignes. Or toi tu veux chercher les lignes contenant ton mot.

    La manière de fonctionner :

    Il faut itérer ligne par ligne sur ton entrée, rechercher dans la ligne courante la présence du mot, et l'afficher ou non selon le résultat.

    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
    #include <iostream>
    #include <string>
     
    int main(int argc, char const * argv[])
    {
        // lecture des options...
        // word est le mot à rechercher
     
        std::string line;
     
        while (std::getline(std::cin, line))
        {
            if (line.find(word) != std::string::npos)
            {
                std::cout << line << std::endl;
            }
        }
     
        return 0;
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    ouais j'avais oublié de copier cette partie de mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vector<string> lines;
        string line;
     
        while (getline(cin, line))
            lines.push_back(line);
     
        vector<string>::iterator lineIt = lines.begin();
        vector<string>::iterator end = lines.end();
    J'vais voir avec ce que t'as fais, merci.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    ça marche bien, le truc c'est que j'veux les lignes ou il y'a uniquement le mot entré en ligne de commande, et pas les lignes où se trouvent le mot parmis d'autres ...

    ça s'fait également avec le find ? une option a ajoutée peut-être ?

    Autre question : tu pourrais me dire à quoi correspond le "string::npos" dans ton code ? c'est pour la fin de l'itérateur ?

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    ça marche bien, le truc c'est que j'veux les lignes ou il y'a uniquement le mot entré en ligne de commande, et pas les lignes où se trouvent le mot parmis d'autres ...
    Autant pour moi, j'avais mal compris. Dans ce cas il faut simplement comparer la ligne courante avec le mot (avec l'opérateur ==).

    Autre question : tu pourrais me dire à quoi correspond le "string::npos" dans ton code ? c'est pour la fin de l'itérateur ?
    C'est une constante désignant une position invalide ; renvoyée donc en cas de recherche qui n'a pas aboutit, par exemple.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    En effet c'était tout "bête"

    J'en profite pour t'embeter encore un tout p'tit peu.
    J'en suis donc arrivé à faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for(int index = 1 ; index < argc ; ++index){
                string word = argv[index];
                string line;
     
                while(getline(cin, line)){
                    if(line.find(word) != string::npos){
                        if(line == word)
                            cout << line << endl;
                    }
                }
            }
    Probleme, ceci ne marche que pour le premier mot entré en ligne de commande, dans le cas où j'en ai plusieurs (ex: ./test coucou bye < text), ma boucle (et toutes les boucles que j'essaye depuis) foire... en fait ne considère que le premier mot... comment faire ?

    C'est forcement une boucle, mais là, j'suis paumé...

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faut inverser l'imbrication de tes boucles : là pour chaque mot à rechercher tu vas parcourir ton entrée (donc dès la seconde itération tu auras atteint la fin du fichier, et plus rien ne sera lu).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(getline(cin, line)){
        for(int index = 1 ; index < argc ; ++index){ 
            if(line.find(word) != argv[index]){ 
                ...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Loulou24
    Il faut inverser l'imbrication de tes boucles : là pour chaque mot à rechercher tu vas parcourir ton entrée (donc dès la seconde itération tu auras atteint la fin du fichier, et plus rien ne sera lu).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(getline(cin, line)){
        for(int index = 1 ; index < argc ; ++index){ 
            if(line.find(word) != argv[index]){ 
                ...
    Euuh desolé de faire mon boulet, encore, mais j'vois pas pourquoi on chercherais que "line.find(word)" soit différent de "argv[index]"

    De plus j'ai cette erreur, pour la ligne en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: ISO C++ forbids comparison between pointer and integer

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Oops

    Il fallait lire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(line != argv[index])

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    aaah j'préfére lol

    Mais bon, tu en doutes c'est un exo et donc j'ai un sujet et le prof me dis d'utiliser les algorithmes tel que find_of_first_of, for_each, etc...

    pas sur qu'il accepte line.find(word) ...

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Dans ce cas, tu peux aussi stocker tes lignes dans un vecteur (ton idée originale) et chercher les lignes à coup de std::find. Pour remplir ton vecteur tu peux aussi utiliser std::copy avec un istream_iterator.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    Euuh non j'ai rien dis en fait, je peux utiliser la méthode que tu m'a montrer, mais j'arrive toujours pas a afficher ce que j'veux, ça m'saouuuul lol

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    J'ai retouché mon code après ce que tu m'as dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    string line;
                while(getline(cin, line)){
                    for(int index = 1 ; index < argc ; ++index){
                        if(line != argv[index]){
                            string word = argv[index];
                            if(line.find(word) != string::npos)
                                cout << line << endl;
                        }
                    }
                }
    J'ai bien des choses qui s'affiche mais pas les bonnes
    Quelqu'un pour un dernier coup de main ?

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string word = argv[index];
    if(line.find(word) != string::npos)
    Ce morceau ne sert à rien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(line != argv[index])
    Ce devrait être == et non !=.

    Je crois que tu ne sais plus trop ce que fait ton code

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Loulou24
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string word = argv[index];
    if(line.find(word) != string::npos)
    Ce morceau ne sert à rien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(line != argv[index])
    Ce devrait être == et non !=.

    Je crois que tu ne sais plus trop ce que fait ton code
    Si tu savais ... j'suis dessus depuis la nuit dernière, et j'en peux vraiment plus ...

Discussions similaires

  1. Réponses: 16
    Dernier message: 24/10/2008, 17h32
  2. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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