Pile en C++
Fermé
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
-
20 déc. 2009 à 20:39
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 20 déc. 2009 à 23:11
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 20 déc. 2009 à 23:11
15 réponses
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
20 déc. 2009 à 22:02
20 déc. 2009 à 22:02
Déjà il faut se poser la question de ce qu'est censé faire la méthode afficher...
Normalement, elle ne devrait pas prendre de paramètre !!!
On devrait avoir : void pile::afficher();
Normalement, elle ne devrait pas prendre de paramètre !!!
On devrait avoir : void pile::afficher();
grou29
Messages postés
39
Date d'inscription
mardi 27 octobre 2009
Statut
Membre
Dernière intervention
19 mai 2010
9
20 déc. 2009 à 21:28
20 déc. 2009 à 21:28
salut,
Est ce que ton objet pile hérite bien de l'objet elt ?
-
Grou29
http://lienssanslien.free.fr
Est ce que ton objet pile hérite bien de l'objet elt ?
-
Grou29
http://lienssanslien.free.fr
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
20 déc. 2009 à 21:52
20 déc. 2009 à 21:52
candidates are: void pile::Afficher(elt*) -> ton compilateur accepte ta méthode
Par contre ton programme de test est bizarre :
(*une_pile).Afficher(une_pile); ???
Ton compilateur comprend que "une_pile" est une "pile*" par l'appel de la méthode, et un "elt*" par l'appel des paramètres.
En gros tu dis que une_pile est à la fois pile et elt.
La seule chance pour que ça marche c'est (comme grou29 le suggérait) qu'il y ait une relation mère-fille entre les classes elt et pile.
Par contre ton programme de test est bizarre :
(*une_pile).Afficher(une_pile); ???
Ton compilateur comprend que "une_pile" est une "pile*" par l'appel de la méthode, et un "elt*" par l'appel des paramètres.
En gros tu dis que une_pile est à la fois pile et elt.
La seule chance pour que ça marche c'est (comme grou29 le suggérait) qu'il y ait une relation mère-fille entre les classes elt et pile.
bonsoir , pas du tout j'ai fait un fichier.h dans lequel je forme le type element et je l'ai inclu j'ai pas d'heritage
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
20 déc. 2009 à 21:55
20 déc. 2009 à 21:55
Donc ton programme de test est faux !
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
>
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
20 déc. 2009 à 22:00
20 déc. 2009 à 22:00
lekel je ne comprends pas
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
20 déc. 2009 à 21:59
20 déc. 2009 à 21:59
Je precise que j'ai pas d'heritage
si je met ça une_pile.Afficher(une_pile.un_elt);
(un_elt est un attrribut de la classe pile et une_pile est un objet de la meme classe)
ça compile mais pas d'affichage (ça se plante)
si je met ça une_pile.Afficher(une_pile.un_elt);
(un_elt est un attrribut de la classe pile et une_pile est un objet de la meme classe)
ça compile mais pas d'affichage (ça se plante)
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
20 déc. 2009 à 22:06
20 déc. 2009 à 22:06
il faut bien qu'elle ma pille que j'ai constiuté si je lui donne rien comment elle affiche??
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
20 déc. 2009 à 22:08
20 déc. 2009 à 22:08
voici son code
//Methode pour Afficher
void pile :: Afficher( elt *lapile)
{ elt *p;
p=lapile;
while(p!=NULL)
{ printf("\nLa valeur est %d\n", (*p).valeur);
p=(*p).suivant;
}
}
//Methode pour Afficher
void pile :: Afficher( elt *lapile)
{ elt *p;
p=lapile;
while(p!=NULL)
{ printf("\nLa valeur est %d\n", (*p).valeur);
p=(*p).suivant;
}
}
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
20 déc. 2009 à 22:16
20 déc. 2009 à 22:16
Faut pas que tu le prenne mal mais c'est moche ;-)
class Pile { private Elt valeur; private Pile* suiv; void afficher() { std::cout << valeur << std::endl; if (suiv!=NULL) suiv->afficher(); } }
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
20 déc. 2009 à 22:20
20 déc. 2009 à 22:20
c'est la meme chose
j'ai mi private Elt valeur;
private Pile* suiv;
dans un fichier elt.h
dans ma classe j'ai donc elt un_elt;
j'ai mi private Elt valeur;
private Pile* suiv;
dans un fichier elt.h
dans ma classe j'ai donc elt un_elt;
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
20 déc. 2009 à 22:33
20 déc. 2009 à 22:33
Oui mais c'est ta fonction afficher() qui n'est pas bonne !
Si vraiment tu veux la faire avec un while() ce qui n'est pas vraiment le mieux tu aurais :
Si vraiment tu veux la faire avec un while() ce qui n'est pas vraiment le mieux tu aurais :
void pile::afficher() { Pile* p=this; while(p!=NULL) { printf("La valeur est %d\n", p->valeur); p=p->suivant; } }
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
20 déc. 2009 à 22:49
20 déc. 2009 à 22:49
si tu permets j'aimerais te faire parvenir tout mon programme
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
20 déc. 2009 à 22:51
20 déc. 2009 à 22:51
Bah vas-y colle toute ta classe ici, mais n'oublie pas les balises de code pour conserver l'indentation
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
20 déc. 2009 à 22:39
20 déc. 2009 à 22:39
ça me donne deux erreurs
56C:\Users\...\Documents\mes docs\c++\une_pile\pile.cpp 'class pile' has no member named 'valeur'
57 C:\Users\...\Documents\mes docs\c++\une_pile\pile.cpp 'class pile' has no member named 'suivant'
56C:\Users\...\Documents\mes docs\c++\une_pile\pile.cpp 'class pile' has no member named 'valeur'
57 C:\Users\...\Documents\mes docs\c++\une_pile\pile.cpp 'class pile' has no member named 'suivant'
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
20 déc. 2009 à 22:49
20 déc. 2009 à 22:49
Moi je les ai mis dans ma déclaration post 10, et tu me dis l'avoir mis post 11...
Mais peut-être as-tu oublié de les mettre dans ton .h
Mais peut-être as-tu oublié de les mettre dans ton .h
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
20 déc. 2009 à 22:50
20 déc. 2009 à 22:50
pas du tout
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
20 déc. 2009 à 22:53
20 déc. 2009 à 22:53
//Definition (implementation) d'un élément qui formera la pile
#ifndef _ELT_H_
#define _ELT_H_
typedef struct elet
{
int valeur;
elet *suivant;
}elt;
#endif
#ifndef _ELT_H_
#define _ELT_H_
typedef struct elet
{
int valeur;
elet *suivant;
}elt;
#endif
simachille
Messages postés
64
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
4 octobre 2011
20 déc. 2009 à 22:56
20 déc. 2009 à 22:56
//Fichier .h de la classe pile
#ifndef _PILE_H_
#define _PILE_H_
#include "elt.h"
class pile
{
elt *un_elt;
//Methodes
public:
//Methode pour depiler
elt* empiler(elt *lapile,int a);
//Methode pour lire les valeurs
void lire();
//Methode pour depiler
elt* depiler(elt *lapile);
//fonction pour Afficher
void Afficher();
};
#endif
#include <iostream>
#include "elt.h"
#include "pile.h"
using namespace std;
//Methode pour Empiler
elt* pile :: empiler (elt *lapile,int val)
{ elt *p,*elm;
if(lapile==NULL)
{lapile=(elt*)malloc(sizeof(elt));
(*lapile).valeur=val;
(*lapile).suivant=NULL;
}
else
{
elm=(elt*)malloc(sizeof(elt));
(*elm).valeur=val;
(*elm).suivant=lapile;
lapile=elm;
}
return lapile ;
}
//Methode pour lire les valeurs
void pile::lire()
{elt *pile;
int i,n,valeur;
cout<<"\nDonner la taille de la pile\n";
cin>>n;
pile=NULL;
for(i=1;i<=n;i++)
{cout<<"entrer la valeur \t"<<i;
cin>>valeur;
pile=pile::empiler(pile,valeur);
}
}
////Methode pour Depiler
//elt* pile ::Depiler (elt *lapile)
// { elt *p;
// p=lapile;
// lapile=(*lapile).suivant;
// free(p);
// return lapile;
//}
//Methode pour Afficher
void pile::Afficher()
{
pile* p=this;
while(p!=NULL)
{
cout<<"\nLa valeur est \n"<< (*p).valeur;
p=(*p).suivant;
}
}
// void pile :: Afficher( elt *lapile)
// { elt *p;
// p=lapile;
// while(p!=NULL)
// { cout<<"\nLa valeur est \n"<< (*p).valeur;
// p=(*p).suivant;
// }
// }
Prog principal
#include <iostream>
#include "elt.h"
#include "pile.h"
using namespace std;
main()
{
pile *une_pile=new pile();int s;
(*une_pile).lire();
(*une_pile).Afficher();
//cin>>s;
}
#ifndef _PILE_H_
#define _PILE_H_
#include "elt.h"
class pile
{
elt *un_elt;
//Methodes
public:
//Methode pour depiler
elt* empiler(elt *lapile,int a);
//Methode pour lire les valeurs
void lire();
//Methode pour depiler
elt* depiler(elt *lapile);
//fonction pour Afficher
void Afficher();
};
#endif
#include <iostream>
#include "elt.h"
#include "pile.h"
using namespace std;
//Methode pour Empiler
elt* pile :: empiler (elt *lapile,int val)
{ elt *p,*elm;
if(lapile==NULL)
{lapile=(elt*)malloc(sizeof(elt));
(*lapile).valeur=val;
(*lapile).suivant=NULL;
}
else
{
elm=(elt*)malloc(sizeof(elt));
(*elm).valeur=val;
(*elm).suivant=lapile;
lapile=elm;
}
return lapile ;
}
//Methode pour lire les valeurs
void pile::lire()
{elt *pile;
int i,n,valeur;
cout<<"\nDonner la taille de la pile\n";
cin>>n;
pile=NULL;
for(i=1;i<=n;i++)
{cout<<"entrer la valeur \t"<<i;
cin>>valeur;
pile=pile::empiler(pile,valeur);
}
}
////Methode pour Depiler
//elt* pile ::Depiler (elt *lapile)
// { elt *p;
// p=lapile;
// lapile=(*lapile).suivant;
// free(p);
// return lapile;
//}
//Methode pour Afficher
void pile::Afficher()
{
pile* p=this;
while(p!=NULL)
{
cout<<"\nLa valeur est \n"<< (*p).valeur;
p=(*p).suivant;
}
}
// void pile :: Afficher( elt *lapile)
// { elt *p;
// p=lapile;
// while(p!=NULL)
// { cout<<"\nLa valeur est \n"<< (*p).valeur;
// p=(*p).suivant;
// }
// }
Prog principal
#include <iostream>
#include "elt.h"
#include "pile.h"
using namespace std;
main()
{
pile *une_pile=new pile();int s;
(*une_pile).lire();
(*une_pile).Afficher();
//cin>>s;
}
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
20 déc. 2009 à 23:11
20 déc. 2009 à 23:11
Ce n'est pas vraiment ça que j'appelle utiliser les balises de code !
Pourquoi vouloir mélanger le C et le C++ ?
Dans ton .h tu ne définis pas un type elt, mais une struct elet dont elt est une instance !
Le mieux c'est de faire une classe Elt...
Mais en fait ta classe Elt telle que tu l'as définis ici c'est déjà ta classe Pile !
Remarque : (un_type*).qqch <=> un_type->qqch !!!
De plus normalement tu n'as pas besoin de faire de malloc, l'allocation mémoire se fait dans ton constructeur et la désallocation dans ton destructeur mais tu n'as fait aucun des deux !
Bref : si tu veux faire du C++, oublie le C (pas totalement mais quand même)
Regarde le site du zéro, c'est un bon site pour commencer. En particulier regarde les cours sur les classes même si un peu avant ne devrait pas te faire de mal...
Pourquoi vouloir mélanger le C et le C++ ?
Dans ton .h tu ne définis pas un type elt, mais une struct elet dont elt est une instance !
Le mieux c'est de faire une classe Elt...
Mais en fait ta classe Elt telle que tu l'as définis ici c'est déjà ta classe Pile !
Remarque : (un_type*).qqch <=> un_type->qqch !!!
De plus normalement tu n'as pas besoin de faire de malloc, l'allocation mémoire se fait dans ton constructeur et la désallocation dans ton destructeur mais tu n'as fait aucun des deux !
Bref : si tu veux faire du C++, oublie le C (pas totalement mais quand même)
Regarde le site du zéro, c'est un bon site pour commencer. En particulier regarde les cours sur les classes même si un peu avant ne devrait pas te faire de mal...