[C++] Class de Pile et de File

Class de Pile et de File [C++] - C++ - Programmation

Marsh Posté le 23-10-2004 à 20:15:38    

voila, jdois faire une classe Pile
 
dans celle-ci, j'ai une méthode vider() et qui appele une méthode depiler()
 

Code :
  1. template <typename TYPE>
  2. bool Pile<TYPE>::depiler(TYPE& valeur) {
  3.   if (estVide()) {
  4.     return false;
  5.   }
  6.   valeur = premier->element;
  7.   cellule *aDetruire = premier;
  8.   premier = premier->suivant;
  9.   delete aDetruire;
  10.   return true;
  11. }
  12. template <typename TYPE>
  13. void Pile<TYPE>::vider() {
  14.   TYPE valeur;
  15.   while (! estVide()) {
  16.     depiler(valeur);
  17.   }
  18. }


 
comme cela ca compile, mais le prof a dans ses exemples cette version de vider() qui ne fonctionne pas
 

Code :
  1. template <typename TYPE>
  2. void Pile<TYPE>::vider() {
  3.   while (! estVide()) {
  4.     depiler();
  5.   }
  6. }


 
sachant que je n'ai pas réelement besoin de savoir qu'elle est la valeur de l'élément dépilé, que je veux simplement le dépiler (j'ai une autre fonction qui me retourne la valeur du dessus de la pile), c'est normal le changement que j'ai du apporter?


Message édité par burgergold le 24-10-2004 à 20:28:03
Reply

Marsh Posté le 23-10-2004 à 20:15:38   

Reply

Marsh Posté le 23-10-2004 à 20:20:00    

-_-
 
