Surcharge d'opérateur c++

Résolu/Fermé
yokigirl Messages postés 7 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 30 janvier 2008 - 30 janv. 2008 à 13:39
yokigirl Messages postés 7 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 30 janvier 2008 - 30 janv. 2008 à 16:26
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.

8 réponses

Sylar44 Messages postés 20 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 24 août 2008
30 janv. 2008 à 14:21
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
0
yokigirl Messages postés 7 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 30 janvier 2008
30 janv. 2008 à 14:36
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.
0
Sylar44 Messages postés 20 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 24 août 2008
30 janv. 2008 à 14:51
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
0
yokigirl Messages postés 7 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 30 janvier 2008
30 janv. 2008 à 15:06
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sylar44 Messages postés 20 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 24 août 2008
30 janv. 2008 à 15:21
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 janv. 2008 à 16:01
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.
0
yokigirl Messages postés 7 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 30 janvier 2008
30 janv. 2008 à 16:11
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.
0
yokigirl Messages postés 7 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 30 janvier 2008
30 janv. 2008 à 16:26
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.
0