Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
736 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Class de Pile et de File

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Class de Pile et de File

n°880954
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 20:15:38  profilanswer
 

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
mood
Publicité
Posté le 23-10-2004 à 20:15:38  profilanswer
 

n°880955
masklinn
í dag viðrar vel til loftárása
Posté le 23-10-2004 à 20:20:00  profilanswer
 

-_-
 
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
n°880957
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 20:25:56  profilanswer
 

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
n°880959
masklinn
í dag viðrar vel til loftárása
Posté le 23-10-2004 à 20:28:17  profilanswer
 

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
n°880960
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 20:30:39  profilanswer
 

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

n°880961
masklinn
í dag viðrar vel til loftárása
Posté le 23-10-2004 à 20:31:35  profilanswer
 

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
n°880963
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 20:33:57  profilanswer
 

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

n°880965
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 20:34:49  profilanswer
 

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
n°880968
masklinn
í dag viðrar vel til loftárása
Posté le 23-10-2004 à 20:36:13  profilanswer
 

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
n°880970
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 20:38:24  profilanswer
 

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
mood
Publicité
Posté le 23-10-2004 à 20:38:24  profilanswer
 

n°880972
masklinn
í dag viðrar vel til loftárása
Posté le 23-10-2004 à 20:41:07  profilanswer
 

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
n°880973
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 20:42:36  profilanswer
 

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é :/

n°880977
masklinn
í dag viðrar vel til loftárása
Posté le 23-10-2004 à 20:49:01  profilanswer
 

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
n°880979
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 20:51:19  profilanswer
 

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

n°880980
masklinn
í dag viðrar vel til loftárása
Posté le 23-10-2004 à 20:56:15  profilanswer
 

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
n°880982
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 20:58:10  profilanswer
 

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:

n°880984
masklinn
í dag viðrar vel til loftárása
Posté le 23-10-2004 à 21:04:47  profilanswer
 

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
n°880985
Taz
bisounours-codeur
Posté le 23-10-2004 à 21:06:07  profilanswer
 

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 ...

n°880986
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 21:09:42  profilanswer
 

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

n°880987
masklinn
í dag viðrar vel til loftárása
Posté le 23-10-2004 à 21:09:47  profilanswer
 

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
n°880988
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 21:09:58  profilanswer
 

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
n°881013
xterminhat​e
Si vis pacem, para bellum.
Posté le 23-10-2004 à 21:46:51  profilanswer
 

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


---------------
Cordialement, Xterm-in'Hate...
n°881016
burgergold
5$? va chez l'diable!
Posté le 23-10-2004 à 21:48:42  profilanswer
 

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

n°881450
burgergold
5$? va chez l'diable!
Posté le 24-10-2004 à 20:32:53  profilanswer
 

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
n°881452
Taz
bisounours-codeur
Posté le 24-10-2004 à 20:36:52  profilanswer
 

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

n°881456
burgergold
5$? va chez l'diable!
Posté le 24-10-2004 à 20:40:21  profilanswer
 

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
 

n°881460
Taz
bisounours-codeur
Posté le 24-10-2004 à 20:50:06  profilanswer
 

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...

n°881461
burgergold
5$? va chez l'diable!
Posté le 24-10-2004 à 20:54:23  profilanswer
 

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 :/

n°881466
Taz
bisounours-codeur
Posté le 24-10-2004 à 20:58:33  profilanswer
 

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

n°881471
burgergold
5$? va chez l'diable!
Posté le 24-10-2004 à 21:02:47  profilanswer
 

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

n°881508
burgergold
5$? va chez l'diable!
Posté le 24-10-2004 à 21:58:16  profilanswer
 

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 :/)

n°881518
Taz
bisounours-codeur
Posté le 24-10-2004 à 22:04:52  profilanswer
 

ça c'est de l'algo :o

n°881523
burgergold
5$? va chez l'diable!
Posté le 24-10-2004 à 22:07:48  profilanswer
 

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:

n°881562
Lam's
Profil: bas.
Posté le 24-10-2004 à 22:40:21  profilanswer
 

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

n°881569
Taz
bisounours-codeur
Posté le 24-10-2004 à 22:47:21  profilanswer
 

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

n°881584
burgergold
5$? va chez l'diable!
Posté le 24-10-2004 à 22:56:26  profilanswer
 

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
n°881727
Lam's
Profil: bas.
Posté le 25-10-2004 à 09:14:58  profilanswer
 

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...

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Class de Pile et de File

 

Sujets relatifs
[CSS] Mise ne forme des liens dans une class ?Modification dynamiqe de "class" (et non d'ID)
Problème de declaration de sous-classFile_exists et fichier distant
[Javascript] Input File - Griser le textfield / Test sur le fichierconvertir string en File
<input type="file" : multiselection ou selection d1 repertoirelancer une class en tache de fond ???
Tas, pile et pointeur[Makefile] qu'est-ce qui cloche avec ce make file
Plus de sujets relatifs à : [C++] Class de Pile et de File


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR