Komplexe Zahlen Beispiel
-
Hallo Community!
Ich habe morgen Klausur für das Einführungsfach für cpp.
Da müssen wir am Zettel programmieren (kleine Klassen schreiben, paar Funktionen usw). Jedenfalls nichts Tragisches.Ich habe mir den Test aus dem Vorjahr angesehen und bin mir dabei nicht ganz sicher:
Soweit die Angabe:
Entwickle eine Klasse welche eine komplexe Zahl in kartesischer Form (a + b∙i) speichert.
Die Attribute dieser Klasse sind Realteil (a) und der Imaginärteil (b).
Entwickeln Sie eine Methode, welche eine invertierte Version einer in oben beschriebenen Klasse
vorliegender komplexen Zahl erstellt.
Parameter
Keine
Rückgabewert
Die invertierte komplexe Zahl (als neues Objekt)
Bedienen Sie sich folgender Formeln zur Berechnung
a = -a
b = -b
Überladen Sie den > Operator für oben beschriebene Klasse. Eine komplexe Zahl ist dann größer
wenn ihr Betrag (r = √(a²+b²)) größer ist.Mein Ansatz soweit:
#include <iostream> class ComplexNumber { private: float a_, b_; ComplexNumber(const ComplexNumber&) {} public: ComplexNumber(): a_(0), b_(0) {} ComplexNumber(float a, float b): a_(a), b_(b) {} virtual ~ComplexNumber() {} }; ComplexNumber invertNumber() { ComplexNumber c; c.a_ = -c.a_; c.b_ = -c.b_; return c; } bool operator >(const ComplexNumber& comp) { float radius = 0; radius = sqrt(comp.a_* comp.a_ + comp.b_ * comp.b_) if radius > <----größer als was? ----> return true; }Ich bin mir beim invertieren nicht ganz sicher, schon gar nicht beim operator overload.
Lg Pascal
-
Da fängst du ja recht früh an ...
Wenn von Methode gesprochen wird, kannst du davon ausgehen, dass eine Klassenfunktion gemeint ist. Was soll dann wohl invertiert werden?
Ähnlich verhält es sich mit dem Operator.
Destruktor und dann auch noch virtuell - warum?
Kopierkonstruktor selbst definiert, privat und auch noch falsch - warum?
Grundsätzlich solltest du deine Programme auch übersetzen. Papier macht allenfalls in der Prüfung Sinn.
-
operator>()als freistehende Funktion braucht einen 2. Parameter. Den sog. "<----größer als was? ---->-Teil".
#include <cmath> bool operator>(const ComplexNumber& a, const ComplexNumber& b) { using namespace std; return hypot(a.a_, a.b_)>hypot(b.a_, b.b_); }
-
manni66 schrieb:
Da fängst du ja recht früh an ...
Destruktor und dann auch noch virtuell - warum?
Kopierkonstruktor selbst definiert, privat und auch noch falsch - warum?
Wir müssen den Copy Constructor nach Defintion immer private machen
Zitat Vorlesungsfolie: Faustregel: Jede Klasse muss einen expliziten Copy (private)
Constructor haben (für deep copy)
Dasselbe gilt für den Destructor..Also so in der Art?
ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; //dass dann in ein neues Objekt ComplexNumber c = new ComplexNumber(a_, b_); return c; }Furble Wurble schrieb:
operator>()als freistehende Funktion braucht einen 2. Parameter. Den sog. "<----größer als was? ---->-Teil".
danke FurbleWurble!
Dass der überladene Operatar > immer 2 Parameter braucht wusste ich nicht.
So macht das mehr Sinn!lg
-
pascal_77 schrieb:
Wir müssen den Copy Constructor nach Defintion immer private machen
Zitat Vorlesungsfolie: Faustregel: Jede Klasse muss einen expliziten Copy (private)
Constructor haben (für deep copy)
Dasselbe gilt für den Destructor..Das ist ja wohl eine der dümmsten Regeln, die ich je gehört habe.
Also so in der Art?
ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; //dass dann in ein neues Objekt ComplexNumber c = new ComplexNumber(a_, b_); return c; }Hier hast du eine andere C++-Faustregel, die wesentlich besser ist, als die aus deiner Vorlesung: Kein new!
-
Furble Wurble schrieb:
operator>()als freistehende Funktion braucht einen 2. Parameter. Den sog. "<----größer als was? ---->-Teil".
#include <cmath> bool operator>(const ComplexNumber& a, const ComplexNumber& b) { using namespace std; return hypot(a.a_, a.b_)>hypot(b.a_, b.b_); }Warum unnötiges Wurzelziehen?
bool operator>(const ComplexNumber& a, const ComplexNumber& b) { return a.a_*a.a_ + a.b_*a.b_ > b.a_*b.a_ + b.b_*b.b_; }
-
SeppJ schrieb:
Hier hast du eine andere C++-Faustregel, die wesentlich besser ist, als die aus deiner Vorlesung: Kein new!
Merk ich mir, danke.
Sozusagen auf diese Art?
ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; return ComplexNumber(a_, b_); }
-
pascal_77 schrieb:
Sozusagen auf diese Art?
ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; return ComplexNumber(a_, b_); }Nein! (vermute ich...)
"Rückgabewert
Die invertierte komplexe Zahl (als neues Objekt) "Ich verstehe das so, dass ein neues Objekt erstellt werden soll, würde das also folgendermaßen lösen:
ComplexNumber CreateInverted() const { return ComplexNumber(-a_, -b_); }
-
pascal_77 schrieb:
SeppJ schrieb:
Hier hast du eine andere C++-Faustregel, die wesentlich besser ist, als die aus deiner Vorlesung: Kein new!
Merk ich mir, danke.
Sozusagen auf diese Art?
ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; return ComplexNumber(a_, b_); }manni66 schrieb:
Grundsätzlich solltest du deine Programme auch übersetzen. Papier macht allenfalls in der Prüfung Sinn.
Dann würde der Compiler dir nämlich sagen, dass a_ und b_ unbekannt sind.
manni66 schrieb:
Wenn von Methode gesprochen wird, kannst du davon ausgehen, dass eine Klassenfunktion gemeint ist. Was soll dann wohl invertiert werden?
Wie invertierst du 40+2i mit deiner Funktion?
-
pascal_77 schrieb:
manni66 schrieb:
Da fängst du ja recht früh an ...
Destruktor und dann auch noch virtuell - warum?
Kopierkonstruktor selbst definiert, privat und auch noch falsch - warum?
Wir müssen den Copy Constructor nach Defintion immer private machen
Zitat Vorlesungsfolie: Faustregel: Jede Klasse muss einen expliziten Copy (private)
Constructor haben (für deep copy)
Dasselbe gilt für den Destructor..Faustregel != wir müssen
Hier gibt es keine deep copy, der Compiler macht alles wunderbar selber richtig. Deine Implementierung des Kopierkonstruktors ist aber schlicht falsch, denn sie kopiert nichts.Wurde in der Vorlesung vielleicht davon gesprochen:
http://de.wikipedia.org/wiki/Dreierregel
-
manni66 schrieb:
Wurde in der Vorlesung vielleicht davon gesprochen:
http://de.wikipedia.org/wiki/DreierregelGenau davon wurde gesprochen, ja!
Ich dachte ich bin am richtigen Weg. Ich habe das Programm nun schnell abgetippt und die invertier-Funktion funktioniert eigentlich....
Was stimmt noch nicht?Programm:
class ComplexNumber { private: float a_, b_; //hier fehlte das Objekt ComplexNumber(const ComplexNumber& rhs) {} public: ComplexNumber(): a_(0), b_(0) {} ComplexNumber(float a, float b): a_(a), b_(b) {} ~ComplexNumber() {} float getA() {return a_;} float getB() {return b_;} ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; return ComplexNumber((-a_), (-b_)); } friend bool operator>(const ComplexNumber& a, const ComplexNumber& b) { return sqrt(a.a_*a.a_ + a.b_*a.b_) > sqrt(b.a_*b.a_ + b.b_*b.b_); } }; int main() { ComplexNumber *c = new ComplexNumber(40.0,2.0); c->invertNumber(); std::cout << c->getA() << " " << c->getB() << std::endl; }
-
pascal_77 schrieb:
Ich dachte ich bin am richtigen Weg. Ich habe das Programm nun schnell abgetippt und die invertier-Funktion funktioniert eigentlich....
Was stimmt noch nicht?die Invertier-Funktion verändert die aktuelle Instanz. Soll das wirklich so sein? Würde mich sehr wundern... zumal in der Aufgabenstellung explizit steht, dass ein ComplexNumber zurückgegeben werden soll. Das machst du zwar auch, aber wo ist da der Sinn, wenn die Instanz selbst verändert wird? Da ist der Rückgabewert mal komplett überflüssig
-
Ah da hast Recht. Ich werd das Objekt bestimmt nicht verändern drüfen..
Langsam kommt mir vor ich bin auf dem Holzweg...
Auf die Art würde ich ein neues Objekt zurückgeben und das alte unverändert bleiben..?ComplexNumber invertNumber() { ComplexNumber c; c.a_ = -a_; c.b_ = -b_; return c; }
-
pascsal_77 schrieb:
Auf die Art würde ich ein neues Objekt zurückgeben und das alte unverändert bleiben..?
Schau dir doch mal an, welche Konstruktoren du zur Verfügung hast... und anschließend, was ich hier um 9:57 gepostet habe

-
daddy_felix schrieb:
Schau dir doch mal an, welche Konstruktoren du zur Verfügung hast... und anschließend, was ich hier um 9:57 gepostet habe

Ah okay, danke.
Das einzige Problem dass jetzt noch offen ist, ist dass der Compiler schreit dass der Copy-Constructor private ist. Kommentiere ich ihn aus funktioniert alles. Ist der return Wert in der Methode jetzt ein Verweis auf den CC? Oder benötige ich diesen gar nicht?
-
Du versuchst sowas hier:
ComplexNumber c1(2,4); ComplexNumber c2 = c1.inverted();das ist äquivalent zu:
ComplexNumber c1(2,4); ComplexNumber c2(c1.inverted()); // Copy ConstructorAlso ja, hier benötigst du einen Copy Constructor (allerdings keinen eigenen, der automatisch generierte ist in diesem Fall völlig ausreichend)