zadanie nr 5 termin realizacji: 23 marzec 2005

C++

liczby zespolone (klasa z operatorami) studia wieczorowe

Zdefiniuj klasę LZesp reprezentującą liczbę zespoloną. Należy zdefiniować dla tej klasy operatory arytmetyczne +, -, *, /, operatory porównania == i != oraz metodę obliczającą moduł (według podanej definicji).

Liczbą zespoloną nazywamy uporządkowaną parę liczb rzeczywistych. Niech z = (x, y) będzie liczbą zespoloną. Wówczas x nazywamy częścią rzeczywistą liczby zespolonej i oznaczny ją przez Re(z), a y częścią urojoną liczby zespolonej i oznaczny ją przez Im(z). Zbiór wszystkich liczb zespolonych to C =^{def} {(x, y) : x, y ∈ R}. Z działaniami dodawania i mnożenia określonymi jak niżej zbiór liczb zespolonych C tworzy ciało, przy czym rolę zera pełni (0, 0) a rolę jedyki pełni (1, 0). Liczby zespolone można ze sobą porównywać, wykonywać na nich podstawowe operacje arytmetyczne (dodawanie, odejmowanie, mnożenie, dzielenie) oraz obliczać moduł (funkcję tą interpretuje się jako liczbę rzeczywistą mierzącą odległość zadanej liczby zespolonej od punktu (0, 0) na płaszczyźnie zespolonej). Niech z_{1} = (x_{1}, y_{1}) i z_{2} = (x_{2}, y_{2}) będą liczbami zespolonymi. Wówczas:

• równość z_{1} = z_{2} ⟺^{def} x_{1} = x_{2} ∧ y_{1} = y_{2}

• moduł liczby zespolonej z = (x, y) |z| =^{def} \sqrt{x^{2} + y^{2}} ∈ R

• dodawanie z_{1} + z_{2} =^{def} (x_{1} + x_{2}, y_{1} + y_{2})

• dla każdej liczby zespolonej z = (x, y) istnieje liczba przeciwna −z =^{def} (−x, −y)

• odejmowanie (dodanie liczby przeciwnej) z_{1} −z_{2} =^{def} z1+(−z_{2}) = (x_{1} −x_{2}, y_{1} −y_{2})

• mnożenie z_{1} · z_{2} =^{def} (x_{1}x_{2} − y_{1}y_{2}, x_{1}y_{2} + y_{1}x_{2})

• dla każdej liczby zespolonej z = (x, y) ≠ (0, 0) istnieje liczba odwrotna \frac{1}{z} =^{def}

(\frac{x}{x^{2}+y^{2}} , \frac{−y}{x^{2}+y^{2}} )

• dzielenie (mnożenie przez liczbę odwrotną) \frac{z_{1}}{z_{2}} =^{def} z_{1} · \frac{1}{z_{2}} = (\frac{x_{2}x_{1}+y_{2}y_{1}}{x_{2}^{2}+y_{2}^{2}} , \frac{x_{2}y_{1}−y_{2}x_{1}}{x_{2}^{2}+y_{2}^{2}} )

Operatory arytmetyczne zdefiniuj w taki sposób, aby można było ich używać także z argumentami typu double (konstruktor konwertujący) po obu stronach tego operatora (przyjaźń).

LZesp a, b;
// ...
a+b;
a+3;
5+b;

Obiekty klasy LZesp powinno się dać w łatwy sposób wykorzystać w wyrażeniach warunkowych (nie próbuj definiować operatora konwersji double() bo pojawią się niejednoznaczności w wyrażeniach arytmetycznych). Można się na przykład posłużyć operatorem wyłuskania * sprawdzającym, czy wartość modułu liczby zespolonej jest różna od 0.

LZesp c ;
// ...
if (*c) // c!=(0,0)
{ /*...*/ }
else // c==(0,0)
{ /*...*/ }

Zaprogramuj także zaprzyjaźnione operatory do czytania ze stumienia wejściowego operator» i pisania do strumienia wyjściowego operator«.

Całą definicję klasy LZesp podziel na część nagłówkową i źródłową. Następnie w osobnym pliku umieść program testowy, który sprawdzi poprawność zdefiniowanych przez Ciebie operacji na liczbach zespolonych.

Uwaga! Klasa LZesp będzie wykorzystywana w następnych zadaniach, a zatem warto napisać ją bardzo starannie.

Uniwersytet Wrocławski Paweł Rzechonek Instytut Informatyki ul. Przesmyckiego 20 PL-51-151 Wrocław