je comprend pas l'intérêt de passer un truc en argument à dépiler
le changement que t'as fait, c'est ajouter une valeur qui sert de retour, ce qui dans le cas précis ne sert strictement à rien (vu que t'as pas besoin de (retour)
 
Tu crées une fonction depiler(void) et tu enleves la ligne valeur=machintruc et t'as fini [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-10-2004 à 20:25:56    

Masklinn a écrit :

-_-
 
je comprend pas l'intérêt de passer un truc en argument à dépiler
le changement que t'as fait, c'est ajouter une valeur qui sert de retour, ce qui dans le cas précis ne sert strictement à rien (vu que t'as pas besoin de (retour)
 
Tu crées une fonction depiler(void) et tu enleves la ligne valeur=machintruc et t'as fini [:spamafote]


 
en gros je le déclare en bool encore, jretourne true si j'ai dépilé quelques chose, mais j'utilise pas de paramêtre et je vire l'affectation valeur = premier->element
 
edit: ou meme le bool ne sert à rien?


Message édité par burgergold le 23-10-2004 à 20:26:34
Reply

Marsh Posté le 23-10-2004 à 20:28:17    

ben ca dépend de la manière dont tu gères tes erreurs -_-
(puisque c'est apparement la seule utilité de ton bool de retour)
 
A la limite si ton user veut dépiler sans rien récupérer il s'en fout de savoir si le dépilage a eu lieu ou si la pile était déjà vide, non?
(surtout dans la mesure ou la chaine de dépilage est encapsulée dans une boucle vérifiant l'état de la pile)


Message édité par masklinn le 23-10-2004 à 20:29:07

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-10-2004 à 20:30:39    

Masklinn a écrit :

ben ca dépend de la manière dont tu gères tes erreurs -_-
(puisque c'est apparement la seule utilité de ton bool de retour)
 
A la limite si ton user veut dépiler sans rien récupérer il s'en fout de savoir si le dépilage a eu lieu ou si la pile était déjà vide, non?


 
jaurais tendance à dire oui vu que jvais habituellement tester si la pile est vide avant de le faire :/
 
sinon ca serait mieux d'utiliser le fait que mon dépiler me retourne la valeur?
 
car bien souvent, quand jvais faire du gros traitement avec ma pile, je risque d'appeler ma méthode dessus() [qui me renvoit l'élément en haut de pile] suivit de dépiler, ca risque d'être un peu plus exigeant dans ce cas là
 
par contre lorsque je vais vider la pile, ca sera plus rapide sans retour de valeur

Reply

Marsh Posté le 23-10-2004 à 20:31:35    

dessus (ce nom est un peu pourri fyi), ca sert à quoi, remplacer la prochaine valeur sans la dépiler?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-10-2004 à 20:33:57    

Masklinn a écrit :

dessus (ce nom est un peu pourri fyi), ca sert à quoi, remplacer la prochaine valeur sans la dépiler?


 
faut le dire au prof que c'est un nom mauvais :D
 
dessus() me renvoit la valeur de l'élément en haut de pile sans y toucher

Reply

Marsh Posté le 23-10-2004 à 20:34:49    

quoi? explique mais jai simplement copier ce que j'ai dans mes notes :D
 
edit: merde taz a effacé son post


Message édité par burgergold le 23-10-2004 à 20:35:10
Reply

Marsh Posté le 23-10-2004 à 20:36:13    

quel intérêt c'a a d'utiliser dessus() puis dépiler alors que tu pourrais dépiler avec un retour de valeur?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-10-2004 à 20:38:24    

Masklinn a écrit :

quel intérêt c'a a d'utiliser dessus() puis dépiler alors que tu pourrais dépiler avec un retour de valeur?


 
c'est justement la question
 
si j'ai un dépiler sans retour de valeur, ca sera mieux pour ma méthode vider() non?
 
par contre ca sera moins bien quand viendra le temps de faire du traitement sur ma pile
 
et en sachant que je risque de faire plus de traitement sur la pile que d'appel à vider(), je suis donc mieux de coder mon depiler() avec retour de valeur, vrai?
 
edit: et donc de laisser mon code exactement ainsi :D


Message édité par burgergold le 23-10-2004 à 20:38:57
Reply

Marsh Posté le 23-10-2004 à 20:38:24   

Reply

Marsh Posté le 23-10-2004 à 20:41:07    

suffit de créer 2 fonctions différentes -_-


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-10-2004 à 20:42:36    

Masklinn a écrit :

suffit de créer 2 fonctions différentes -_-


 
ca vaut vraiment la peine selon toi? j'y perds pas grand chose dans le vider, et ca sera pas souvent appelé :/

Reply

Marsh Posté le 23-10-2004 à 20:49:01    

c'est pas comme si c'était dur hein -_-
 
genre (taz va surement gueuler mais j'men fous :o)

Code :
  1. void Pile<TYPE>::depiler(void)
  2. {
  3.     if(!estVide())
  4.     {
  5.         cellule *aDetruire = premier;
  6.         premier = premier->suivant;
  7.         delete aDetruire;
  8.     }
  9. }
  10. bool Pile<TYPE>::depiler(TYPE& valeur)
  11. {
  12.     if(estVide())
  13.         return false;
  14.     valeur = premier->element;
  15.     depiler();
  16.     return true;
  17. }


 
et dans ton .h t'as
void depiler(void);
bool depiler(TYPE& valeur);


Message édité par masklinn le 23-10-2004 à 20:49:44

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-10-2004 à 20:51:19    

dac
 
1) pk taz va gueuler sur ca?
2) selon sque le prof a dit, on peut pas avoir un .h et un .cpp avec notre utilisation des templates, faut que ca soit dans le même fichier. et justement un pote qui a commencé le travail avant moi avait eu ce problème et il a donc tout foutu dans un .h (les déclarations et son code) et dans son tp2.cpp il fait un include de Pile.h

Reply

Marsh Posté le 23-10-2004 à 20:56:15    

Burgergold a écrit :

dac
 
1) pk taz va gueuler sur ca?


parce que Taz gueule toujours :o

Citation :

2) selon sque le prof a dit, on peut pas avoir un .h et un .cpp avec notre utilisation des templates, faut que ca soit dans le même fichier. et justement un pote qui a commencé le travail avant moi avait eu ce problème et il a donc tout foutu dans un .h (les déclarations et son code) et dans son tp2.cpp il fait un include de Pile.h


Oui j'ai merdé, quand ya des templates les fonctions sont dans la déclaration, donc oublies les deux lignes du bas :o
(d'ailleurs quand tu fais des templates c'est directement le code, pas de déclaration à coté)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-10-2004 à 20:58:10    

bon bin merci pour l'aide, jvais continuer avec ca et tester, après ca sera la File et après le tp en lui même
 
:jap:

Reply

Marsh Posté le 23-10-2004 à 21:04:47    

c'est quoi le sujet de TP?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-10-2004 à 21:06:07    

Depiler(void)
c'est beau ça ...
 
bool Pile<TYPE>::Depiler(TYPE& valeur)
les exceptions, c'est pas pour les iench ...
 
# void Pile<TYPE>::vider() {
#   TYPE valeur;
#   while (! estVide()) {
#     depiler(valeur);
#   }
vachement efficace ...

Reply

Marsh Posté le 23-10-2004 à 21:09:42    

Masklinn a écrit :

c'est quoi le sujet de TP?


 
jai des expressions à lire dans un fichier, du genre "3 4 +" (mais en vachement plus compliquer
 
faut une classe Pile, File, Expression, Symbole
 
je dois lire le tout, le mettre sous un formation d'équation "normal" (jme rappel jamais du terme, jcrois que c'est infixé), et l'évaluer
 
faut gérer les priorités d'opérateur, les parenthèses et tout le tralala

Reply

Marsh Posté le 23-10-2004 à 21:09:47    

Taz a écrit :

Depiler(void)
c'est beau ça ...


pourquoi je peux pas? [:sisicaivrai]
 
et pour les exceptions, j'y ai pensé mais ca dépend de la fréquence avec laquelle il tente d'extraire des valeurs d'une pile vide [:figti]  
 
(parce que si 30% des dépilages se font sur des piles vides je suis pas sur que les exceptions soient très intéressantes)
 
burger > ta fonction vider, elle est pas imposée par le prof? [:gratgrat]


Message édité par masklinn le 23-10-2004 à 21:11:53

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-10-2004 à 21:09:58    

Taz a écrit :

Depiler(void)
c'est beau ça ...
 
bool Pile<TYPE>::Depiler(TYPE& valeur)
les exceptions, c'est pas pour les iench ...
 
# void Pile<TYPE>::vider() {
#   TYPE valeur;
#   while (! estVide()) {
#     depiler(valeur);
#   }
vachement efficace ...


 
tu suggères?
 
edit: et dailleurs maintenant le vider c'est
 

Code :
  1. void Pile<TYPE>::vider() {
  2.   while (! estVide()) {
  3.     depiler();
  4.   }
  5. }


Message édité par burgergold le 23-10-2004 à 21:11:27
Reply

Marsh Posté le 23-10-2004 à 21:46:51    

Tu peux t'inspirer du code de la STL en regardant l'adaptateur de conteneur std::stack.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 23-10-2004 à 21:48:42    

xterminhate a écrit :

Tu peux t'inspirer du code de la STL en regardant l'adaptateur de conteneur std::stack.


 
ok merci, jai justement besoin de voir comment faire mon affectateur pour ma surcharge du "=", p-e que jvais y trouver quelques chose

Reply

Marsh Posté le 24-10-2004 à 20:32:53    

hum petit problème avec ma classe de File
 
j'ai pas encore tout tester mais ma méthode defiler() ne semble pas toujours fonctionner :/
 

Code :
  1. template <typename TYPE>
  2. class File {
  3.   private:
  4.     struct cellule {
  5.       TYPE element;
  6.       cellule* suivant;
  7.       cellule(const TYPE& e) {
  8.         element=e;
  9.       }
  10.       cellule(const TYPE& e, cellule* s) {
  11.         element=e;
  12.         suivant=s;
  13.       }
  14.     };
  15.     File(const File& );
  16.     cellule *queue;
  17.   public:
  18.     File();
  19.     ~File();
  20.     const File& operator=(const File& );
  21.     void enfiler(const TYPE& );
  22.     void defiler();
  23.     bool defiler(TYPE& );
  24.     bool estVide() const;
  25.     void vider();
  26.     const TYPE& tete() const;
  27. };
  28. template <typename TYPE>
  29. File<TYPE>::File() {
  30.   queue = NULL;
  31. }
  32. template <typename TYPE>
  33. File<TYPE>::~File() {
  34.   vider();
  35. }
  36. template <typename TYPE>
  37. void File<TYPE>::enfiler(const TYPE& e) {
  38.   if (queue == NULL) {
  39.     queue = new cellule(e);
  40.     queue->suivant = queue;
  41.   } else {
  42.     queue = queue->suivant = new cellule(e, queue->suivant);
  43.   }
  44. }
  45. template <typename TYPE>
  46. void File<TYPE>::defiler() {
  47.   if (! estVide()) {
  48.     cellule *aDetruire = queue->suivant;
  49.     queue->suivant = aDetruire->suivant;
  50.     if (aDetruire == queue)
  51.       queue = NULL;
  52.     delete aDetruire;
  53.   }
  54. }
  55. template <typename TYPE>
  56. bool File<TYPE>::defiler(TYPE& valeur) {
  57.   if (estVide())
  58.     return false;
  59.   cellule *aDetruire = queue->suivant;
  60.   valeur = aDetruire->element;
  61.   queue->suivant = aDetruire->suivant;
  62.   if (aDetruire == queue)
  63.     queue == NULL;
  64.   delete aDetruire;
  65.   return true;
  66. }
  67. template <typename TYPE>
  68. bool File<TYPE>::estVide() const {
  69.   return queue == NULL;
  70. }
  71. template <typename TYPE>
  72. void File<TYPE>::vider() {
  73.   while (! estVide()) {
  74.     defiler();
  75.   }
  76. }
  77. template <typename TYPE>
  78. const TYPE& File<TYPE>::tete() const {
  79.   assert(! estVide());
  80.   return queue->element;
  81. }


 

Code :
  1. #include <fstream>
  2. #include <iostream>
  3. #include "File.h"
  4. #include "Pile.h"
  5. using namespace std;
  6. int main() {
  7.   File<int> test;
  8.   test.enfiler(2);
  9.   cout << test.estVide() << endl;
  10.   test.defiler();
  11.   cout << test.estVide() << endl;
  12.   return 0;
  13. }


 
ca sa fonctionne mais
 

Code :
  1. #include <fstream>
  2. #include <iostream>
  3. #include "File.h"
  4. #include "Pile.h"
  5. using namespace std;
  6. int main() {
  7.   File<int> test;
  8.   int valeur;
  9.   test.enfiler(2);
  10.   cout << test.estVide() << endl;
  11.   cout << test.defiler(valeur) << endl;
  12.   cout << test.estVide() << endl;
  13.   cout << valeur << endl;
  14.   return 0;
  15. }


 
valeur a bien la bonne valeur, mais test.estVide() me retourne pas true lorsque ma file est vide et je comprends pas vraiment
 
les 2 fonctions defiler font "pratiquement" la meme chose, yen a une qui défile, l'autre défile avec un effet de bord


Message édité par burgergold le 24-10-2004 à 21:56:18
Reply

Marsh Posté le 24-10-2004 à 20:36:52    

const File& operator=(const File& ); c'est pas la bonne signature ça
 
manque un constructeur de recopie
 
 
défiler c'est pas français. utilise ajouter/enlever

Reply

Marsh Posté le 24-10-2004 à 20:40:21    

Taz a écrit :

const File& operator=(const File& ); c'est pas la bonne signature ça
 
manque un constructeur de recopie
 
 
défiler c'est pas français. utilise ajouter/enlever


 
tiré des notes du prof :/
 

Code :
  1. const File& operator=(const File& ); // affectateur
  2. File(const File& );                  // copier désactivé


 
meme chose pour les noms enfiler, defiler
 

Reply

Marsh Posté le 24-10-2004 à 20:50:06    

ben c'est pas bien, surtout que "const File& operator=(const File& );" n'est pas la signature canonique de l'opérateur d'affectation.
 
enfin bon, ton prof est supide, quel intérêt d'écrire un conteneur s'il ne peux même pas se contenir ...
 
 
 
# cellule(const TYPE& e, cellule* s=NULL) {
#         element=e;
#         suivant=s;
#       }
la par contre, tu looses sérieusement...

Reply

Marsh Posté le 24-10-2004 à 20:54:23    

Taz a écrit :

ben c'est pas bien, surtout que "const File& operator=(const File& );" n'est pas la signature canonique de l'opérateur d'affectation.
 
enfin bon, ton prof est supide, quel intérêt d'écrire un conteneur s'il ne peux même pas se contenir ...
 
 
 
# cellule(const TYPE& e, cellule* s=NULL) {
#         element=e;
#         suivant=s;
#       }
la par contre, tu looses sérieusement...


 
le prof est pas mauvais en soi, c'est le doyen et tout ceux qui l'on eu comme prof le considère comme l'un des meilleurs profs :/
 
mais bon, passons
 
bon pour mon constructeur de cellule, j'suis parti d'un modèle avec une tête et une queue, mais j'ai opté pour le modèle avec seulement une queue et peut-être que le constructeur doit être différent effectivement :/

Reply

Marsh Posté le 24-10-2004 à 20:58:33    

il est mauvais, il a jamais lu un vrai bouquin :o
 
sinon, pour ta classe cellule, pourquoi tu fais des affectations plutôt que des initilisations ? du reste la classe File, elle manque un peu d'inlining :o

Reply

Marsh Posté le 24-10-2004 à 21:02:47    

Taz a écrit :

il est mauvais, il a jamais lu un vrai bouquin :o
 
sinon, pour ta classe cellule, pourquoi tu fais des affectations plutôt que des initilisations ? du reste la classe File, elle manque un peu d'inlining :o


 
"pourquoi tu fais des affectations plutôt que des initilisations ?"
parce que je fais ce que "le prof nul qui a jamais lu un vrai bouquin" m'a montré :D
 
"elle manque un peu d'inlining"
ouais ca j'ai lu dans mes notes "C'est exactement le genre de fonction que l'on a avantage à coder inline"
Mais bon, je commence à peine mon truc, alors jvais commencer par le faire fonctionner :D

Reply

Marsh Posté le 24-10-2004 à 21:58:16    

jai édité mon code en modifiant le constructeur de cellule, j'en ai aussi ajouté un (constructeur du premier élément)
 
mais ca ne change rien à mon problème de méthode defiler() qui ne fonctionne pas en version effet de bord (puisque ma methode estVide() me dit que ma file est pas vide alors qu'elle devrait l'être :/)

Reply

Marsh Posté le 24-10-2004 à 22:04:52    

ça c'est de l'algo :o

Reply

Marsh Posté le 24-10-2004 à 22:07:48    

Taz a écrit :

ça c'est de l'algo :o


 
bin ce qui est un peu con, c'est que j'ai tout récupéré des notes et ca fonctionne pas, c'est plutot ca qui me fait chier :D
 
c'est pas comme si le prof nous avait dit: faite moi une classe de File et de Pile
 
il nous a dit: faite le tp, en utilisant les Files et les Piles de tel facon, ca devrait bien se faire
 
alors jrécupère mes notes, jle mets en fichier et prout :sweat:

Reply

Marsh Posté le 24-10-2004 à 22:40:21    

Les algos sont complètement faux. Et en plus, c'est n'est pas une file mais une pile.
 
Empiler:
  queue= nouvelElement(valeur,queue);
 
Depiler:
  nouvelleQueue = queue->suivant
  valeur = queue->valeur
  delete queue
  queue=nouvelleQueue
  return valeur

Reply

Marsh Posté le 24-10-2004 à 22:47:21    

crème dépilatoire ... magnifique ...

Reply

Marsh Posté le 24-10-2004 à 22:56:26    

Lam's a écrit :

Les algos sont complètement faux. Et en plus, c'est n'est pas une file mais une pile.
 
Empiler:
  queue= nouvelElement(valeur,queue);
 
Depiler:
  nouvelleQueue = queue->suivant
  valeur = queue->valeur
  delete queue
  queue=nouvelleQueue
  return valeur


 
 :sweat:  
 
merde jsais plus quoi en penser, c'est vraiment des algos de file selon mon manuel de note, j'commence à me demander si vous vous payez pas mal tête :D
 
en gros la représentation c'est
 
1 queue qui pointe sur le dernier élément de la liste
le dernier élément pointe sur le 1er
le 1er sur le 2e, 2e sur le 3e, 3e sur 4e... Xe sur le dernier
 
c'est pas une file ca?


Message édité par burgergold le 24-10-2004 à 22:56:52
Reply

Marsh Posté le 25-10-2004 à 09:14:58    

Au temps pour moi, j'avais pas vu qu'il s'agissait d'une liste circulaire (je pensais à une vague file avec un pointeur sur le début, et un sur la fin). Ca m'apprendra à poster quand je suis sous médocs...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed