21 réponses
normal que ça marche pas, il y a plusierus erreurs
1) ne met pas d'accent en informatique: année => annee
2)
remplace les 2 dernières méthodes par
ostream& operator<<( ostream& flux,const Date& D)
{
flux<<D.jour<<"/"<<D.mois<<"/"<<D.annee;
return flux;
};
istream& operator>>( istream& flux,Date& D)
{
cout<<"entrez le jours.\n";
flux>>D.jour;
cout<<"entrez le mois.\n";
flux>>D.mois;
cout<<"entrez l'année.\n";
flux>>D.année;
return flux ;
};
3) il manque les méthodes
date () // date par défaut
{
jour=1;
mois=1;
annee=2003;
}
date(int x,int y,int z)
{
jour=x;
mois=y;
annee=z;
}
void afficher()
{
cout << *this;
}
avec ça ça devraitm eux marcher.
s'il y a d'autres problèmes repostes ton code ici on le corrigera !
courage, le C++ demande de la riguer,
marvinrouge
1) ne met pas d'accent en informatique: année => annee
2)
remplace les 2 dernières méthodes par
ostream& operator<<( ostream& flux,const Date& D)
{
flux<<D.jour<<"/"<<D.mois<<"/"<<D.annee;
return flux;
};
istream& operator>>( istream& flux,Date& D)
{
cout<<"entrez le jours.\n";
flux>>D.jour;
cout<<"entrez le mois.\n";
flux>>D.mois;
cout<<"entrez l'année.\n";
flux>>D.année;
return flux ;
};
3) il manque les méthodes
date () // date par défaut
{
jour=1;
mois=1;
annee=2003;
}
date(int x,int y,int z)
{
jour=x;
mois=y;
annee=z;
}
void afficher()
{
cout << *this;
}
avec ça ça devraitm eux marcher.
s'il y a d'autres problèmes repostes ton code ici on le corrigera !
courage, le C++ demande de la riguer,
marvinrouge
voila j'ai fais les modifications
a quoi ca sert ce constructeur
date(int x,int y,int z); mon prof ecrit ca tt le tt mais a quoi ca sert
c quoi la différene entre
void date::afficher()
{
cout<<jour<<"/"<<mois<<"/"<<annee<<"\n";
};
et
void afficher()
{
cout << *this;
}
j'essaye de surcharger l'operateur >
mon prototype de fonction
bool operator >(const date& F);
et la fonction mais malheuresement ma surchage ne fonctionne pas
bool date::operator>(const date& F)
(
date.s
if(s.annee>f.annee)
{return(true);}
else
{ if(s.mois>f.mois)
(return(true);}
else
{
if(s.jour>f.jour)
{return(true);)
}
return(false);
}
};
merci pr l'aide
a quoi ca sert ce constructeur
date(int x,int y,int z); mon prof ecrit ca tt le tt mais a quoi ca sert
c quoi la différene entre
void date::afficher()
{
cout<<jour<<"/"<<mois<<"/"<<annee<<"\n";
};
et
void afficher()
{
cout << *this;
}
j'essaye de surcharger l'operateur >
mon prototype de fonction
bool operator >(const date& F);
et la fonction mais malheuresement ma surchage ne fonctionne pas
bool date::operator>(const date& F)
(
date.s
if(s.annee>f.annee)
{return(true);}
else
{ if(s.mois>f.mois)
(return(true);}
else
{
if(s.jour>f.jour)
{return(true);)
}
return(false);
}
};
merci pr l'aide
réponses à tes questions
1) Le constructeur date(x, y, z) sert à créer la date x/y/z
exemple
date d1(1, 1, 2000); // crée la date d1 (1er janvier 2000)
2) void date::afficher()
{
cout<<jour<<"/"<<mois<<"/"<<annee<<"\n"; // ici tu fais tout le travail "à la main"
};
et
void afficher()
{
cout << *this; // ici tu appelle l'opérateur << que tu as surchargé
}
en théorie puisque tu as surchargé << tu n'as pas besoin de créer une mathode 'afficher'
Pour afficher une date t ufais simplement
cout << d1;
ou
cout << d1 << endl; // affichage de d1 ET passage à la ligne
( au lieu de d1.afficher(); )
3) l'opérateur > pet être surchargé comme ceci (ATTENTION: c'est de mémoire, il y aura des erreurs ...)
int date::operator>(const& date d) const
{
cout << "On teste si " << *this << "<" << d); // (*)
// tes tests ici
}
4) pour tester si d1 > d2 laisse la ligne (*) comme ça tu verras si oui ou non le programme passe dans ta fonction !
Remarques sur >:
a) le 'const' est très important
b) la fonction DOIT retourner un entier et non un booléen
b1) 1 si la date est supérieure à d
b1) 0 si la date est inéférieure ou égale à d
courage et si tu as d'autrzes questions hésites pas !!!
marvinrouge
1) Le constructeur date(x, y, z) sert à créer la date x/y/z
exemple
date d1(1, 1, 2000); // crée la date d1 (1er janvier 2000)
2) void date::afficher()
{
cout<<jour<<"/"<<mois<<"/"<<annee<<"\n"; // ici tu fais tout le travail "à la main"
};
et
void afficher()
{
cout << *this; // ici tu appelle l'opérateur << que tu as surchargé
}
en théorie puisque tu as surchargé << tu n'as pas besoin de créer une mathode 'afficher'
Pour afficher une date t ufais simplement
cout << d1;
ou
cout << d1 << endl; // affichage de d1 ET passage à la ligne
( au lieu de d1.afficher(); )
3) l'opérateur > pet être surchargé comme ceci (ATTENTION: c'est de mémoire, il y aura des erreurs ...)
int date::operator>(const& date d) const
{
cout << "On teste si " << *this << "<" << d); // (*)
// tes tests ici
}
4) pour tester si d1 > d2 laisse la ligne (*) comme ça tu verras si oui ou non le programme passe dans ta fonction !
Remarques sur >:
a) le 'const' est très important
b) la fonction DOIT retourner un entier et non un booléen
b1) 1 si la date est supérieure à d
b1) 0 si la date est inéférieure ou égale à d
courage et si tu as d'autrzes questions hésites pas !!!
marvinrouge
dc comme j'ai deja cree une surcharge de fonction j'ai pas besoin de cree une methode
mais a quoi ca sert * de this
pourquoi ne pas simplement mettre this tt seul?
mais a quoi ca sert * de this
pourquoi ne pas simplement mettre this tt seul?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
pour la surchage de l'operateur >
c bon
mais pr la surcharge cout j'ai pas vraiment compris
par exemple pour pourquoi ce n'est pas bon
friend ostream& operator<<(ostream&,const date& D);
ostream& operator<<(ostream& flux,const date& D)
{
cout<<"entrez le jours.\n";
flux>>D.jour;
cout<<"entrez le mois.\n";
flux>>D.mois;
cout<<"entrez l'année.\n";
flux>>D.année;
return(flux);
};
c bon
mais pr la surcharge cout j'ai pas vraiment compris
par exemple pour pourquoi ce n'est pas bon
friend ostream& operator<<(ostream&,const date& D);
ostream& operator<<(ostream& flux,const date& D)
{
cout<<"entrez le jours.\n";
flux>>D.jour;
cout<<"entrez le mois.\n";
flux>>D.mois;
cout<<"entrez l'année.\n";
flux>>D.année;
return(flux);
};
Bon j'ai trouve pour le ostream
j'ai fais ca
ostream& operator<<(ostream& flux,const date& D)
{
return flux <<D.jour<<"/"<<D.mois<<"/"<<D.annee<<"\n";
};
comme tu l'avais montrés plus haut
voila le code entier il est bon ?
#include <iostream.h> // les classes
#include <istream.h>
class date{
public :
date ();
date(int x,int y,int z);
void afficher();
bool operator>(const date& F);
~date();
friend ostream& operator<<(ostream&,const date& D);
friend istream& operator>>(istream&,date& D);
private:
int jour;
int mois;
int annee;
};
// déclaration des métodes
date::date() // constructeur par defaut
{
jour=1;
mois=1;
annee=2003;
};
date::date(int x,int y,int z)// mon prof mets de construteurs par assignation mais a quoi ca sert ?
{
x= jour;
y= mois;
z= annee;
};
bool date::operator>(const date& F)
{
if(this->annee > F.annee)
{
return true;
}
else if ( this->mois > F.mois && this->annee == F.annee)
{
return true ;
}
else if (this->jour > F.jour && this-> mois == F.mois)
{
return true ;
}
else return false;
};
ostream& operator<<(ostream& flux,const date& D)
{
return flux <<D.jour<<"/"<<D.mois<<"/"<<D.annee<<"\n";
};
istream& operator>>( istream& flux,date& D)
{
cout<<"entrez le jours.\n";
flux>>D.jour;
cout<<"entrez le mois.\n";
flux>>D.mois;
cout<<"entrez l'année.\n";
flux>>D.annee;
return flux;
};
j'ai fais ca
ostream& operator<<(ostream& flux,const date& D)
{
return flux <<D.jour<<"/"<<D.mois<<"/"<<D.annee<<"\n";
};
comme tu l'avais montrés plus haut
voila le code entier il est bon ?
#include <iostream.h> // les classes
#include <istream.h>
class date{
public :
date ();
date(int x,int y,int z);
void afficher();
bool operator>(const date& F);
~date();
friend ostream& operator<<(ostream&,const date& D);
friend istream& operator>>(istream&,date& D);
private:
int jour;
int mois;
int annee;
};
// déclaration des métodes
date::date() // constructeur par defaut
{
jour=1;
mois=1;
annee=2003;
};
date::date(int x,int y,int z)// mon prof mets de construteurs par assignation mais a quoi ca sert ?
{
x= jour;
y= mois;
z= annee;
};
bool date::operator>(const date& F)
{
if(this->annee > F.annee)
{
return true;
}
else if ( this->mois > F.mois && this->annee == F.annee)
{
return true ;
}
else if (this->jour > F.jour && this-> mois == F.mois)
{
return true ;
}
else return false;
};
ostream& operator<<(ostream& flux,const date& D)
{
return flux <<D.jour<<"/"<<D.mois<<"/"<<D.annee<<"\n";
};
istream& operator>>( istream& flux,date& D)
{
cout<<"entrez le jours.\n";
flux>>D.jour;
cout<<"entrez le mois.\n";
flux>>D.mois;
cout<<"entrez l'année.\n";
flux>>D.annee;
return flux;
};
batmat
Messages postés
1871
Date d'inscription
jeudi 1 novembre 2001
Statut
Membre
Dernière intervention
9 janvier 2008
114
5 févr. 2003 à 21:30
5 févr. 2003 à 21:30
1) Renseigne toi sur ce qu'est un pointeur : *this c'en est un, donc écrire this ou *this ne veut absolument pas dire la meme chose. Exemple :
int a;
int* pa;
pa=&a; //pa recoit l'adresse de a (pointeur sur a)
pa est une variable en mémoire, mais ce n'est pas un entier : c'est une adresse, qu'on a ici initialisée à celle de a.
Attention, il y a, je pense, une petite erreur dans le code de marvinrouge : il écrit const& date d, et je pense qu'il voulait écrire const date& d.
En fait, on fait ça parce qu'on passe ainsi directement l'objet à la fonction et non une copie, et pour éviter qu'on modifie l'objet on le met const :-)
Pour finir, l'info est un monde très anglo-saxon, alors n'hésite pas à utiliser des noms anglais plutôt que français. C'est une bonne habitude à prendre pour plus tard si tu partages ton code avec des gens qui ne sont pas français ;-)
@++
Vous hésitez entre Linux et Windows?
Vous voulez dépenser du temps ou de l'argent ?
int a;
int* pa;
pa=&a; //pa recoit l'adresse de a (pointeur sur a)
pa est une variable en mémoire, mais ce n'est pas un entier : c'est une adresse, qu'on a ici initialisée à celle de a.
Attention, il y a, je pense, une petite erreur dans le code de marvinrouge : il écrit const& date d, et je pense qu'il voulait écrire const date& d.
En fait, on fait ça parce qu'on passe ainsi directement l'objet à la fonction et non une copie, et pour éviter qu'on modifie l'objet on le met const :-)
Pour finir, l'info est un monde très anglo-saxon, alors n'hésite pas à utiliser des noms anglais plutôt que français. C'est une bonne habitude à prendre pour plus tard si tu partages ton code avec des gens qui ne sont pas français ;-)
@++
Vous hésitez entre Linux et Windows?
Vous voulez dépenser du temps ou de l'argent ?
Bonsoir Bolo,
je vais tâcher de répondre à tes 3 derniers messages
1) Quand tu est DANS une méthode memre (NON statique)
this désigne le pointeur (ou l'adresse) de l'object APPELANTY la méthode
*this désigne l'object lui-même
Cette notation vient du langage C ou quand p est un pointeur *p est l'object pointé
Donc dans cout << *p;
cela indique que l'on passe à cout un object (*) à afficher (ici une date, par exemple 1 jan 2003) zet non une adresse mémoire (p, par exemple 2345090).
Est-ce clair pour toi ?
Remarque: les constructeurs n'ont pas de const à la fin, ni les fonctions amies (fonctions 'friend') ni les destructeurs
2) ta première version de << était fausse car tu faisais des >> (c'est à dire que dans une méthode destinée à AFFICHER ta date, tu la saisissais, bizzare n'est-ce pas ...)
3) Il reste de légères erreurs
a) rajoute un 'const' derrière (voir un des mes premiers messages ci-dessus)
bool date::operator>(const date& F)
à la fois DANS la classe et HORS de la classe.
En gros si tu mets PAS le const tu peux comparer
a > b
ssi a non constant (cas pas de 'const' en fin de fonction) et b constant ou non (car 'const' dans les paramètres de la fonction)
Si tu METS le const tu peux comparer
a > b
ssi a constant ou non (cas 'const' en fin de fonction) et b constant
ou non (car 'const' dans les paramètres de la fonction)
b) tu as oublié la fonction void afficher(); HORS de la classe
C'est peut-être exprès (voir nos discussions ci-dessus) mais dans ce cas supprime aussi la ligne DANS la classe
Même remarque qu'en a)
Si tu laisses la fonction ajoute le 'const' à la fin DANS et HORS de la fonction
c) faute d'ortho
cout<<"entrez le jours.\n"; => pas de s à jour
d) personnllement je remplacerai les boolean par des int et les true par des 1 et les false par des 0 (voir un de mes précédents messages ci-dessus)
C'est peut-être plus difficle à lire pour toi dans un premier temps mais c'est une convention TRES LARGEMENT REPANDUE en C et en C++.
e) #include <istream.h> est pas nécessaire à mon avis (#include <istream.h> suffit)
Penses à bien tester ton exo avant de le rendre. Sur quelle machine es-tu (Windows, Unix, Linux, Mac ???)
@ bientot,
marvinrouge at hotmail point com
je vais tâcher de répondre à tes 3 derniers messages
1) Quand tu est DANS une méthode memre (NON statique)
this désigne le pointeur (ou l'adresse) de l'object APPELANTY la méthode
*this désigne l'object lui-même
Cette notation vient du langage C ou quand p est un pointeur *p est l'object pointé
Donc dans cout << *p;
cela indique que l'on passe à cout un object (*) à afficher (ici une date, par exemple 1 jan 2003) zet non une adresse mémoire (p, par exemple 2345090).
Est-ce clair pour toi ?
Remarque: les constructeurs n'ont pas de const à la fin, ni les fonctions amies (fonctions 'friend') ni les destructeurs
2) ta première version de << était fausse car tu faisais des >> (c'est à dire que dans une méthode destinée à AFFICHER ta date, tu la saisissais, bizzare n'est-ce pas ...)
3) Il reste de légères erreurs
a) rajoute un 'const' derrière (voir un des mes premiers messages ci-dessus)
bool date::operator>(const date& F)
à la fois DANS la classe et HORS de la classe.
En gros si tu mets PAS le const tu peux comparer
a > b
ssi a non constant (cas pas de 'const' en fin de fonction) et b constant ou non (car 'const' dans les paramètres de la fonction)
Si tu METS le const tu peux comparer
a > b
ssi a constant ou non (cas 'const' en fin de fonction) et b constant
ou non (car 'const' dans les paramètres de la fonction)
b) tu as oublié la fonction void afficher(); HORS de la classe
C'est peut-être exprès (voir nos discussions ci-dessus) mais dans ce cas supprime aussi la ligne DANS la classe
Même remarque qu'en a)
Si tu laisses la fonction ajoute le 'const' à la fin DANS et HORS de la fonction
c) faute d'ortho
cout<<"entrez le jours.\n"; => pas de s à jour
d) personnllement je remplacerai les boolean par des int et les true par des 1 et les false par des 0 (voir un de mes précédents messages ci-dessus)
C'est peut-être plus difficle à lire pour toi dans un premier temps mais c'est une convention TRES LARGEMENT REPANDUE en C et en C++.
e) #include <istream.h> est pas nécessaire à mon avis (#include <istream.h> suffit)
Penses à bien tester ton exo avant de le rendre. Sur quelle machine es-tu (Windows, Unix, Linux, Mac ???)
@ bientot,
marvinrouge at hotmail point com
1) j'ai enlever la fonction afficher car j'ai compris qu'elle n servait rien puisque je surcharger les opérateur cout et cin
2) quand tu me dis de mettre un const
c dans le protype de la fonction et la fonction en elle meme c ca ?
3) j'ai utilisais un bool car c comme ca que fais mon prof
4) je suis sous XP
Je dois aussi incrementer dans un fonction main
incrementer trois date et les triers dans l'odre croissant
pr ca j'utilise tri de bulle
mon code ne fonctionne pas :)
au niveau de mes fonctions echange et tri_bull
void tri_bull(date tableau[],int size);
date echange(date& x,date& y);
int main (void)
{
date tab[3];
int size=3;
for (int i=0;i<3;i++) // on initialinse le tableau de date
{
cin>>tab[i];
}
tri_bull(tab,size); // on tri de bulle
for(int j=0;j<3;j++) // on affiche les date
{
cout<<tab[j]<<"\n";
}
system("PAUSE");
return 0;
}
//--------------initialisation des fonction----------------------------------------------------------------
void tri_bull( date tableau[],int size)
{
int inversion;
do{
inversion=0;
for(int i=0;i<size;i++)
{if(tableau[i]>tableau[i+1])
// echange les valeurs
{
echange(tableau[i],tableau[i+1]);
inversion=1;
}
while(inversion==0);
};
date echange(date& x,date& y)
{
date c;
c=x;
x=y;
y=c;
};
2) quand tu me dis de mettre un const
c dans le protype de la fonction et la fonction en elle meme c ca ?
3) j'ai utilisais un bool car c comme ca que fais mon prof
4) je suis sous XP
Je dois aussi incrementer dans un fonction main
incrementer trois date et les triers dans l'odre croissant
pr ca j'utilise tri de bulle
mon code ne fonctionne pas :)
au niveau de mes fonctions echange et tri_bull
void tri_bull(date tableau[],int size);
date echange(date& x,date& y);
int main (void)
{
date tab[3];
int size=3;
for (int i=0;i<3;i++) // on initialinse le tableau de date
{
cin>>tab[i];
}
tri_bull(tab,size); // on tri de bulle
for(int j=0;j<3;j++) // on affiche les date
{
cout<<tab[j]<<"\n";
}
system("PAUSE");
return 0;
}
//--------------initialisation des fonction----------------------------------------------------------------
void tri_bull( date tableau[],int size)
{
int inversion;
do{
inversion=0;
for(int i=0;i<size;i++)
{if(tableau[i]>tableau[i+1])
// echange les valeurs
{
echange(tableau[i],tableau[i+1]);
inversion=1;
}
while(inversion==0);
};
date echange(date& x,date& y)
{
date c;
c=x;
x=y;
y=c;
};
Salut Bolo,
ça me fait plaisir que tu t'investisses sur ce langage qui n'est pas évident mais très utiles pour ensuite apprendre très facilement Java, Smalltalk, VB ou autres.
en plus tu te poses plein de bonnes questions, ce qui est indispensable pour apprendre le C++ qui basé sur le C erst parfois déconcertant.
voici mes réponses:
1) bien.
2) explications:
2a) le 'const' permettant de dire qu'une méthode/fonction accepte de objets constants ou non comme APPELANT de la méthode se met en FIN de méthode
exemple
void afficher() const; // pour le prototype (c'est à dire pour la déclaration de la méthode DANS la classe)
et
void date::afficher() const // pour la définition (c'est à dire pour la méthode complète HORS de la classe)
{
// ... affichage JJ/MM/AAAA
}
2b) le 'const' permettant de dire qu'une méthode/fonction accepte de objets constant ou non comme PARAMETRES de la méthode se met DANS les parenthèses de la méthode et est accompagné d'un &
Exemple dans le constrcuteur de copie (ie construceru permettant de créer un data à partir d'une autre date
date(const date& d1) (*)
{
jour = d1.jour;
mois = d1.mois
annee = d1.annee
}
date d1(1, 1, 2003);
date d2(d1); // d2 est ujne copie de d1
(*) ici 'const' car d1 n'est pas modifié
(*) ici & veut dire que l'on passe au constrcuteur d1 par référence (c'est à dire le vrai d1 et PAS UNE COPIE de d1). Les références sont un point ESSENTIEL du C++. Si tu veux plus d'explications sur les références comme d'hab, ask me !
3) ok pour le bool, de toutes façons autant privilégier lesnnotations/habitudes de son prof pour pas se faire aligner.
4) 4a) fonction échange BIEN sauf qu'elle ne doit rien retourner => void
4b) je ne crois pas que system("PAUSE"); fonctionne . Tu es sous Unix ?
4c) 2 erreurs sur le tri bulle
4c1)while (inversion==0) => c'est l'inverse, le tri bulle doit continuer TANT qu'il y a ueu une inversion => à remplacer par while (inversion==1)
4c2) ATTENTION aux dé^passements d'indices dans les tableaux => provoque très soyuvent des bugs DIFFICILES à détecter en C/C++
dans
for(int i=0;i<size;i++) if(tableau[i]>tableau[i+1])
tu vas UN coup trop loin
Un tableau t de taille s en C/C++ comence à la case 0 et finit à la case s-1 !!!! (FONDAMENTAL car si tu écrit t[s] ou t[k] k>=s tout peut arriver (parfois plmantage et tu le vois directement, parfois tes variazbles prennent es valeurs louches MAIS LE PROGRAMME contineu à tourner ce qui fait que tu ne sais pas d'ou vient l'erreur
J'insiste donc sur ce point !!!
A remplacer par exemple par for(int i=0;i<size-1;i++) if(tableau[i]>tableau[i+1])
5) Autrement ça m'a l'air bien
Si tu veux épater ton prof crées une classe dateTableau (un peu plus compliqué mais très formateur, en plus t'as du bol t'as un 'prof en-ligne' ici présent qui peut te guider)
@+
marvinrouge
ça me fait plaisir que tu t'investisses sur ce langage qui n'est pas évident mais très utiles pour ensuite apprendre très facilement Java, Smalltalk, VB ou autres.
en plus tu te poses plein de bonnes questions, ce qui est indispensable pour apprendre le C++ qui basé sur le C erst parfois déconcertant.
voici mes réponses:
1) bien.
2) explications:
2a) le 'const' permettant de dire qu'une méthode/fonction accepte de objets constants ou non comme APPELANT de la méthode se met en FIN de méthode
exemple
void afficher() const; // pour le prototype (c'est à dire pour la déclaration de la méthode DANS la classe)
et
void date::afficher() const // pour la définition (c'est à dire pour la méthode complète HORS de la classe)
{
// ... affichage JJ/MM/AAAA
}
2b) le 'const' permettant de dire qu'une méthode/fonction accepte de objets constant ou non comme PARAMETRES de la méthode se met DANS les parenthèses de la méthode et est accompagné d'un &
Exemple dans le constrcuteur de copie (ie construceru permettant de créer un data à partir d'une autre date
date(const date& d1) (*)
{
jour = d1.jour;
mois = d1.mois
annee = d1.annee
}
date d1(1, 1, 2003);
date d2(d1); // d2 est ujne copie de d1
(*) ici 'const' car d1 n'est pas modifié
(*) ici & veut dire que l'on passe au constrcuteur d1 par référence (c'est à dire le vrai d1 et PAS UNE COPIE de d1). Les références sont un point ESSENTIEL du C++. Si tu veux plus d'explications sur les références comme d'hab, ask me !
3) ok pour le bool, de toutes façons autant privilégier lesnnotations/habitudes de son prof pour pas se faire aligner.
4) 4a) fonction échange BIEN sauf qu'elle ne doit rien retourner => void
4b) je ne crois pas que system("PAUSE"); fonctionne . Tu es sous Unix ?
4c) 2 erreurs sur le tri bulle
4c1)while (inversion==0) => c'est l'inverse, le tri bulle doit continuer TANT qu'il y a ueu une inversion => à remplacer par while (inversion==1)
4c2) ATTENTION aux dé^passements d'indices dans les tableaux => provoque très soyuvent des bugs DIFFICILES à détecter en C/C++
dans
for(int i=0;i<size;i++) if(tableau[i]>tableau[i+1])
tu vas UN coup trop loin
Un tableau t de taille s en C/C++ comence à la case 0 et finit à la case s-1 !!!! (FONDAMENTAL car si tu écrit t[s] ou t[k] k>=s tout peut arriver (parfois plmantage et tu le vois directement, parfois tes variazbles prennent es valeurs louches MAIS LE PROGRAMME contineu à tourner ce qui fait que tu ne sais pas d'ou vient l'erreur
J'insiste donc sur ce point !!!
A remplacer par exemple par for(int i=0;i<size-1;i++) if(tableau[i]>tableau[i+1])
5) Autrement ça m'a l'air bien
Si tu veux épater ton prof crées une classe dateTableau (un peu plus compliqué mais très formateur, en plus t'as du bol t'as un 'prof en-ligne' ici présent qui peut te guider)
@+
marvinrouge
Yop
j'essaye de comprendre comme c des cours pas correspondance mon prof n'as pas de temps pr me repondre...
1) si on declare son un const dans un prototype de fonction il faut egalement le declarer hors du protoyte
2)dans le cours le prof dit que le const permet l'objet ne soit ps modifier c ca ?
"La notation const fraction& est plus générale, elle évite la recopie d'un argument qui prendrait trop de place en mémoire."
3)non je suis sous windows j'utilise le system pause pr pas que la fenetre se ferme automatiquement
4)j'ai caremment mis mes fonction dans la classe
pour ma fonction tri j'ai passé par reference puisque il faut modifier mon tableau
j'ai cette erreur
declaration of `tableau' as array of references
void date::tri_bull(date& tableau[],int size) // tri du tableau
{
int inversion;
do{
inversion=0;
for(int i=0;i<size-1;i++)
{if(tableau[i]>tableau[i+1])
{
echange(tableau[i],tableau[i+1]);
inversion=1;
}
while(inversion==1);
}
5)tu me dis de cree un classe dateTableau
elle serait ainsi ?
class{
public:
datetableau();
~datetableau();
private:
date tableau[];
}
tks pr tes conseils
j'essaye de comprendre comme c des cours pas correspondance mon prof n'as pas de temps pr me repondre...
1) si on declare son un const dans un prototype de fonction il faut egalement le declarer hors du protoyte
2)dans le cours le prof dit que le const permet l'objet ne soit ps modifier c ca ?
"La notation const fraction& est plus générale, elle évite la recopie d'un argument qui prendrait trop de place en mémoire."
3)non je suis sous windows j'utilise le system pause pr pas que la fenetre se ferme automatiquement
4)j'ai caremment mis mes fonction dans la classe
pour ma fonction tri j'ai passé par reference puisque il faut modifier mon tableau
j'ai cette erreur
declaration of `tableau' as array of references
void date::tri_bull(date& tableau[],int size) // tri du tableau
{
int inversion;
do{
inversion=0;
for(int i=0;i<size-1;i++)
{if(tableau[i]>tableau[i+1])
{
echange(tableau[i],tableau[i+1]);
inversion=1;
}
while(inversion==1);
}
5)tu me dis de cree un classe dateTableau
elle serait ainsi ?
class{
public:
datetableau();
~datetableau();
private:
date tableau[];
}
tks pr tes conseils
1) en fait il y a plein de cas, pour simplifier:
1.a) 'const' en fin de fonction (après la parenthèse fermante) permet qu'un objet constant appelle la méthode
exempe const date d1(1, 1, 2003)
d1.afficher() est possible si void afficher() const;
mais pas si void afficher();
1.b) 'const' en paramètre de fonction indique que le paramètre ne sera pas modifié (et empêche de le modifier DANS la fonction)
exempe static int date::getDay(const date& d)
{
return d.jour;
}
le & indique que c'est le d du contextev appelant (par exemple dans le main) qui est passée à la méthode et non une copie (gain de temps
exemple;
void m ain(void)
{
date d1;
int jour = date::getDay(d1);
}
2) ton prof a raison:
en définitive:
si le paramètre doit être passé en copie : pas de &, pas const
si le paramètre doit être passé (réellement li) et modifiable : &
si le paramètre doit être passé (réellement li) et NON modifiable : const&
3) ok
4) j'ai caremment mis mes fonction dans la classe
>c'est ton choix, moi je le fais pas car il est recommandé de mettre la classe dans un fichier date.h
et les méthodes dans un fichier date.cpp mais surtout pour des projets d'entrerpsies, dans les études c'est moins grave
5) pour le tri, il est inutile de passer le tableau par référence, c'est un peu long à expliquer car ça vient du C qui est 'tordu' par excellence
en gros un tableau 'tab' est un POINTEUR, c'est à dire une adresse etc ... j'ai la flemme de t'expliquer ça par mail,
on le fera par téléphone ou autour d'un kfé si tu es sur Paris ...
en fait tu dois créer un tableau de pointeurs sur des dates (OUILLE OUILLE OUILLE ça se complique ...)
le GROS intérêt de créer une classe tableau c'est que tu peux avoir le tableau (tab) et sa taille (n) qui se balladent en même temps (au sein d'un objet dateTableau) et avoir des métohdes qui testenet les dépassemnt d'indices
sinon si tu utilises directement date* ou date[] ou date**, tu dois A CHAQUE FOIS que tu écrit d[i] tester si i>=0 && i<taille(tab)
ce qui
a) devient très vitre TRES lourd
b) on en oublie certains (FORCEMENT) et le progrmmae merde bizzarement (voir un de mes messages ci-dessu sur le dépassemnt d'indices dans un tableau ...)
#include <assert.h> // de mémoire => utile pour la méthode assert
class dateTableau
{
private:
dateTableau(int nbDates)
{
nb = nbDates;
tab = new date[nb];
for (int i=0; i<nb; i++)
tab[i] = NULL; // aucune date au début
}
~dateTableau() // destructeur appelé en fin de programme
{
if (tab!=NULL)
{
for (int i=0; i<nb; i++)
if (tab[i]!=NULL)
delete tab[i];
delete [] tab;
tab = NULL;
nb = 0;
}
nb = nbDates;
}
date& get(int n) const // retourne la date n
{
assert(n>=0 && n<nb); // plante VOLONTAIREMENT le programme sur cette ligne si n est hors tableau
return tab[n];
}
void set(int n, const date& d) // met la date d en place n du tableau
{
assert(n>=0 && n<nb); // plante VOLONTAIREMENT le programme sur cette ligne si n est hors tableau
if (tab[i]!=NULL)
delete tab[i];
tab[i] = new date(d); // d'ou l'utilité du constructeur de copie à définir dans la classe date !!!
}
void permute(int i, int j) // permute l2 dates dans le tableau
{
assert(i>=0 && i<nb); // plante VOLONTAIREMENT le programme sur cette ligne si i est hors tableau
assert(j>=0 && j<nb); // plante VOLONTAIREMENT le programme sur cette ligne si j est hors tableau
date* tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
}
}
ensuite tu peux faire le tri en fonction membre de la classe dateTableau
ou alors en fonction globale au choix
je te laisse chercher et me proposer des soluces que je corrigerai
tks pr tes conseils
écrit aussi la méthode << pour le tableau c'est un bonne exercice !
continue comme ça et tu seras calé en C++ rapidement (3 semaines max)
faudra attaquer l'héritage et le polymorphisme rapidement
marvinrouge
1.a) 'const' en fin de fonction (après la parenthèse fermante) permet qu'un objet constant appelle la méthode
exempe const date d1(1, 1, 2003)
d1.afficher() est possible si void afficher() const;
mais pas si void afficher();
1.b) 'const' en paramètre de fonction indique que le paramètre ne sera pas modifié (et empêche de le modifier DANS la fonction)
exempe static int date::getDay(const date& d)
{
return d.jour;
}
le & indique que c'est le d du contextev appelant (par exemple dans le main) qui est passée à la méthode et non une copie (gain de temps
exemple;
void m ain(void)
{
date d1;
int jour = date::getDay(d1);
}
2) ton prof a raison:
en définitive:
si le paramètre doit être passé en copie : pas de &, pas const
si le paramètre doit être passé (réellement li) et modifiable : &
si le paramètre doit être passé (réellement li) et NON modifiable : const&
3) ok
4) j'ai caremment mis mes fonction dans la classe
>c'est ton choix, moi je le fais pas car il est recommandé de mettre la classe dans un fichier date.h
et les méthodes dans un fichier date.cpp mais surtout pour des projets d'entrerpsies, dans les études c'est moins grave
5) pour le tri, il est inutile de passer le tableau par référence, c'est un peu long à expliquer car ça vient du C qui est 'tordu' par excellence
en gros un tableau 'tab' est un POINTEUR, c'est à dire une adresse etc ... j'ai la flemme de t'expliquer ça par mail,
on le fera par téléphone ou autour d'un kfé si tu es sur Paris ...
en fait tu dois créer un tableau de pointeurs sur des dates (OUILLE OUILLE OUILLE ça se complique ...)
le GROS intérêt de créer une classe tableau c'est que tu peux avoir le tableau (tab) et sa taille (n) qui se balladent en même temps (au sein d'un objet dateTableau) et avoir des métohdes qui testenet les dépassemnt d'indices
sinon si tu utilises directement date* ou date[] ou date**, tu dois A CHAQUE FOIS que tu écrit d[i] tester si i>=0 && i<taille(tab)
ce qui
a) devient très vitre TRES lourd
b) on en oublie certains (FORCEMENT) et le progrmmae merde bizzarement (voir un de mes messages ci-dessu sur le dépassemnt d'indices dans un tableau ...)
#include <assert.h> // de mémoire => utile pour la méthode assert
class dateTableau
{
private:
dateTableau(int nbDates)
{
nb = nbDates;
tab = new date[nb];
for (int i=0; i<nb; i++)
tab[i] = NULL; // aucune date au début
}
~dateTableau() // destructeur appelé en fin de programme
{
if (tab!=NULL)
{
for (int i=0; i<nb; i++)
if (tab[i]!=NULL)
delete tab[i];
delete [] tab;
tab = NULL;
nb = 0;
}
nb = nbDates;
}
date& get(int n) const // retourne la date n
{
assert(n>=0 && n<nb); // plante VOLONTAIREMENT le programme sur cette ligne si n est hors tableau
return tab[n];
}
void set(int n, const date& d) // met la date d en place n du tableau
{
assert(n>=0 && n<nb); // plante VOLONTAIREMENT le programme sur cette ligne si n est hors tableau
if (tab[i]!=NULL)
delete tab[i];
tab[i] = new date(d); // d'ou l'utilité du constructeur de copie à définir dans la classe date !!!
}
void permute(int i, int j) // permute l2 dates dans le tableau
{
assert(i>=0 && i<nb); // plante VOLONTAIREMENT le programme sur cette ligne si i est hors tableau
assert(j>=0 && j<nb); // plante VOLONTAIREMENT le programme sur cette ligne si j est hors tableau
date* tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
}
}
ensuite tu peux faire le tri en fonction membre de la classe dateTableau
ou alors en fonction globale au choix
je te laisse chercher et me proposer des soluces que je corrigerai
tks pr tes conseils
écrit aussi la méthode << pour le tableau c'est un bonne exercice !
continue comme ça et tu seras calé en C++ rapidement (3 semaines max)
faudra attaquer l'héritage et le polymorphisme rapidement
marvinrouge
j'habite a fort de france pr le café ca sera en online :)
j'ai regarde la classe date
a certain niveau je ne comprend pas
date& get(int n) const
{
assert(n>=0 && n<nb);
return tab[n];
}
cette fonction sert a quoi ?
celle ci permet de faire quoi je vois que si le la valeur du tableu n'est pas nul
on fait delete tab[i] ob suprime dc la memoire allouee
void set(int n, const date& d)
{
assert(n>=0 && n<nb);
if (tab[i]!=NULL)
delete tab[i];
tab[i] = new date(d);
}
pour cette fonction qui permet de permuteru 2 date tu cree un pointeur
j'avaix compris que pour affecter une adresse il fallait faire ainsi
date* tmp=&tab[i];
void permute(int i, int j)
{
assert(i>=0 && i<nb);
assert(j>=0 && j<nb);
date* tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
}
}
j'ai regarde la classe date
a certain niveau je ne comprend pas
date& get(int n) const
{
assert(n>=0 && n<nb);
return tab[n];
}
cette fonction sert a quoi ?
celle ci permet de faire quoi je vois que si le la valeur du tableu n'est pas nul
on fait delete tab[i] ob suprime dc la memoire allouee
void set(int n, const date& d)
{
assert(n>=0 && n<nb);
if (tab[i]!=NULL)
delete tab[i];
tab[i] = new date(d);
}
pour cette fonction qui permet de permuteru 2 date tu cree un pointeur
j'avaix compris que pour affecter une adresse il fallait faire ainsi
date* tmp=&tab[i];
void permute(int i, int j)
{
assert(i>=0 && i<nb);
assert(j>=0 && j<nb);
date* tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
}
}
Alors dommage pour le kfé ...
Bon reprenons:
la fonction
date& get(int n) const
{
assert(n>=0 && n<nb);
return tab[n];
}
permet d'accèder à la n-ème date du tableau de manière 'propre' c'est à dire que les tests de dépassement d'indices
sont INTEGRéS à la méthode d'accès PUBLIQUE alors que les données membres tab et n sont PRIVéES,
c'est ce qu'on appelle l'ENCAPSULATION DES DONNéES, une des composantes majeures de la POO (Programation Orientée Object)
avec l'HéRITAGE et la POLYMORPHISME, l'AGGRéGATION et la COMPOSITION.
ainsi écrire:
dateTableau dt(10);
date d1(1, 1, 2003);
dt.set(0, d1); // met la date d1 en case 0
date d2 = dt.get(0); // récupère la date en place 0
si au lieu de 0 on avait une valeur >=10 ou <0 le progrmmae planterait à casue du 'assert'
qui est fait pour ça et tu aurais un message t'indiquant PRéCISéMENT ou ça plante
Je t'invite d'ailleurs à faire les tests suivants (pur voir l'utilité du 'assert')
date d3 = dt.get(-4);
date d4 = dt.set(10, d1);
(avec n<=10 bien sur ...)
}
2) après le private dans mon précédent message
j'ai du oublier (désolé ...)
int nb;
date** tab;
public:
En fait comme tab est un double pointeur (date**)
tab[i] est un pointeur (c'est à dire une adresse) donc le & n'est pas indispensable
date* tmp = tab[i];
par contre:
date tmp2 = *tab[i];
3) le & et le * sont les trucs les plus durs à comprendre en C/C++. S itu les maitrises très bien ça ira le C++,
par contre sinon tu auras très souvent des 'merdes' (pardon l'expression) dans tes programmes,
int a = 1; // ok
int* b = new int[10];
b est une adresse (un pointeur) d'un tableau e 10 entiers
b[i] est l'entier i
b[i] = 4; // ok
4) si tu fais
int b = 1; // (1)
f(b);
avec
fonction(int b)
{
b = 2; // modifie pas le b de (1) mais une COPIE de b
}
int b = 1; // (1)
f(b);
avec
fonction(int& b)
{
b = 2; // modifie le b de (1) (passage par référence à cause du '&')
}
int b = 1; // (1)
f(&b); // on passe l'adresse de b (2)
avec
fonction(int* b)
{
b = 2; // ne modifie que le b local qui est une COPIE de &b de (2)
}
int b = 1; // (1) (4)
f(&b); // on passe l'adresse de b (3)
avec
fonction(int* b)
{
*b = 2; // ici b est une COPIE de &b de (3) mais quand on fait *x = f on modifie REELLEMENT la variable dont l'adresse est b
// or le b local à cette fonction et le &b sont égaux en valeur donc *b = 2 modifie le b de (4)
}
je sais que c'est pas marrant à comprendre (ça aurait été plus simple autour d'une table avec un papier et un crayon) mais comme
tu es motivé tu y arriveras
- en faisant des tests de TOUS ces cas
- en me posant des questions
ensuite on pasera aux choses plus dures
char
char*
char&
char**
char*&
char**&
char***
date*
date&
date*&
date**
etc ...
le principe est toujours le même
MAIS il y a des différences entre
- les types de bases (int, double, char, float, boolean)
- les objets (ex: date et dateTableau)
- les tableaux gérés 'brutalement ' (exe int* , char***)
à qd tu veux pour la suite mais surtout ne te démoralises pas !!!
marvinrouge
Bon reprenons:
la fonction
date& get(int n) const
{
assert(n>=0 && n<nb);
return tab[n];
}
permet d'accèder à la n-ème date du tableau de manière 'propre' c'est à dire que les tests de dépassement d'indices
sont INTEGRéS à la méthode d'accès PUBLIQUE alors que les données membres tab et n sont PRIVéES,
c'est ce qu'on appelle l'ENCAPSULATION DES DONNéES, une des composantes majeures de la POO (Programation Orientée Object)
avec l'HéRITAGE et la POLYMORPHISME, l'AGGRéGATION et la COMPOSITION.
ainsi écrire:
dateTableau dt(10);
date d1(1, 1, 2003);
dt.set(0, d1); // met la date d1 en case 0
date d2 = dt.get(0); // récupère la date en place 0
si au lieu de 0 on avait une valeur >=10 ou <0 le progrmmae planterait à casue du 'assert'
qui est fait pour ça et tu aurais un message t'indiquant PRéCISéMENT ou ça plante
Je t'invite d'ailleurs à faire les tests suivants (pur voir l'utilité du 'assert')
date d3 = dt.get(-4);
date d4 = dt.set(10, d1);
(avec n<=10 bien sur ...)
}
2) après le private dans mon précédent message
j'ai du oublier (désolé ...)
int nb;
date** tab;
public:
En fait comme tab est un double pointeur (date**)
tab[i] est un pointeur (c'est à dire une adresse) donc le & n'est pas indispensable
date* tmp = tab[i];
par contre:
date tmp2 = *tab[i];
3) le & et le * sont les trucs les plus durs à comprendre en C/C++. S itu les maitrises très bien ça ira le C++,
par contre sinon tu auras très souvent des 'merdes' (pardon l'expression) dans tes programmes,
int a = 1; // ok
int* b = new int[10];
b est une adresse (un pointeur) d'un tableau e 10 entiers
b[i] est l'entier i
b[i] = 4; // ok
4) si tu fais
int b = 1; // (1)
f(b);
avec
fonction(int b)
{
b = 2; // modifie pas le b de (1) mais une COPIE de b
}
int b = 1; // (1)
f(b);
avec
fonction(int& b)
{
b = 2; // modifie le b de (1) (passage par référence à cause du '&')
}
int b = 1; // (1)
f(&b); // on passe l'adresse de b (2)
avec
fonction(int* b)
{
b = 2; // ne modifie que le b local qui est une COPIE de &b de (2)
}
int b = 1; // (1) (4)
f(&b); // on passe l'adresse de b (3)
avec
fonction(int* b)
{
*b = 2; // ici b est une COPIE de &b de (3) mais quand on fait *x = f on modifie REELLEMENT la variable dont l'adresse est b
// or le b local à cette fonction et le &b sont égaux en valeur donc *b = 2 modifie le b de (4)
}
je sais que c'est pas marrant à comprendre (ça aurait été plus simple autour d'une table avec un papier et un crayon) mais comme
tu es motivé tu y arriveras
- en faisant des tests de TOUS ces cas
- en me posant des questions
ensuite on pasera aux choses plus dures
char
char*
char&
char**
char*&
char**&
char***
date*
date&
date*&
date**
etc ...
le principe est toujours le même
MAIS il y a des différences entre
- les types de bases (int, double, char, float, boolean)
- les objets (ex: date et dateTableau)
- les tableaux gérés 'brutalement ' (exe int* , char***)
à qd tu veux pour la suite mais surtout ne te démoralises pas !!!
marvinrouge
bolo.
Messages postés
4
Date d'inscription
jeudi 6 février 2003
Statut
Membre
Dernière intervention
6 février 2003
6 févr. 2003 à 16:26
6 févr. 2003 à 16:26
alors dans la classe je rajoute ca mais pourquoi il y a rien dans ton public ?
class dateTableau
{
private:
dateTableau(int nbDates)
{
nb = nbDates;
tab = new date[nb];
for (int i=0; i<nb; i++)
tab[i] = NULL; // aucune date au début
}
~dateTableau() // destructeur appelé en fin de programme
{
if (tab!=NULL)
{
for (int i=0; i<nb; i++)
if (tab[i]!=NULL)
delete tab[i];
delete [] tab;
tab = NULL;
nb = 0;
}
nb = nbDates;
int nb;
date** tab;
public:
}
http://www.independza.com
http://moi.independza.com
class dateTableau
{
private:
dateTableau(int nbDates)
{
nb = nbDates;
tab = new date[nb];
for (int i=0; i<nb; i++)
tab[i] = NULL; // aucune date au début
}
~dateTableau() // destructeur appelé en fin de programme
{
if (tab!=NULL)
{
for (int i=0; i<nb; i++)
if (tab[i]!=NULL)
delete tab[i];
delete [] tab;
tab = NULL;
nb = 0;
}
nb = nbDates;
int nb;
date** tab;
public:
}
http://www.independza.com
http://moi.independza.com
il n'y avait rien par erreur dans mon 'public' (voir réponse)
par contre les données membres nb et tab doivent etres PRIVéES (respect de l'encapsulation des données)
si elles sont publiques on peut y accéder directement et faire tout planter
exemples
dt.nb = -6 ou dt.nb = 127 (alors que tab n'est pas redimensionné dans le meme temps)
date d = dt.tab[-1];
dt.tab[0] = NULL; (dans ce cas le delete n'est pas fait et de la mémoire est perdue !!!)
etc ...
marvinrouge
(encore sorry pour l'oubli qui était perturbant)
par contre les données membres nb et tab doivent etres PRIVéES (respect de l'encapsulation des données)
si elles sont publiques on peut y accéder directement et faire tout planter
exemples
dt.nb = -6 ou dt.nb = 127 (alors que tab n'est pas redimensionné dans le meme temps)
date d = dt.tab[-1];
dt.tab[0] = NULL; (dans ce cas le delete n'est pas fait et de la mémoire est perdue !!!)
etc ...
marvinrouge
(encore sorry pour l'oubli qui était perturbant)
bolo.
Messages postés
4
Date d'inscription
jeudi 6 février 2003
Statut
Membre
Dernière intervention
6 février 2003
6 févr. 2003 à 16:35
6 févr. 2003 à 16:35
Donc pour cette fonction
pour cette fonction qui permet de permuteru 2 je ne comprends pas pourquoi tu fais ainsi
void permute(int i, int j)
{
assert(i>=0 && i<nb);
assert(j>=0 && j<nb);
date* tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
}
}
d'apres ce que j'ai compris
il faut utiliser des pointenur
dans la declaration de la fonction
void permute(*int i, *int j)
{
assert(i>=0 && i<nb);
assert(j>=0 && j<nb);
date* tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
}
}
Et apres l'utilisée ainsi
permemute(&1,&2);
deuxième pourquoi tu permetus des int au lieu des objet tableau date
http://www.independza.com
http://moi.independza.com
pour cette fonction qui permet de permuteru 2 je ne comprends pas pourquoi tu fais ainsi
void permute(int i, int j)
{
assert(i>=0 && i<nb);
assert(j>=0 && j<nb);
date* tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
}
}
d'apres ce que j'ai compris
il faut utiliser des pointenur
dans la declaration de la fonction
void permute(*int i, *int j)
{
assert(i>=0 && i<nb);
assert(j>=0 && j<nb);
date* tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
}
}
Et apres l'utilisée ainsi
permemute(&1,&2);
deuxième pourquoi tu permetus des int au lieu des objet tableau date
http://www.independza.com
http://moi.independza.com
bolo.
Messages postés
4
Date d'inscription
jeudi 6 février 2003
Statut
Membre
Dernière intervention
6 février 2003
6 févr. 2003 à 16:37
6 févr. 2003 à 16:37
je ne vois pas quel endroit tu as modifiée ton public
ta classe doit etre ainsi ?
class dateTableau
{
private:
int nb;
date** tab;
public:
dateTableau(int nbDates)
{
nb = nbDates;
tab = new date[nb];
for (int i=0; i<nb; i++)
tab[i] = NULL; // aucune date au début
}
~dateTableau() // destructeur appelé en fin de programme
{
if (tab!=NULL)
{
for (int i=0; i<nb; i++)
if (tab[i]!=NULL)
delete tab[i];
delete [] tab;
tab = NULL;
nb = 0;
}
http://www.independza.com
http://moi.independza.com
ta classe doit etre ainsi ?
class dateTableau
{
private:
int nb;
date** tab;
public:
dateTableau(int nbDates)
{
nb = nbDates;
tab = new date[nb];
for (int i=0; i<nb; i++)
tab[i] = NULL; // aucune date au début
}
~dateTableau() // destructeur appelé en fin de programme
{
if (tab!=NULL)
{
for (int i=0; i<nb; i++)
if (tab[i]!=NULL)
delete tab[i];
delete [] tab;
tab = NULL;
nb = 0;
}
http://www.independza.com
http://moi.independza.com
Ouille ouille ouille attention Bolo là tu t'emmêles les pinceaux.
permute(int i, int j) est une méthode qui va permuter
les dates en place i et en place j
c'est vrai que je permute les pointeurs tab[i] et tab[j] pour des questions de performances (plus rapide de permuter des pointeurs que des objets dates ..)
je comprends que ça t'ai embrouillé
permeuter 2 pointeurs p1 et p2 revient à dire que je permute les 2 objets pointés par ses pointeurs (mais ça va plus vite)
c'est pour ça que j'ai fait un tableau de pointeurs de date (date** tab)
plutot qu'un tableau de dates (date*)
ça permet des opérations + rapides
notamment les fonctions augmenterTailleTableau(int n) et diminuerTailleTableau(int n) que je vais te demander d'éCRIRE
elle sont TRèS intéressantes à écrire (on apprend beaucoup CAR on fait beaucoup d'erreurs la 1ère fois qu'on les écrits)
En revanche sur
void permute(*int i, *int j) {....} + permute(&1,&2);
c'est une erreur, en C/C++:
- &1 est interdit
- &variable est autorisé (adresse d'une variable), exemple &n, &tab, etc ...
marvinrouge
permute(int i, int j) est une méthode qui va permuter
les dates en place i et en place j
c'est vrai que je permute les pointeurs tab[i] et tab[j] pour des questions de performances (plus rapide de permuter des pointeurs que des objets dates ..)
je comprends que ça t'ai embrouillé
permeuter 2 pointeurs p1 et p2 revient à dire que je permute les 2 objets pointés par ses pointeurs (mais ça va plus vite)
c'est pour ça que j'ai fait un tableau de pointeurs de date (date** tab)
plutot qu'un tableau de dates (date*)
ça permet des opérations + rapides
notamment les fonctions augmenterTailleTableau(int n) et diminuerTailleTableau(int n) que je vais te demander d'éCRIRE
elle sont TRèS intéressantes à écrire (on apprend beaucoup CAR on fait beaucoup d'erreurs la 1ère fois qu'on les écrits)
En revanche sur
void permute(*int i, *int j) {....} + permute(&1,&2);
c'est une erreur, en C/C++:
- &1 est interdit
- &variable est autorisé (adresse d'une variable), exemple &n, &tab, etc ...
marvinrouge
je ne vois pas quel endroit tu as modifiée ton public
ta classe doit etre ainsi ?
class dateTableau
{
public: // kles méthodes et les constructeurs / destructeurs
dateTableau(int nbDates)
{
nb = nbDates;
tab = new date[nb];
for (int i=0; i<nb; i++)
tab[i] = NULL; // aucune date au début
}
~dateTableau() // destructeur appelé en fin de programme
{
if (tab!=NULL)
{
for (int i=0; i<nb; i++)
if (tab[i]!=NULL)
delete tab[i];
delete [] tab;
tab = NULL;
nb = 0;
}
}
private: // les données membres (accessibles seuelemnt via les méthodes en progr orientée objet propre (encapsulatino des données)
int nb;
date** tab;
};
remarque: à la fin du dernier } de la classe il y a un ;
marvinrouge
ta classe doit etre ainsi ?
class dateTableau
{
public: // kles méthodes et les constructeurs / destructeurs
dateTableau(int nbDates)
{
nb = nbDates;
tab = new date[nb];
for (int i=0; i<nb; i++)
tab[i] = NULL; // aucune date au début
}
~dateTableau() // destructeur appelé en fin de programme
{
if (tab!=NULL)
{
for (int i=0; i<nb; i++)
if (tab[i]!=NULL)
delete tab[i];
delete [] tab;
tab = NULL;
nb = 0;
}
}
private: // les données membres (accessibles seuelemnt via les méthodes en progr orientée objet propre (encapsulatino des données)
int nb;
date** tab;
};
remarque: à la fin du dernier } de la classe il y a un ;
marvinrouge
bolo.
Messages postés
4
Date d'inscription
jeudi 6 février 2003
Statut
Membre
Dernière intervention
6 février 2003
6 févr. 2003 à 17:17
6 févr. 2003 à 17:17
j'ai fais un copié colle de ton code mais j'ai des erreurs
je t'envois le code entier
http://www.independza.com
http://moi.independza.com
je t'envois le code entier
http://www.independza.com
http://moi.independza.com