Aider moi SVP prog en c++ a faire mais je ne comprends pas le sujet

Signaler
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
Bonjour a tous j'espere que l'un d'entre vous poura m'aider.
Voila ce que je recherche:
je recherche 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  aussi accumulées.
S'il trouve "display", il affiche alors toutes les lignes accumulées dans
l'ordre d'apparition; s'il trouve "rdisplay"  il affiche 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
$

Je suis pas un pro du c++ et en fait ce qui me gène c'est que j'ai pas compris cette histoire d'itérateur alors si quelqu'un pouvez me venir en aide ou du moi m'aider a commencer car la je vois pas par ou le faire !!! je vous remerci d'avance

21 réponses

Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

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 ...
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
// Par exemple :

deque <string> c1;
deque <string>::iterator IterAvant; 
deque <string>::reverse_iterator IterRecul;

 IterRecul = c1.rbegin( );
 cout << "Dernier elem : " << *IterRecul << endl;

// vers avant
 for ( IterAvant = c1.begin( ); IterAvant != c1.end( ); IterAvant++ )
      cout << *IterAvant << endl;

// à l'envers
 for ( IterRecul = c1.rbegin( ); IterRecul != c1.rend( ); IterRecul++ )
      cout << *IterRecul << endl;
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

Voila ce que j'ai écrit:

#include
#include<cmath>
#include
#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 !!!
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Enleve les typedef, ça ne déclare pas des variables mais des types !
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Et un :
using namespace std; // est plus court...
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

voici mon nouveau code, il compil bien mais lorsque je l'execute comme ceci:
./was < was_demo1

avec le code =
#include
#include<cmath>
#include
#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 !
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Là je ne t'ai pas du tout donné le code que tu cherches, mais le principe du reverse iterator.
Pour le reste, le code n'a rien a voir avec ça.
Il faut que tu récupères les entrée utilisateur avec cin, que tu fasse apparemment des redirections vers un fichier ect...
D'ailleurs je ne comprends pas ton exemple :
./was < was_demo1 ect....
A quoi ça correspond ?
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
string recupEntree;
// BOUCLE
cin.getline(recupEntree.c_str(), 64, '\n');
c1.push_back(recupEntree);
// TANT QUE recupEntree != "display" || "rdisplay";

SI recupEntree == "display"
   affiche vector vers l'avant
SI recupEntree == "rdisplay"
   affiche à l'envers
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

was_demo1 est un fichier contenant du texte:
hello
world
great
j'essai deja de lancer le programme en lui passant was_demo1 en entrée de facon a ce qu'il me ressorte:
great
world
hello

mais le but final est qu'a partir de deux fichier was_demo1 comme ci-dessus et was_demo2:
hello
world
rdisplay
this
is
great

j'obtienne ceci:

  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
 $

en gros quand le programme rencontre une ligne avec display il affiche les lignes qui le précédés dans l'ordre mais display ne doit pas s'afficher et lorsqu'il rencontre rdisplay le programme doit afficher les lignes qui le précédés dans l'ordre inverse sans afficher rdisplay.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Déjà comment veut tu récupérer la ligne de commande avec
int main(void)

il faut
int main(int argc, char** argv)
{
   // nom de ton programme = argv[0]
   // 1ere commande (nom fichier) = argv[1]
   // 2eme commande(fichier 2) = argv[2]
}

Ensuite il te faut le header
<fstream> // pour les fichiers

ifstream entree;
ofstream sortie;

entree.open(argv[1]);
sortie.open(argv[2]);

// boucle
entree.getline(ect...)
c1.push_back(ect..);

ect...
ect...
ect....
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

Voici mon code:

#include
#include<cmath>
#include
#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:
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é
A l'aide ...
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
cin.getline((char*)s1.c_str());
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

j'y arrive pas je comprends pas!!!
#include
#include<cmath>
#include
#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((char*)s1.c_str());
                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;
        }
}
erreur:
test.cpp: In function 'int main()':
test.cpp:16: error: 's1' was not declared in this scope
test.cpp:16: error: expected `)' before ';' token
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
test.cpp:18: error: expected primary-expression before ')' token
test.cpp:18: error: expected `;' before ')' token
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
s1 était un exemple c'est "recup" pour toi.
ensuite la boucle :
while( recup != "display" && recup != "rdisplay") )
// Tu devrais lire un bon tuto avant de te lancer comme ça.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
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


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();
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

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

ps: merci pour
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

Voici mon code:
#include
#include<cmath>
#include
#include<string>
#include<vector>


using namespace std;




int main (int argc, char* argv[]) {


     ifstream entree(arg[1]);


vector<string>::iterator IterAvant;


vector<string>::reverse_iterator IterRecul;


vector<string> c1;


string recup("");




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();
}

 voici l'erreur que j'obtiens avec g++ test.cpp:

$g++ test2.cpp
test2.cpp: In function 'int main(int, char**)':
test2.cpp:12: error: variable 'std::ifstream entree' has initializer but incomplete type
test2.cpp:12: error: 'arg' was not declared in this scope
$
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
21
int main (int argc, char* argv[]) {
     ifstream entree(argv[1]);

+
il faut faire un test avant style if(argc != 1) exit(-1):
++
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
21
int main (int argc, char* argv[]) {
     ifstream entree(argv[1]);

+
il faut faire un test avant style if(argc != 1) exit(-1):
++
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

J'ai enfin réussi a coder seul hic j'ai encore une erreur dc si vous pouviez m'aider, voici mon code:
#include
#include<cmath>
#include
#include<string>
#include<vector>


using std::cerr;
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;


int main (void) {
        vector<string>::iterator IterAvant;
        vector<string>::reverse_iterator IterRecul;
        vector<string> c1;
        string recup("");
        while ( getline(cin, recup)){
                if ( recup =="display"){
                        for (IterAvant = c1.begin(); IterAvant != c1.end(); IterAvant++)
                                cout <<*IterAvant << endl;
                        c1.erase(c1.begin() , c1.end());
                }
                else if ( recup =="rdisplay"){
                        for (IterRecul = c1.rbegin(); IterRecul != c1.rend(); IterRecul++)
                                cout <<*IterRecul << endl;
                        c1.erase(c1.begin() , c1.end());
                }
        }
        c1.push_back(recup);
        for (IterAvant = c1.begin(); IterAvant != c1.end(); IterAvant++){                if (*IterAvant "rdisplay" || *IterAvant "display")
                        IterAvant++;
                cout <<*IterAvant << endl;
        }
}
lorsque je compil tout fonctionne bien et mes tests aussi sauf dans un cas particulier, si l'entrée standar se termine par display ou rdisplay j'obtient une erreur de segmentation (Segmentation fault).
Merci d'avance pour votre aide !!!