2010-12-03 9 views
6

Ich habe eine Zuordnung in C++ und ich habe Probleme mit dem Start. Das Ziel ist, "eine Klasse zu entwerfen, die die folgenden überladenen Operatoren für komplexe Zahlen verwendet: >> < < + - * /"C++ Operator überladen für komplexe Zahlenoperationen

Meine Frage ist nicht über die Syntax, sondern mehr über die Logik. Ich könnte etwas Hilfe Brainstorming verwenden.

Eingang Sample:
2,5 -2,2
1,0 1,0

Ausgangsabtastwert:
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 = ..............

Also, wie fange ich das an? Die Klasse "Complex" überlädt diese Operatoren, also bedeutet das, dass ich diese Operatoren nur in der Klasse verwenden kann (d. H. In öffentlichen Funktionen)? Wenn ja, würde ich es so machen wollen? Oder möchte ich es in meinem Client/Treiber-Code tun?

Zweitens, ist es nur Hinzufügen von i zum zweiten Wert jeder Zeile? Das scheint zu einfach. Jede Richtung würde sehr geschätzt werden. (Nur für den Rekord, ich suche niemanden, um meine Hausaufgaben für mich zu tun ... könnte nur einige Eingaben verwenden)

Antwort

7

Es scheint mir, dass der Punkt ist, Klassenüberlastung zu demonstrieren, so denke ich Idee ist, dass Sie einen Klassenkomplex erstellen, der Informationen über die reelle Zahl und die imaginäre Zahl enthält (das i bedeutet, dass es imaginär ist). Behandeln Sie verschiedene Operationen zwischen komplexen Zahlen in von Ihnen selbst durchgeführten Operator-Überschreibungen.

Sobald Sie das haben und sehen, dass es funktioniert (machen Sie eine statische Testmethode, die verschiedene Operationen ausführt und die Ergebnisse auf dem Bildschirm druckt), dann sorgen Sie sich über die Verwendung dieser Klasse mit Eingabe arbeiten, da das Parsen der Eingabe eine andere Aufgabe sein wird an sich. Manchmal ist es einfacher, Probleme in kleinere Probleme aufzuteilen, als beides gleichzeitig zu versuchen.

Hoffe, dass hilft. Viel Glück!

+0

Es tut sicher, vielen Dank. Sehr geschätzt. –

2

Sie mögen Wertepaare:

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. 
2

Sie müssen eine Klasse namens Komplex entwerfen, die mindestens umfasst:

  • ein Konstruktor so dass Sie ein komplexes Objekt aus realen und imaginären konstruieren Komponentenwerte, z Komplex (1, 5)

  • überschreibt den Operator +, sodass Sie zwei komplexe Objekte hinzufügen und ein neues komplexes Objekt, z.Complex (1, 5) + Complex (3, 7) ist komplex (4, 12)

  • in ähnlicher Weise für andere Betreiber

Aber zuerst müssen Sie die grundlegende Mathematik hinter komplexen Zahlen verstehen, so dass Sie können die Operator-Überlademethoden schreiben.

1

Es gibt ein paar Dinge, die Sie tun müssen, um diese Aufgabe zu erfüllen:

eine Klasse definieren (z Complex), die die Daten für den realen und imaginären Teil einer komplexen Zahl halten kann.

Überlastung die jeweiligen Betreiber (z):

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

Umsetzung der jeweiligen Betreiber tatsächlich die mathematische Operation durchführen (z):

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