Les Allergies
Alimentaires
Posez votre question Signaler

Surcharge d'opérateur c++ [Résolu]

yokigirl 7Messages postés 26 décembre 2007Date d'inscription - Dernière réponse le 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.
Lire la suite 

Surcharge d'opérateur c++ »

8 réponses
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Ce document intitulé « surcharge d'opérateur c++ » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?