Funkcje operatorowe, liczba zespolona

0

Zdefiniuj zaprzyjaźnioną z klasą Zespolona funkcje operatorową, które obsłuży dodanie do skalara obiektu klasy Zespolona przy wywołaniu: z3 = 2 + z1;.

Klasa nazywa się zespolona

w mainie robie coś takiego:

Zespolona z1(3.0, 5.0);
	Zespolona z3;
	z3 = 2 + z1;

natomiast w pliku zespolona.cpp mam coś takiego

float operator +(const int& q, const Zespolona& z) {
	Zespolona nowa;
	nowa.re = q + z.re;
	nowa.im = q + z.im;
	return nowa.re + nowa.im;
}

w pliku zespolona.h

	friend float operator +(const int &q, const Zespolona& z,);

Ktoś pomoże i napisze jak to zrobić? Zadanie wydaje się nie być trudne. Tylko pierwszy raz mam styczność z funkcjami operatorowymi. Szukałem po różnych stronach, próbowałem zmieniać na różne sposoby, ale nie idzie. Co robie nie tak?

2

czemu zwracasz float? czemu w ogóle zwracasz wynik dodawania re + im?
powinieneś zwracać obiekt

0
au7h napisał(a):

czemu zwracasz float? czemu w ogóle zwracasz wynik dodawania re + im?

dodaje czesc rzeczywista z urojoną, a co ma innego zwracac jesli nie float? operuje na floatach. no nie kumam tego :/

1

nie rób parametru const int& q, tylko po prostu int q. wydajnościowo nie opłaca się robić referencji do jednego małego inta.

0
Zespolona operator+(const int& a, const Complex& b)
{
    Zespolona ret(b.getRe()+a, b.getIm()+a);
    return ret;
}

zwracasz obiekt bo później przypisujesz go do z3, nie możesz zwracać floata

0
bidzior57 napisał(a):
au7h napisał(a):

czemu zwracasz float? czemu w ogóle zwracasz wynik dodawania re + im?

dodaje czesc rzeczywista z urojoną, a co ma innego zwracac jesli nie float? operuje na floatach. no nie kumam tego :/

Zastanów się - najpierw stricte matematycznie - co tam ma się dziać.

Jak masz x = 2 + i, to czym jest x? Mam nadzieję, że to jest oczywiste, że jest to 2+i, czyli liczba zespolona, którą mógłbyś w swoim kodzie zapisać Zespolona x(2, 1);

Teraz zastanów się co wykona Twój kod: 2 + Zespolona(0, 1) z jakiegoś powodu zwróci 5, co nie ma sensu. Dojście do dalszych logicznych wniosków na razie zostawiam Tobie.

Btw: https://dsp.krzaq.cc/post/304/jak-przeladowywac-operatory-w-mojej-klasie/

0
au7h napisał(a):
Zespolona operator+(const int& a, const Complex& b)
{
    Zespolona ret(b.getRe()+a, b.getIm()+a);
    return ret;
}

zwracasz obiekt bo później przypisujesz go do z3, nie możesz zwracać floata

Dzięki za podpowiedź. Lekko zmodyfikowałem pod swoją wiedzę, bo jeszcze nie miałem tych complexów.

Zespolona operator+(const int a, const Zespolona b)
{
	Zespolona nowa(b.re + a, b.im + a);
	return nowa;
}
0

Nadal nie jest to poprawne matematycznie, dlaczego do części urojonej dodajesz wartość rzeczywistą?

0
kq napisał(a):

Nadal nie jest to poprawne matematycznie, dlaczego do części urojonej dodajesz wartość rzeczywistą?

czyli to ma tylko dodawać do rzeczywistej?

0

Tak jest. O ile zadanie nie jest idiotyczne, to następująca równość powinna zostać zachowana:

Zespolona(2, 1) == 2 + Zespolona(0, 1);
0
kq napisał(a):

Tak jest. O ile zadanie nie jest idiotyczne, to następująca równość powinna zostać zachowana:

Zespolona(2, 1) == 2 + Zespolona(0, 1);

Dobra, a w takim razie gdy mnoże liczbe zespoloną przez jakiś czynnik, to mam mnożyć też część urojoną?

1

Owszem, wszystko tak jak miałeś na zajęciach z matematyki :​)

0
kq napisał(a):

Owszem, wszystko tak jak miałeś na zajęciach z matematyki :​)

Dzięki bardzo za pomoc. Poukładaliście trochę w mojej głowie. Co tydzień jest dużo nowej wiedzy do przyswojenia i po prostu mój mózg już nie wyrabia momentami :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1