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 :

Un programme pas trop compréhensible


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut Un programme pas trop compréhensible
    Re-bonjour voila l'énnoncé d'un exercice que j'ai à faire mais je ne comprends pas trop cette histoire d'itérateur si quelqu'un voulez bien m'expliquez ce qu'on attend de moi dans l'exercice,
    merci d'avance a vous tous!!!

    Voici l'ennoncé:

    Ecrivez un programme qui accumule son entrée standard en interne jusqu'à ce
    qu'il y trouve une des deux lignes suivantes : "display" ou "rdisplay". Les
    lignes vides sont accumulées aussi.

    Dans le premier cas, il affichera alors toutes les lignes accumulées dans
    l'ordre d'apparition. Dans le second, il les affichera dans l'ordre inverse.

    Vous devez passer par des itérateurs, et utiliser le BON TYPE d'itérateur
    suivant la direction du parcours.

    La ligne "déclencheuse" n'est pas accumulée, et donc pas affichée.

    Si aucune des deux lignes n'est trouvée dans l'entrée standard, on agit
    comme si le flux s'était terminé par une ligne "display".

    Après avoir traité une ligne "display" ou "rdisplay", le programme
    recommence à accumuler des lignes, en ayant vidé son stockage au préalable.

    Si l'entrée standard est vide, le programme n'affiche bien entendu rien du
    tout.

    Exemples :

    $ cat was_demo1
    hello
    world
    great
    $ ./was < was_demo1
    hello
    world
    great
    $ cat was_demo2
    hello
    world
    rdisplay
    this
    is
    great
    $ ./was < was_demo2
    world
    hello
    this
    is
    great
    $ ./was < /dev/null
    $

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Salut,

    As-tu lu le mégacours sur :
    - les conteneurs (et donc les itérateurs)
    - les flux d'entrée / sortie
    ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Le flux d'entrée est de sortie oui mais pas les conteneurs.
    En fait mon pb c'est que jpense savoir comment faire pour afficher les lignes en allant mais pas ds le sens inverse!
    Alors merci a tous ceux qui voudront bien m'aider.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Fais des recherches sur les iterateurs, tu verras qu'il en existe des 'reverse'

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Est ce que ca marche si :
    je prends un vecteur et lui enregistre toute les lignes de l'entrée standard ensuite je le parcour avec une boucle while qui selon qu'elle rencontre display ou rdisplay m'affiche tout les éléments dans l'ordre normal ou inverse. j'enregistre tout ca au fur et a mesure dans un autre vecteur et a la fin je fait une autre boucle while pour l'affichage!!!
    Dites moi ce que vous en pensez et surtout est ce faisable ou est ce la meilleure soluce ?
    Merci d'avance ...

  6. #6
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Salut,

    Ca n'est pas incohérent.
    Mais tu dois pouvoir penser mieux que cela.

    Notament, plutot que de tout stocker dans un vecteur puis tout reparcourir pour tester s'il y a ton mot clef, tu pourrais peut-être tester les entrées une par une au fur et à mesure non ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Oui je peux vérifier les entrées une par une mais imaginon que je rentre les mots suivants:
    chat
    chien
    mouton
    rdisplay

    si je vérifi les entrées une a une j'obtien une condition d'arret a la 4ieme ligne et je lui demmande de mafficher les lignes précédentes dans l'odre inverse mais il faut bien qu'au préalable, elles aient été stocker non ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Dites moi est ce que ce morceau de code à l'air d'etre un bon départ ?
    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
     
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<string>
    #include<vector>
     
    using std::cerr;
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;
    using std::vector;
     
    typedef vector<string>::iterator VSIt;
     
    void printString(string s) {
            cout << s << endl;
    }
     
    int main(void) {
            vector<string> values;
            string value;
            while (cin >> value && value != "display" && value != "rdisplay")
                    values.push_back(value);
    Merci de m'aider car j'ai vraiment envi de réussir a faire cet exercice!!!

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Alors vous pensez quoi de mon début de code, est ce que je pars sur de bonnes bases ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Voila ce que j'ai écrit:

    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
     
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<string>
    #include<vector>
     
    using std::cerr;
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;
    using std::vector;
     
    typedef vector<string>::iterator IterAvant;
    typedef vector<string>::reverse_iterator IterRecul;
     
     
    int main(void) {
    vector<string> c1;
    IterRecul = c1.rbegin();
    cout << "Dernier elem : " << *IterRecul << endl;
    for ( IterAvant = c1.begin() ; IterAvant != c1.end() ; IterAvant++ )
             cout << *IterAvant << endl;
    for ( IterRecul = c1.rbegin( ) ; IterRecul != c1.rend() ; IterRecul++ )
                    cout << *IterRecul << endl;
    }
    mais quand je compil j'ai ca comme erreur:

    test.cpp: In function 'int main()':
    test.cpp:21: error: expected unqualified-id before '=' token
    test.cpp:22: error: expected primary-expression before '<<' token
    test.cpp:23: error: expected unqualified-id before '=' token
    test.cpp:23: error: expected primary-expression before '!=' token
    test.cpp:23: error: expected primary-expression before '++' token
    test.cpp:24: error: expected primary-expression before '<<' token
    test.cpp:25: error: expected unqualified-id before '=' token
    test.cpp:25: error: expected primary-expression before '!=' token
    test.cpp:25: error: expected primary-expression before '++' token
    test.cpp:26: error: expected primary-expression before '<<' token

    Merci d'avance pour votre aide !!!

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    IterRecul est déclaré comme étant un type, ce n'est pas une variable.

    Sinon ton code est bon (sans pinailler sur les détails), sous hypothèse que tu remplis bien ton vector avec le code que tu donnes plus haut, avant d'afficher ses éléments.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    voici mon nouveau code, il compil bien mais lorsque je l'execute comme ceci:
    ./was < was_demo1

    avec le 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
     
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<string>
    #include<vector>
     
    using namespace std;
     
    int main(void) {
    vector<string>::iterator IterAvant;
    vector<string>::reverse_iterator IterRecul;
    vector<string> c1;
    IterRecul = c1.rbegin();
    cout << "Dernier elem : " << *IterRecul << endl;
    for ( IterAvant = c1.begin() ; IterAvant != c1.end() ; IterAvant++ )
             cout << *IterAvant << endl;
    for ( IterRecul = c1.rbegin( ) ; IterRecul != c1.rend() ; IterRecul++ )
                    cout << *IterRecul << endl;
    }
    et was_demo1=
    hello
    world
    great

    j'obtiens l'erreur:
    Segmentation fault

    sachant qu'apres ca il faut encore que je gère le cas ou il rencontre display ou rdisplay

    Ps: je vous remerci de votre aide car j'ai vraiment du mal !

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Je suis pas loin de la solution j'ai tout normalement mais j'y arrive pas je m'enerve trop!!!!
    Un peu d'aide svp

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ce que je te conseille déjà c'est de prendre ton temps ; inutile de venir poster à chaque fois que tu écris quelque chose (6 fois en moins de 2h). Attend d'être vraiment coincé, ça ne sert à rien de poster un code que tu corriges toi-même 5 minutes plus tard.

    Sinon par rapport à ton dernier code, comme je te l'ai dit il vaudrait mieux remplir ton vector avant d'afficher ses éléments.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Voici 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
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<string>
    #include<vector>
     
    using namespace std;
     
    int main(void) {
            vector<string>::iterator IterAvant;
            vector<string>::reverse_iterator IterRecul;
            vector<string> c1;
            string recup;
            IterRecul = c1.rbegin();
            do 
                    cin.getline(recup.c_str(), 64, '\n');
                    c1.push_back(recup);
            while (recup != "display" || "rdisplay");
            if (recup == "display"){
                    for ( IterAvant = c1.begin() ; IterAvant != c1.end() ; IterAvant++ )
                    cout << *IterAvant << endl;
            }
            if (recup == "rdisplay"){
                    for ( IterRecul = c1.rbegin( ) ; IterRecul != c1.rend() ; IterRecul++ )
                    cout << *IterRecul << endl;
            }
    }
    et lorsque je compil j'obtiens les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    test.cpp: In function 'int main()':
    test.cpp:16: error: invalid conversion from 'const char*' to 'char*'
    test.cpp:16: error:   initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]'
    test.cpp:17: error: expected 'while' before 'c1'
    test.cpp:17: error: expected '(' before 'c1'
    test.cpp:17: error: could not convert 'c1. std::vector<_Tp, _Alloc>::push_back [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& recup))))' to 'bool'
    test.cpp:17: error: expected ')' before ';' token

    Snifff je vais jamais y arrivé
    je dois le soumettre avant minuit... c'est pour ca que je post des que je tombe sur un os!
    Je suis dsl, c'est que la on nous a donné un exercice alors que l'on a meme pas encore vu les itérators.
    J'aprends sur le tas, j'ai lu de la doc mais ca me semble encore flou tout ca.
    Dans tous les cas je vous remerci tous pour votre aide


  16. #16
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    il faut que tu remplaces ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      do 
                    cin.getline(recup.c_str(), 64, '\n');
                    c1.push_back(recup);
            while (recup != "display" || "rdisplay");
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    do 
    {
          cin >> recup;
          c1.push_back(recup);
    }
     while (recup != "display" || "rdisplay");
    par contre pour le push_back je ne vois pas

  17. #17
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    La comparaison des chaines est-elle bonne ?
    De plus, la condition dans le while() me semble suspect, non ?

    Nas'

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Avec un fichier data.txt dans le rep du prog contenant :
    mot 0
    mot 1
    mot 2
    mot 3
    rdisplay
    mot 4
    mot 5

    // le code suivant marche
    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
     
     
     
    vector<string>::iterator IterAvant;
     
    vector<string>::reverse_iterator IterRecul;
     
    vector<string> c1;
     
    string recup("");
     
     
    ifstream entree("data.txt");
     
    if ( !entree )
     
    { 
     
    cerr <<"erreur fichier";
     
    return 0 ; 
     
    } 
     
    while ( getline(entree, recup))
     
    { 
     
    if ( recup =="display"|| recup =="rdisplay")
     
    break ; 
     
    c1.push_back(recup);
     
    } 
     
    cout <<"\r\nPremiere lecture du fichier : "<< endl;
     
    cout <<"taille du vector : "<< c1.size()<< endl;
     
     
    if ( recup =="display")
     
    { 
     
    for (IterAvant = c1.begin(); IterAvant != c1.end(); IterAvant++)
     
    cout <<*IterAvant << endl;
     
    } 
     
    else if ( recup =="rdisplay")
     
    { 
     
    for (IterRecul = c1.rbegin(); IterRecul != c1.rend(); IterRecul++)
     
    cout <<*IterRecul << endl;
     
    } 
     
    else 
     
    { 
     
    cout <<"\r\nRien n'a ete lu dans le fichier..."<< endl;
     
    } 
     
    entree.close();
    comment ecrire le meme programme mais sans utiliser l'ouverture de fichier mais en lui passant un fichier dans l'entrée standar du style:
    ./mon_prog < fichier_contenant du texte

  19. #19
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Pourquoi ne pas lui passer le fichier de la manière suivante :

    ./mon_prog nom_du_fichier

    et dans ta fonction main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    int main (int argc, char* argv[]) {
     
        ifstream entree(arg[1]);
     
        //ensuite exactement pareil qu'avant

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    car en fait il faut que j'obtienne l'affichage suivant (c'est une machine qui nous corrige):

    Exemples :

    $ cat was_demo1
    hello
    world
    great
    $ ./was < was_demo1
    hello
    world
    great
    $ cat was_demo2
    hello
    world
    rdisplay
    this
    is
    great
    $ ./was < was_demo2
    world
    hello
    this
    is
    great
    $ ./was < /dev/null
    $

Discussions similaires

  1. Un programme qui veut bosser; mais pas trop.
    Par Flodelarab dans le forum C++
    Réponses: 8
    Dernier message: 28/08/2006, 15h33
  2. [CSS] Instruction Padding : FireFox pas trop comprendre ?
    Par DemonKN dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 11/08/2005, 15h23
  3. Prob somme SQL (pas trop facile, help!!!!!)
    Par nachi dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/07/2005, 16h42
  4. Réponses: 5
    Dernier message: 23/06/2004, 22h23

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