C++ et surclassage d'opérateurs
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

C++ et surclassage d'opérateurs



  1. #1
    peter pan666

    C++ et surclassage d'opérateurs


    ------

    Bonjour à toutes et tous

    J'ai fais un petit programme qui permet de faire des additions et multiplications de nombres complexes, le programme permet également d'afficher les nombres au format cartésien ou polaire.

    Le programme est fragmenté en trois fichiers le main, le h et le cpp correspondant où sont les déclarations des méthodes entre autre.

    Mon problème c'est que..TOUT marche.Ce qui est vraiment étrange c'est que dans la méthode "operator*" et "puissance" je fais passé pour le troisième argument un angle qui devrait être en degré, or, dans "operator*" l'angle est en radian et dans "puissance" j'ai été obligé de le convertir sinon le compilateur me sortait des erreurs..

    Donc ma question, si elle n'est pas clair, c'est pourquoi est ce que ça marche lorsque je fais passer des radians à la place de degrés un coup et pas l'autre?


    Voici le main:
    Code:
    #include "complexe.h"
    
    int main(void)
    {
    	cout.fixed;
    	cout.precision(3);
    	
    	complexe z1(1,2,4),z2(0,5,35),z3,z4,z5(1,-0.5,0.866),z6;//Initialisation des nbs complexes
    	
    	z1.aff_cart("z1");
    	z2.aff_cart("z2");
    	
    	z1.aff_pol("z1");
    	z2.aff_pol("z2");
    	
    	z3=z1+z2;//z3=somme z1 z2
    	
    	z3.aff_cart("z3");
    	z3.aff_pol("z3");
    	
    	z4=z1*z2;//z4=produit z1 z2
    	
    	z4.aff_cart("z4");
    	z4.aff_pol("z4");
    	
    	z6=puissance(z5,2);//z6=z5^2
    	
    	z6.aff_cart("z6");
    	z6.aff_pol("z6");
    	
    	z5.aff_cart("z5");
    	z5.aff_pol("z5");
    	
    	
    	return 0;
    }
    le header:
    Code:
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    class complexe
    {
    	private :
    	
    	double reel, imag, mod, arg;
    	
    	static const double pi;
    	
    	
    	public :
    	
    	complexe(bool,double,double);//constructeur avec argument
    	complexe (void);//constructeur sans argument
    	
    	~complexe(void);//destructeur
    	
    	
    	void conv_pol_cart(void);
    	
    	void conv_cart_pol(void);
    	
    	void aff_cart(char*);
    	
    	void aff_pol(char*);
    	
    	friend complexe operator+(complexe,complexe);
    	
    	friend complexe operator*(complexe,complexe);
    	
    	friend complexe puissance(complexe, int);
    	
    };
    et le cpp des déclarations
    Code:
    #include "complexe.h"
    
    const double complexe::pi=3.14159265358;//Initiation de PI
    
    void complexe::conv_cart_pol(void)//conversion cartesien/polaire
    {
    	mod=sqrt(pow(reel,2)+pow(imag,2));
    	
    	arg=atan2(imag,reel);
    	
    }
    
    void complexe::conv_pol_cart(void)//conversion polaire/cartesien
    {
    	reel=mod*cos(arg);
    	
    	imag=mod*sin(arg);
    }
    
    complexe::complexe(bool b, double u, double v)//Constructeur avec parametre
    {
    	
    	if(b==1)
    	{
    		reel=u;
    		imag=v;
    		
    		conv_cart_pol();
    		
    	}
    	
    	else 
    	{
    		v=v*pi/180;//conversion deg>rad
    		
    		mod=u;
    		arg=v;
    		
    		conv_pol_cart();
    	}
    	
    	cout<<"constructeur"<<endl;
    
    }
    
    complexe::complexe(void)
    {
    	reel=0;
    	imag=0;
    	mod=0;
    	arg=0;
    	
    	cout<<"constructeur sans parametre"<<endl;
    }
    
    complexe::~complexe(void)
    {
    	cout<<"destructeur"<<endl;
    }
    
    void complexe::aff_cart(char *nom)//affichage cartesien
    {
    	cout<<nom<<"="<<reel<<"+"<<imag<<"i"<<endl;
    }
    
    void complexe::aff_pol(char *nom)//affichage polaire
    {
    	arg=arg*180/pi;//conversion rad>deg 
    	
    	cout<<nom<<"="<<mod<<"⎪_"<<arg<<"deg"<<endl;
    }
    
    complexe operator+(complexe a,complexe b)//somme
    {
    	complexe resultat(1,a.reel+b.reel,a.imag+b.imag);
    	
    	return resultat;
    }
    
    complexe operator*(complexe a, complexe b)//produit
    {
    	complexe resultat(0,a.mod*b.mod,a.arg+b.arg);
    	
    	return resultat;
    }
    
    complexe puissance(complexe a, int n)//puissance
    {	
    	
    	complexe resultat(0,pow(a.mod,n),(a.arg*n)*180/complexe::pi);
    	
    	return resultat;
    	
    }
    Je rappelle que le programme fonctionne très bien!J'espère simplement que quelqu'un pourra m'aider..

    Merci pour la lecture

    PS:Il va de soit que s'il y a un problème de compréhension n'hésitez pas à me demander!

    -----

  2. #2
    invite4492c379

    Re : C++ et surclassage d'opérateurs

    Hello,

    Citation Envoyé par peter pan666 Voir le message
    Bonjour à toutes et tous

    J'ai fais un petit programme qui permet de faire des additions et multiplications de nombres complexes, le programme permet également d'afficher les nombres au format cartésien ou polaire.

    Le programme est fragmenté en trois fichiers le main, le h et le cpp correspondant où sont les déclarations des méthodes entre autre.

    Mon problème c'est que..TOUT marche.Ce qui est vraiment étrange c'est que dans la méthode "operator*" et "puissance" je fais passé pour le troisième argument un angle qui devrait être en degré, or, dans "operator*" l'angle est en radian et dans "puissance" j'ai été obligé de le convertir sinon le compilateur me sortait des erreurs..
    Lesquelles ?

    Citation Envoyé par peter pan666 Voir le message
    Donc ma question, si elle n'est pas clair, c'est pourquoi est ce que ça marche lorsque je fais passer des radians à la place de degrés un coup et pas l'autre?
    Je ne comprends toujours pas ta question.
    Ton constructeur créé un complexe à partir d'un angle exprimé en degrés. Tu effectues un conversion en radians que tu stockes dans arg.

    Donc je suppose à première vue que ton operator* est faux, car tu construis un complexe en lui donnant un argument exprimé en radian alors qu'il s'attend à des degrés.

    Si je peux te donner un conseil, stocker deux représentations (cartésienne et polaire) est périlleux. Choisis-en une, et crée des accesseurs. Un constructeur avec un booléen est périlleux également (surtout avec un test b==1, il vaut mieux faire dans ce cas un test if(b) tout court, car l'utilisateur qui va passer 2 se retrouvera dans le mauvais cas). Un enum serait le bienvenu. Une factory de complex serait pas mal non plus.

  3. #3
    whoami

    Re : C++ et surclassage d'opérateurs

    Bonjour,

    Si tu tiens à gérer les représentations cartésienne et polaire, ajoute un champ à ta classe, qui stockera quel type les données représentent actuellement, et te permettra de faire les bonnes conversions selon les opérations désirées.

    Normalement, M_PI (ou PI, selon l'implémentation ?) est définie quelque part dans math.h, en double précision.

  4. #4
    peter pan666

    Re : C++ et surclassage d'opérateurs

    Merci pour ces deux réponses, je vais préciser un peu le contexte.

    C'est pour un exercice en cours, l'exercice est réussi puisque les résultats que j'obtiens sont bon, c'est simplement pour pas mourir con..

    Citation Envoyé par photon57
    Donc je suppose à première vue que ton operator* est faux, car tu construis un complexe en lui donnant un argument exprimé en radian alors qu'il s'attend à des degrés.
    Voilà tu as mis le doigt dessus! ça devrait être faux et pourtant ça marche et ça que je n'arrive pas à comprendre..Pour la méthode puissance j'ai été obligé de convertir en degré alors que pour operator* non..

    Merci encore pour les réponses!

  5. A voir en vidéo sur Futura
  6. #5
    Chanur

    Re : C++ et surclassage d'opérateurs

    Je ne comprends absolument rien : tu dis que si tu ne fais pas la conversion dans la méthode puissance le compilo te donne une erreur.
    Tu avais écrit :
    Code:
    complexe resultat(0,pow(a.mod,n),a.arg*n);
    et ça te donnait une erreur de compilation ??????
    Quelle erreur ?

  7. #6
    invite4492c379

    Re : C++ et surclassage d'opérateurs

    Citation Envoyé par peter pan666 Voir le message
    Merci pour ces deux réponses, je vais préciser un peu le contexte.

    C'est pour un exercice en cours, l'exercice est réussi puisque les résultats que j'obtiens sont bon, c'est simplement pour pas mourir con..



    Voilà tu as mis le doigt dessus! ça devrait être faux et pourtant ça marche et ça que je n'arrive pas à comprendre..Pour la méthode puissance j'ai été obligé de convertir en degré alors que pour operator* non..

    Merci encore pour les réponses!
    Heu ... J'ai fait du copy/paste et je te confirme que ton programme ne fonctionne pas :

    Code:
    #include "complexe.h"
    #include <iostream>
    
    
    int main()
    {
        complexe c1(0,1,180);
        complexe c2(0,1,180);
    
    
        (c1*c2).aff_pol("c3");
    }
    donne le résultat :

    Code:
    constructeur
    constructeur
    constructeur
    c3=1⎪_6.28319deg
    destructeur
    destructeur
    destructeur
    destructeur
    destructeur
    or on devrait avoir c3 = 1 | 0deg, or tu affiche un argument de 2.pi degré => faux

    Dans ce cas c'est un PCC (Problème situé entre le Clavier et la Chaise)

  8. #7
    peter pan666

    Re : C++ et surclassage d'opérateurs

    Citation Envoyé par Chanur
    Je ne comprends absolument rien : tu dis que si tu ne fais pas la conversion dans la méthode puissance le compilo te donne une erreur
    Désolé je me suis mal exprimé, c'est pas le compilo qui donne une erreur, c'est le résultat qui est faux.

    Si j'écris ça
    Code:
    complexe operator*(complexe a, complexe b)//produit
    {
    	complexe resultat(0,a.mod*b.mod,(a.arg+b.arg)*180/complexe::pi);
    	
    	return resultat;
    }
    en faisant z1*z2 j'obtiens 5.64e+03° alors que je devrais avoir 98,4° si j'dis pas de connerie..Alors que j'obtiens le bon résultat en écrivant
    Code:
    complexe operator*(complexe a, complexe b)//produit
    {
    	complexe resultat(0,a.mod*b.mod,a.arg+b.arg);
    	
    	return resultat;
    }
    Cependant c'est vrai qu'avec le calcul de photon57 ça ne marche pas, peut être parce que tu as déclaré c1 et c2 en polaire, j'ai essayé de chercher à ce niveau mais j'ai rien trouvé..

  9. #8
    invite4492c379

    Re : C++ et surclassage d'opérateurs

    Citation Envoyé par peter pan666 Voir le message
    (...)

    Cependant c'est vrai qu'avec le calcul de photon57 ça ne marche pas, peut être parce que tu as déclaré c1 et c2 en polaire, j'ai essayé de chercher à ce niveau mais j'ai rien trouvé..
    Mêmes résultats avec :

    Code:
    #include "complexe.h"
    #include <iostream>
    
    
    int main()
    {
    	complexe c1(1,-1,0);
    	complexe c2(1,-1,0);
    
    
    	(c1*c2).aff_pol("c3");
    }

  10. #9
    invite4492c379

    Re : C++ et surclassage d'opérateurs

    Je le répète, la conception est faible. Tu devrais utiliser au moins un enum du genre :
    Code:
    enum Representation {coord_cart, coord_pol_rad, coord_pol_deg};
    Tu l'utiliseras aussi bien pour le constructeur que pour l'affichage. Tu ne gardes en interne qu'une représentation et tu effectues les conversions quand c'est nécessaire (à la construction ou à l'affichage).

  11. #10
    peter pan666

    Re : C++ et surclassage d'opérateurs

    Je ne connaissais pas le enum mais merci du conseil!

Discussions similaires

  1. Physique quantique : commutation d'opérateurs
    Par Infra_Red dans le forum Physique
    Réponses: 13
    Dernier message: 01/12/2009, 11h54
  2. Formule d'operateurs differentiels
    Par Blend59 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 15/04/2009, 22h05
  3. application d'opérateurs à une fonction
    Par Jonn4491 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 23/11/2007, 15h57
  4. Moyenne d'opérateurs
    Par invite4b31cbd7 dans le forum Physique
    Réponses: 2
    Dernier message: 31/01/2007, 01h55