Surcharge d'opérateur c++
Résolu
yokigirl
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
yokigirl Messages postés 7 Date d'inscription Statut Membre Dernière intervention -
yokigirl Messages postés 7 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaite effectuer la multiplication de deux polynomes. Pour cela, je veux surcharger l'operateur * sachant que j'ai déjà surcharger les operateurs + et - .
Je dispose d'une classe monome et d'une classe polynome.
mon projet compile mais bloque au moment de l'execution. Je ne vois pas comment modifier ma surcharge * .
class Monome
{
double coeff;
int indice;
public :
Monome(double,int);
double getCoeff () const;
int getIndice () const;
void setCoeff (double);
void setIndice (int);
double operator() (double);
};
class Polynome
{
public :
typedef vector<Monome> idm;
Polynome ();
Polynome (const Polynome &);
int getDegre() const;
idm getMonomes();
void ajouter (Monome &);
void ajouter (Polynome);
void multiplier (double);
void multiplier (Monome &);
double operator() (double);
friend Polynome operator+ (const Polynome &,const Polynome &);
friend Polynome operator- (const Polynome &,const Polynome &);
friend Polynome operator* (const Polynome &,const Polynome &);
private :
idm::iterator Polynome::getMonome(int);
int degre;
idm vmonome;
};
Polynome operator* (const Polynome &p,const Polynome &q)
{
Polynome r;
Polynome::idm monomes_r;
monomes_r = r.getMonomes();
Polynome::idm::iterator itr;
Polynome s;
s=p;
Polynome::idm monomes_p;
monomes_p = s.getMonomes();
Polynome::idm::iterator itp;
Polynome t;
t=q;
Polynome::idm monomes_q;
monomes_q = t.getMonomes();
Polynome::idm::iterator itq;
for (itp = monomes_p.begin(); itp != monomes_p.end(); itp++)
{
for (itq = monomes_q.begin(); itq != monomes_q.end(); itq++)
{
(*itr).setCoeff((*itq).getCoeff()*(*itp).getCoeff());
(*itr).setIndice((*itq).getIndice()+(*itp).getIndice());
}
}
return r;
}
N'hésitez pas pour plus de précision.
Merci d'avance.
Je souhaite effectuer la multiplication de deux polynomes. Pour cela, je veux surcharger l'operateur * sachant que j'ai déjà surcharger les operateurs + et - .
Je dispose d'une classe monome et d'une classe polynome.
mon projet compile mais bloque au moment de l'execution. Je ne vois pas comment modifier ma surcharge * .
class Monome
{
double coeff;
int indice;
public :
Monome(double,int);
double getCoeff () const;
int getIndice () const;
void setCoeff (double);
void setIndice (int);
double operator() (double);
};
class Polynome
{
public :
typedef vector<Monome> idm;
Polynome ();
Polynome (const Polynome &);
int getDegre() const;
idm getMonomes();
void ajouter (Monome &);
void ajouter (Polynome);
void multiplier (double);
void multiplier (Monome &);
double operator() (double);
friend Polynome operator+ (const Polynome &,const Polynome &);
friend Polynome operator- (const Polynome &,const Polynome &);
friend Polynome operator* (const Polynome &,const Polynome &);
private :
idm::iterator Polynome::getMonome(int);
int degre;
idm vmonome;
};
Polynome operator* (const Polynome &p,const Polynome &q)
{
Polynome r;
Polynome::idm monomes_r;
monomes_r = r.getMonomes();
Polynome::idm::iterator itr;
Polynome s;
s=p;
Polynome::idm monomes_p;
monomes_p = s.getMonomes();
Polynome::idm::iterator itp;
Polynome t;
t=q;
Polynome::idm monomes_q;
monomes_q = t.getMonomes();
Polynome::idm::iterator itq;
for (itp = monomes_p.begin(); itp != monomes_p.end(); itp++)
{
for (itq = monomes_q.begin(); itq != monomes_q.end(); itq++)
{
(*itr).setCoeff((*itq).getCoeff()*(*itp).getCoeff());
(*itr).setIndice((*itq).getIndice()+(*itp).getIndice());
}
}
return r;
}
N'hésitez pas pour plus de précision.
Merci d'avance.
8 réponses
ca correspond à quoi ca?
Polynome::idm::iterator itr;
l'indice du monome dans le polynome,non?
je crois que c'est un problème d'allocation mémoire que tu as
je vois pas où est-ce que tu défini la longueur du polynome du résultat
Polynome::idm::iterator itr;
l'indice du monome dans le polynome,non?
je crois que c'est un problème d'allocation mémoire que tu as
je vois pas où est-ce que tu défini la longueur du polynome du résultat
un polynome est représenté comme un vecteur de monomes.
idm::iterator itr; est un iterateur sur le vector<monome> du polynome r.
si j'ai ajouté Polynome:: c'est parce qu'a la compilation il ne reconnaissait pas idm alors que je l'ai bien défini dans la classe polynome.
j'avais pensé au probleme d'allocation mémoire mais je pensais qu'il n'était pas nécessaire de définir la taille d'un vector.
Je devrais donc utiliser un push_back: monomes_r.push_back(itr);
le polynome r qui est le resultat du polynome p * le polynome q est au maximum de taille : (nombre de monomes dans q)^(nombre de monomes dans p).
est-ce correct?
merci.
idm::iterator itr; est un iterateur sur le vector<monome> du polynome r.
si j'ai ajouté Polynome:: c'est parce qu'a la compilation il ne reconnaissait pas idm alors que je l'ai bien défini dans la classe polynome.
j'avais pensé au probleme d'allocation mémoire mais je pensais qu'il n'était pas nécessaire de définir la taille d'un vector.
Je devrais donc utiliser un push_back: monomes_r.push_back(itr);
le polynome r qui est le resultat du polynome p * le polynome q est au maximum de taille : (nombre de monomes dans q)^(nombre de monomes dans p).
est-ce correct?
merci.
oui c'est bien ca
tu dois utiliser des push_back
je m'en souvient je l'ai fait l'année dernière
et c'est ce que j'avais utilisé
sinon je pense que pour la taille de r tu as faux
je te donne un exemple
si tu as (2x^2+5x+2)(3x+2)
tu auras du x^3
je dirais que la taille du polynome r est le plus grand coeff de p*le plus grand de q+1(pour le x^0)
ici tu as du x^3 donc ton coeff le plus grand est 3, d'où 3 monomes+1
tu dois utiliser des push_back
je m'en souvient je l'ai fait l'année dernière
et c'est ce que j'avais utilisé
sinon je pense que pour la taille de r tu as faux
je te donne un exemple
si tu as (2x^2+5x+2)(3x+2)
tu auras du x^3
je dirais que la taille du polynome r est le plus grand coeff de p*le plus grand de q+1(pour le x^0)
ici tu as du x^3 donc ton coeff le plus grand est 3, d'où 3 monomes+1
l'exemple de la taille est clair merci.
je vais push_back chaque monomes obtenus apres multiplication dans le vecteur contenant les nouveaux monomes de r en esperant qu'il execute.
merci.
je vais push_back chaque monomes obtenus apres multiplication dans le vecteur contenant les nouveaux monomes de r en esperant qu'il execute.
merci.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Si tu as besoin d'aide n'hésites pas
je sais que j'ai eu beaucoup de mal avec les push_front et les push_back
quand on a un prof nul ca aide pas
je sais que j'ai eu beaucoup de mal avec les push_front et les push_back
quand on a un prof nul ca aide pas
il est logique d'ajouter Polynome:: devant idm, car idm n'a été défini que dans Polynome. Tu pourrai tout aussi bien avoir un idm dans Monome, ou même dans la portée globale, il conviens donc de préciser sa porter, car la surcharge est en dehors de Polynome.
une remarque, je ne pense pas que tu es besoin de int degre, il suffit pour avoir le degré de faire vmonome.size()-1.
Au lieu d'utiliser des push_back(), tu peux aussi déclarer la taille de ton polynome r :
Polynome r(p.degres()*q.degres()+1)
en passant par idm vmonome(p.degres()*q.degres()+1)
Enfin, ce ne sont que des suggestions.
En fait, je n'ai pas bien compris l'intéret de ton monome, un polynome c'est sum(a_j.x^j) il suffit donc d'avoir un simple vecteur des valeurs a_j pour le définir completement.
une remarque, je ne pense pas que tu es besoin de int degre, il suffit pour avoir le degré de faire vmonome.size()-1.
Au lieu d'utiliser des push_back(), tu peux aussi déclarer la taille de ton polynome r :
Polynome r(p.degres()*q.degres()+1)
en passant par idm vmonome(p.degres()*q.degres()+1)
Enfin, ce ne sont que des suggestions.
En fait, je n'ai pas bien compris l'intéret de ton monome, un polynome c'est sum(a_j.x^j) il suffit donc d'avoir un simple vecteur des valeurs a_j pour le définir completement.
merci mais je n'en ai pas eu besoin finalement
voici le reusultat:
Polynome operator* (const Polynome &p,const Polynome &q)
{
Polynome r,s,t;
s=p;
t=q;
idm v;
v = t.getMonomes();
idm::iterator it;
for (it =v.begin(); it != v.end(); ++it)
{
s=p;
s.multiplier(*it);
r.ajouter(s);
}
return r;
}
je pensais ne pas pouvoir utiliser ma fonction multiplier(monome) mais si et c'est plus simple.
je vais commencer la division.
merci.
voici le reusultat:
Polynome operator* (const Polynome &p,const Polynome &q)
{
Polynome r,s,t;
s=p;
t=q;
idm v;
v = t.getMonomes();
idm::iterator it;
for (it =v.begin(); it != v.end(); ++it)
{
s=p;
s.multiplier(*it);
r.ajouter(s);
}
return r;
}
je pensais ne pas pouvoir utiliser ma fonction multiplier(monome) mais si et c'est plus simple.
je vais commencer la division.
merci.
merci pour l'explication de idm je l'ai bien ajouté dans polynome.
le prof a insisté sur le degré alors je travail avec et également sur le fait que les coefficients nuls ne devaient pas apparaitre dans le vecteur.
je vois un monome comme un coefficient, une variable (muette) et un indice, ax^b.
J'ai besoin de cet indice pour ensuite travailler sur les polynomes.
si j'ai 5x^2+3x^4 alors mn vecteur de coefficients est composé de 5 et 3 et non de 0 0 5 0 3
merci.
le prof a insisté sur le degré alors je travail avec et également sur le fait que les coefficients nuls ne devaient pas apparaitre dans le vecteur.
je vois un monome comme un coefficient, une variable (muette) et un indice, ax^b.
J'ai besoin de cet indice pour ensuite travailler sur les polynomes.
si j'ai 5x^2+3x^4 alors mn vecteur de coefficients est composé de 5 et 3 et non de 0 0 5 0 3
merci.