Surcharge des opérateurs C ++ pour les opérations sur les nombres complexes

J’ai une mission en C ++ et j’ai du mal à démarrer. Le but est de “concevoir une classe qui utilise les opérateurs surchargés suivants pour les nombres complexes: >> << + – * /"

Ma question ne concerne pas la syntaxe, mais plutôt la logique. Je pourrais utiliser un peu d’aide pour prendre le cerveau d’assaut.

Échantillon d’entrée:
2,5 -2,2
1,0 1,0

Échantillon OutPut:
A = (2.5) + (-2.2) i
B = (1.0) + (1.0) i

A + B = (3,5) + (-1,2) i
A – B = …………..
A * B = …………..
A / B = …………..

Alors, comment puis-je commencer cela? La classe “Complexe” surcharge ces opérateurs, cela signifie-t-il que je ne peux utiliser que ces opérateurs dans la classe (c’est-à-dire à l’intérieur de fonctions publiques)? Si oui, voudrais-je le faire de cette façon? Ou voudrais-je le faire dans mon code client / pilote?

Deuxièmement, s’agit-il simplement d’append i à la deuxième valeur de chaque ligne? Cela semble trop facile. Toute direction serait très appréciée. (Juste pour le compte rendu, je ne cherche personne pour faire mes devoirs pour moi … je pourrais juste utiliser quelques informations)

Il me semble que le but est de démontrer la surcharge de fonctionnement de classe. Je pense donc que l’idée est de créer un complexe de classe contenant des informations sur le nombre réel et le nombre imaginaire (le i signifie que c’est imaginaire). Gérez diverses opérations entre les nombres complexes dans les remplacements d’opérateurs que vous faites vous-même.

Une fois que vous avez cela et que vous voyez que cela fonctionne (créez une méthode de test statique qui effectue diverses opérations et affiche les résultats à l’écran), vous vous inquiétez de ne pas utiliser cette classe pour travailler avec l’entrée car l’parsing de l’entrée sera une autre tâche en soi. Parfois, il est plus simple de diviser des problèmes en problèmes plus petits que d’essayer de faire les deux en même temps.

J’espère que cela pourra aider. Bonne chance!

Vous devez concevoir une classe appelée Complexe comprenant au moins:

  • un constructeur vous permettant de construire un object complexe à partir de valeurs de composants réels et imaginaires, par exemple complexe (1, 5)

  • redéfinit l’opérateur + pour que vous puissiez append deux objects complexes et renvoyer un nouvel object complexe, par exemple complexe (1, 5) + complexe (3, 7) est complexe (4, 12)

  • de même pour d’autres opérateurs

Mais vous devez d’abord comprendre les bases mathématiques derrière les nombres complexes pour pouvoir écrire les méthodes de surcharge de l’opérateur.

Ils aiment les paires de valeurs:

A = N1 + I1i B = N2 + I2i A + B = (N1 + I1i) + (N2 + I2i) = N1 + I1i + N2 + I2i = (N1 + N2) + (I1i + I2i) = (N1 + N2) + (I1 + I2)i A - B = (N1 + I1i) - (N2 + I2i) = N1 + I1i - N2 - I2i = (N1 - N2) + (I1i - I2i) = (N1 - N2) + (I1 - I2)i // N1, N2, I1, I2 are all just normal numbers. // You can multiply them like normal. You just have to keep track of the `i` // Also not that i = sqrt(-1) // Therefore i * i = sqrt(-1) * sqrt(-1) // = sqrt(-1)^2 // = -1 A * B = (N1 + I1i) * (N2 + I2i) = (N1 * N2) + (N1 * I2i) + (I1i * N2) + (I1i * I2i) = (N1 * N2) + (N1 * I2)i + (N2 * I1)i + (i * i * I1 * I2) = (N1 * N2) + i((N1 * I2) + (N2 * I1)) + (-1 * I1 * I2) // Simplest form = ((N1 * N2) - (I1 * I2)) + ((N1 * I2) + (N2 * I1))i A / B = Repeat as above. 

Il y a quelques choses que vous devez faire pour accomplir cette tâche:

Définissez une classe (par exemple, Complexe) pouvant contenir les données de la partie réelle et imaginaire d’un nombre complexe.

Surchargez les opérateurs respectifs (par exemple):

 class Complex { public: // other declarations here Complex operator+ (const Complex& rhs) const; // other stuff here }; 

Implémentez les opérateurs respectifs pour effectuer réellement l’opération mathématique (par exemple):

 Complex Complex::operator+ (const Complex& rhs) const { Complex result = *this; result.Real += rhs.Real; result.Imaginary += rhs.Imaginary; return result; } 

J’espère que vous avez fini vos devoirs maintenant 🙂 Voici ma solution si quelqu’un a encore besoin d’aide.

 #include  #include  #include  using namespace std; class Complex { float real_, imaginary_; public: Complex (float, float); Complex operator= (const Complex& rhs); Complex operator+ (const Complex& rhs) const; Complex operator- (const Complex& rhs) const; Complex operator* (const Complex& rhs) const; ssortingng toSsortingng() const; }; Complex::Complex (float r, float i){ real_ = r; imaginary_ = i; } Complex Complex::operator= (const Complex& rhs){ real_ = rhs.real_; imaginary_ = rhs.imaginary_; return *this; } Complex Complex::operator+ (const Complex& rhs) const{ Complex result = *this; result.real_ += rhs.real_; result.imaginary_ += rhs.imaginary_; return result; } Complex Complex::operator- (const Complex& rhs) const{ Complex result = *this; result.real_ -= rhs.real_; result.imaginary_ -= rhs.imaginary_; return result; } Complex Complex::operator* (const Complex& rhs) const{ Complex result = *this; // this-> == *this == (*this) result.real_ = real_ * rhs.real_ - imaginary_ * rhs.imaginary_; //cout << result.real_ << "R " << result.imaginary_ << "I "<< "|" << rhs.real_ << "R " << rhs.imaginary_ << "I\n"; result.imaginary_ = (real_ * rhs.imaginary_) + (rhs.real_ * imaginary_); //cout << result.real_ << "R " << result.imaginary_ << "I "<< "|" << rhs.real_ << "R " << rhs.imaginary_ << "I\n"; return result; } string Complex::toString() const { stringstream ss; if (imaginary_ > 0){ ss << real_ << " + " << imaginary_ << "i"; } else { ss << real_ << " " << imaginary_ << "i"; } return ss.str(); } int main () { Complex a(5, 6); Complex b(1, 4); Complex sum = a + b; Complex dif = a - b; Complex pro = a * b; cout << "sum: " << sum.toString() << "\n"; cout << "difference: " << dif.toString() << "\n"; cout << "product: " << pro.toString() << "\n"; return 0; }