Aider moi SVP prog en c++ a faire mais je ne comprends pas le sujet
cs_killer75
Messages postés14Date d'inscriptionlundi 20 novembre 2006StatutMembreDernière intervention19 décembre 2006
-
18 déc. 2006 à 17:05
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 2016
-
19 déc. 2006 à 12:57
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
A voir également:
Exit status 1 expected primary-expression before ')' token
cs_killer75
Messages postés14Date d'inscriptionlundi 20 novembre 2006StatutMembreDernière intervention19 décembre 2006 18 déc. 2006 à 17:50
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 ...
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 18 déc. 2006 à 19:46
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 ?
cs_killer75
Messages postés14Date d'inscriptionlundi 20 novembre 2006StatutMembreDernière intervention19 décembre 2006 18 déc. 2006 à 19:54
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.
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 18 déc. 2006 à 20:04
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
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 18 déc. 2006 à 20:49
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.
cs_killer75
Messages postés14Date d'inscriptionlundi 20 novembre 2006StatutMembreDernière intervention19 décembre 2006 18 déc. 2006 à 22:26
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
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
$
cs_killer75
Messages postés14Date d'inscriptionlundi 20 novembre 2006StatutMembreDernière intervention19 décembre 2006 19 déc. 2006 à 12:01
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 !!!