Operator

Fermé
noor - Modifié le 28 janv. 2020 à 14:34
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 28 janv. 2020 à 14:49
Bonjour,

S'il vous plaît pouvez-vous m'aider avec ces opérateurs, ils ne fonctionnent pas.

complexe &complexe::operator*=(const complexe &f)
{
    double k=reel*f.reel-imagi*f.imagi;
    imagi=reel*f.imagi+imagi*f.reel;
    reel=k;
    return *this;
}

complexe &complexe::operator/=(const complexe &f)
{
    double norm =f.reel*f.reel+f.imagi*f.imagi;
    double temp = (reel*f.reel+imagi*f.imagi)/norm;
    imagi= (-reel*f.imagi+imagi*f.reel)/norm;
    reel= temp;
    return *this;
}

complexe & complexe::operator *(const complexe &p){
    complexe * k= new complexe();

    (*k).imagi =reel * p.imagi- imagi * p.reel;
    (*k).reel =reel * p.imagi -imagi * p.reel;

    return *k;
}

complexe & complexe::operator /(const complexe &p)
{ 
    complexe * k= new complexe();
    (*k).imagi= -reel * p.imagi+imagi * p.reel;
    (*k).reel = reel * p.reel +imagi * p.imagi;
    double denominateur = p.reel * p.reel + p.imagi * p.imagi;
    (*k).imagi/= denominateur;
    (*k).reel/= denominateur;
    return *k;
}
complexe &complexe::operator+=(const complexe &p){
    this->reel += this->reel+p.reel;
    this->imagi+= this->imagi+p.imagi;
    return *this;
}

1 réponse

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
Modifié le 28 janv. 2020 à 14:59
Bonjour,

La moindre des choses aurait été de donnée le code de la classe
complexe
afin qu'on puisse reproduire ce que tu as écrit.

Note au passage que la classe
complex
est déjà implémentée dans le langage C++, voir ce lien.

Dans ton code, un certain nombre d'erreurs laissent penser que tu ne comprends pas ce que tu écris. Par exemple :
  • dans ton opérateur
    +=
    , si tu additionnes z = a + i.b et z' = a'+i.b', tu calcules en réalité z devient ce qu'il était plus z + z' (donc z devient égal à 2z+z').
  • dans ton opérateur
    *
    tu alloues un complexe mais tu retournes une référence alors que c'est inutile.


Donc voici à quoi devraient ressembler ces deux opérateurs, je te laisse corriger le reste.

#include <ostream>
#include <iostream>

struct complex_t {
    double a;
    double b;

    complex_t(double a = 0, double b = 0):
        a(a),
        b(b)
    {}
};

inline std::ostream & operator << (std::ostream & out, const complex_t & z) {
    out << z.a << " + i." << z.b;
    return out;
}

inline complex_t operator + (const complex_t & z1, const complex_t & z2) {
    return complex_t(z1.a + z2.a, z1.b + z2.b);
}

inline complex_t operator + (const complex_t & z1, double d) {
    return complex_t(z1.a + d, z1.b);
}   

inline complex_t & operator += (complex_t & z1, const complex_t & z2) { 
    z1.a += z2.a;
    z1.b += z2.b;
    return z1;
}

inline complex_t & operator += (complex_t & z1, double d) {
    z1.a += d;
    return z1;
}

int main() {
    using namespace std;
    complex_t z1(3, 5); // 3 + i.5
    complex_t z2(10, 20);
    double d = 7;
    cout << "z1 = " << z1 << endl
         << "z2 = " << z2 << endl
         << "d  = " << d  << endl
         << "z1 + d = " << z1 + d << endl
         << "z2 + d = " << z2 + d << endl;
    z1 += z2;
    cout << "z1 += z2 --> z1 = " << z1 << ", z2 = " << z2 << endl;
    z1 += d;
    cout << "z1 += d  --> z1 = " << z1 << ", d = " << d << endl;
    return 0;
}


... ce qui donne à l'exécution :

(mando@aldur) (~) $ g++ complex.cpp 
(mando@aldur) (~) $ ./a.out
z1 = 3 + i.5
z2 = 10 + i.20
d = 7
z1 + d = 10 + i.5
z2 + d = 17 + i.20
z1 += z2 --> z1 = 13 + i.25, z2 = 10 + i.20
z1 += d --> z1 = 20 + i.25, d = 7


Quelques points sur le code indiqué ci-dessus :
  • inline
    peut être omis, c'est une optimisation
  • les paramètres des opérateurs sont toutes des références (
    &
    ). Si le paramètre n'est pas modifié, on est supposé passer une const référence (voir
    +
    ). Sinon il faut passer juste une référence, comme dans
    +=
    )
  • le premier paramètre correspond à l'opérande gauche, le second à l'opérande droite.
  • le type de la valeur de retour dépend de la réponse à la question : ai-je dû ou non créer un
    complex_t
    dans l'opérateur. Si non : on retourne simplement une référence. Si oui, on retourne le type
    complexe_t
    .
  • j'ai aussi défini l'opérateur
    <<
    afin de pouvoir afficher facilement un
    complex_t
    . La valeur de retour et l'opérande gauche sont toujours de type
    std::ostream &
    .
  • note que le code proposé n'a pas de
    std::ostream &
    (on alloue ici dans le tas plutôt que dans la pile). En C++, qui dit
    new
    dit
    delete
    sinon cela engendre une fuite mémoire. Imagine le désastre sur une opération appelée hyper fréquemment, et on peut difficilement exiger de faire un delete à chaque addition !


Bonne chance
0