/*
Opracować zestaw operacji na liczbach zespolonych potrzebny do prawidłowego działania tego programu.
W tym celu należy prototypy (nagłówki) podanych tam funkcji, realizujących działania, zastąpić lub uzupełnić pełnymi definicjami działań.
Oczywiście dla napisania tych funkcji, potrzebne jest zastosowanie własnej wiedzy o liczbach zespolonych (np. z algebry).
*/
/* gcc -Wall zad1.c -o zad1 -lm */
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
#include <complex.h>
//"struktura" liczby zespolonej :
typedef struct
{
double rea, ima;
} zespol;
/*
pomocnicza funkcja przy uzyskaniu błedu wywołana w elsie (w funkcji zespol zesp_get(void),
gdy uzytkownik niepoprawnie wpisze postac liczby zespolonej.
*/
void err(char s[])
{
printf("\n!!! FUNKCJA zesp_get: %s !!!\n\n", s
); }
zespol zesp_zestawic(double r, double i)
{
zespol z;
z.rea=r;
z.ima=i;
return z;
}
zespol zesp_get(void)
{
/* wczytanie liczby zespolonej;
w postaci (X + Yi), gdzie X, Y - rzeczywiste, dopisanie "i" wymagane (liczba imaginalis) */
char ch;
zespol z;
int znak_im;
if(ch=='(')
{
if(scanf("%lf", &(z.
rea))==1) {
if(ch=='+' || ch=='-')
{
if(ch=='+') znak_im=1;
else znak_im=-1;
if(scanf("%lf", &(z.
ima))==1) {
if(ch=='i')
{
if(ch==')')
{
if(znak_im==-1) z.ima=-z.ima;
} else err("brak koncowego nawiasu");
} else err("brak 'i' na koncu czesci urojonej");
} else err("niepoprawna czesc urojona");
} else err("po czesci rzeczywistej brak znaku '+' lub '-'");
} else err("niepoprawna czesc rzeczywista");
} else err("brak rozpoczynajacego nawiasu");
return z;
}
void zesp_print(zespol z)
{
if(z.
ima>=0) printf("(%.2lf+%.2lfi)", z.
rea, z.
ima); else printf("(%.2lf-%.2lfi)", z.
rea, -z.
ima); }
/*
Postac liczb zespolonych :
z1 = a + bi;
z2 = c + di;
gdzie a, b, c, d sa rzeczywiste
Wykorzystane wzory do utworzenia funkcji :
- Dodawanie : z1 + z2 = (a + c) + (b + d)i;
- Odejmowanie : z1 - z2 = (a - c) + (b - d)i;
- Mnożenie : z1 * z2 = (ac - bd) + (ad + bc)i;
- Sprzezenie : z1S = a - bi;
- Moduł : |z| = |a + bi| = sqrt/pierwiastek (a^2 + b^2);
*/
// dodawanie liczb zespolonych :
zespol zesp_dodac(zespol z1, zespol z2)
{
zespol wynik;
wynik.rea=z1.rea+z2.rea;
wynik.ima=z1.ima+z2.ima;
return wynik;
}
// odejmowanie liczb zespolonych :
zespol zesp_odjac(zespol z1, zespol z2)
{
zespol wynik;
wynik.rea=z1.rea-z2.rea;
wynik.ima=z2.ima-z2.ima;
return wynik;
}
// mnozenie liczb zespolonych :
zespol zesp_razy(zespol z1, zespol z2)
{
zespol wynik;
wynik.rea=z1.rea*z2.rea-z1.ima*z2.ima;
wynik.ima=z1.rea*z2.ima+z1.ima*z2.rea;
return wynik;
}
// liczba sprzezona do danej zespolonej :
zespol zesp_sprzez(zespol z)
{
zespol wynik;
wynik.ima=-z.ima;
return wynik;
}
// wartosc bezwzgledna liczby zespolonej , tzw. "moduł":
double zesp_abs(zespol z)
{
double wynik;
wynik
=sqrt(z.
rea*z.
rea+z.
ima*z.
ima); return wynik;
}
int main()
{
zespol z1, z2;
printf("Zespolona Z1 == "); z1
= zesp_get
(); printf("Zespolona Z2 == "); z2
= zesp_get
(); printf("\nZ1+Z2 == "); zesp_print
(zesp_dodac
(z1
, z2
)); printf("\nZ1-Z2 == "); zesp_print
(zesp_odjac
(z1
, z2
)); printf("\nZ1*Z2 == "); zesp_print
(zesp_razy
(z1
, z2
)); printf("\n|Z1+Z2| == %.4lf\n", zesp_abs
(zesp_dodac
(z1
, z2
))); return 0;
}
LyoKT3ByYWNvd2HEhyB6ZXN0YXcgb3BlcmFjamkgbmEgbGljemJhY2ggemVzcG9sb255Y2ggcG90cnplYm55IGRvIHByYXdpZMWCb3dlZ28gZHppYcWCYW5pYSB0ZWdvIHByb2dyYW11LgpXIHR5bSBjZWx1IG5hbGXFvHkgcHJvdG90eXB5IChuYWfFgsOzd2tpKSBwb2RhbnljaCB0YW0gZnVua2NqaSwgcmVhbGl6dWrEhWN5Y2ggZHppYcWCYW5pYSwgemFzdMSFcGnEhyBsdWIgdXp1cGXFgm5pxIcgcGXFgm55bWkgZGVmaW5pY2phbWkgZHppYcWCYcWELgpPY3p5d2nFm2NpZSBkbGEgbmFwaXNhbmlhIHR5Y2ggZnVua2NqaSwgcG90cnplYm5lIGplc3QgemFzdG9zb3dhbmllIHfFgmFzbmVqIHdpZWR6eSBvIGxpY3piYWNoIHplc3BvbG9ueWNoIChucC4geiBhbGdlYnJ5KS4KKi8KCi8qIGdjYyAtV2FsbCB6YWQxLmMgLW8gemFkMSAtbG0gKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Y29tcGxleC5oPgoKCi8vInN0cnVrdHVyYSIgbGljemJ5IHplc3BvbG9uZWogOgp0eXBlZGVmIHN0cnVjdAp7CiAgZG91YmxlIHJlYSwgaW1hOwp9IHplc3BvbDsKCi8qCnBvbW9jbmljemEgZnVua2NqYSBwcnp5IHV6eXNrYW5pdSBixYJlZHUgd3l3b8WCYW5hIHcgZWxzaWUgKHcgZnVua2NqaSB6ZXNwb2wgemVzcF9nZXQodm9pZCksCmdkeSB1enl0a293bmlrIG5pZXBvcHJhd25pZSB3cGlzemUgcG9zdGFjIGxpY3pieSB6ZXNwb2xvbmVqLgoqLwoKdm9pZCBlcnIoY2hhciBzW10pCnsKICBwcmludGYoIlxuISEhIEZVTktDSkEgemVzcF9nZXQ6ICVzICEhIVxuXG4iLCBzKTsKICBleGl0KDEpOwp9Cgp6ZXNwb2wgemVzcF96ZXN0YXdpYyhkb3VibGUgciwgZG91YmxlIGkpCnsKICB6ZXNwb2wgejsKICB6LnJlYT1yOwogIHouaW1hPWk7CiAgcmV0dXJuIHo7Cn0KemVzcG9sIHplc3BfZ2V0KHZvaWQpCnsKICAvKiB3Y3p5dGFuaWUgbGljemJ5IHplc3BvbG9uZWo7CiAgdyBwb3N0YWNpIChYICsgWWkpLCBnZHppZSBYLCBZIC0gcnplY3p5d2lzdGUsIGRvcGlzYW5pZSAiaSIgd3ltYWdhbmUgKGxpY3piYSBpbWFnaW5hbGlzKSAqLwogIGNoYXIgY2g7CiAgemVzcG9sIHo7CiAgaW50IHpuYWtfaW07CiAgZG97Y2g9Z2V0Y2hhcigpO30gd2hpbGUoaXNzcGFjZShjaCkpOwogIGlmKGNoPT0nKCcpCiAgewogICAgaWYoc2NhbmYoIiVsZiIsICYoei5yZWEpKT09MSkKICAgIHsKICAgICAgZG97Y2ggPSBnZXRjaGFyKCk7fSB3aGlsZShpc3NwYWNlKGNoKSk7CiAgICAgIGlmKGNoPT0nKycgfHwgY2g9PSctJykKICAgICAgewogICAgICAgIGlmKGNoPT0nKycpIHpuYWtfaW09MTsKICAgICAgICBlbHNlIHpuYWtfaW09LTE7CiAgICAgICAgaWYoc2NhbmYoIiVsZiIsICYoei5pbWEpKT09MSkKICAgICAgICB7CiAgICAgICAgICBkb3tjaD1nZXRjaGFyKCk7fSB3aGlsZShpc3NwYWNlKGNoKSk7CiAgICAgICAgICBpZihjaD09J2knKQogICAgICAgICAgewogICAgICAgICAgICBkb3tjaD1nZXRjaGFyKCk7fSB3aGlsZShpc3NwYWNlKGNoKSk7CiAgICAgICAgICAgIGlmKGNoPT0nKScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZih6bmFrX2ltPT0tMSkgei5pbWE9LXouaW1hOwogICAgICAgICAgICB9IGVsc2UgZXJyKCJicmFrIGtvbmNvd2VnbyBuYXdpYXN1Iik7CiAgICAgICAgICB9IGVsc2UgZXJyKCJicmFrICdpJyBuYSBrb25jdSBjemVzY2kgdXJvam9uZWoiKTsKICAgICAgICB9IGVsc2UgZXJyKCJuaWVwb3ByYXduYSBjemVzYyB1cm9qb25hIik7CiAgICAgIH0gZWxzZSBlcnIoInBvIGN6ZXNjaSByemVjenl3aXN0ZWogYnJhayB6bmFrdSAnKycgbHViICctJyIpOwogICAgfSBlbHNlIGVycigibmllcG9wcmF3bmEgY3plc2MgcnplY3p5d2lzdGEiKTsKICB9IGVsc2UgZXJyKCJicmFrIHJvenBvY3p5bmFqYWNlZ28gbmF3aWFzdSIpOwogIHJldHVybiB6Owp9CnZvaWQgemVzcF9wcmludCh6ZXNwb2wgeikKewogIGlmKHouaW1hPj0wKSBwcmludGYoIiglLjJsZislLjJsZmkpIiwgei5yZWEsIHouaW1hKTsKICBlbHNlIHByaW50ZigiKCUuMmxmLSUuMmxmaSkiLCB6LnJlYSwgLXouaW1hKTsKfQoKLyoKUG9zdGFjIGxpY3piIHplc3BvbG9ueWNoIDoKejEgPSBhICsgYmk7CnoyID0gYyArIGRpOwpnZHppZSBhLCBiLCBjLCBkIHNhIHJ6ZWN6eXdpc3RlCld5a29yenlzdGFuZSB3em9yeSBkbyB1dHdvcnplbmlhIGZ1bmtjamkgOgotIERvZGF3YW5pZSA6IHoxICsgejIgPSAoYSArIGMpICsgKGIgKyBkKWk7Ci0gT2Rlam1vd2FuaWUgOiB6MSAtIHoyID0gKGEgLSBjKSArIChiIC0gZClpOwotIE1ub8W8ZW5pZSA6IHoxICogejIgPSAoYWMgLSBiZCkgKyAoYWQgKyBiYylpOwotIFNwcnplemVuaWUgOiB6MVMgPSBhIC0gYmk7Ci0gTW9kdcWCIDogfHp8ID0gfGEgKyBiaXwgPSBzcXJ0L3BpZXJ3aWFzdGVrIChhXjIgKyBiXjIpOwoqLwoKCi8vIGRvZGF3YW5pZSBsaWN6YiB6ZXNwb2xvbnljaCAgOgp6ZXNwb2wgemVzcF9kb2RhYyh6ZXNwb2wgejEsIHplc3BvbCB6MikKewogIHplc3BvbCB3eW5pazsKICB3eW5pay5yZWE9ejEucmVhK3oyLnJlYTsKICB3eW5pay5pbWE9ejEuaW1hK3oyLmltYTsKICByZXR1cm4gd3luaWs7Cn0KCi8vIG9kZWptb3dhbmllIGxpY3piIHplc3BvbG9ueWNoIDoKemVzcG9sIHplc3Bfb2RqYWMoemVzcG9sIHoxLCB6ZXNwb2wgejIpCnsKICB6ZXNwb2wgd3luaWs7CiAgd3luaWsucmVhPXoxLnJlYS16Mi5yZWE7CiAgd3luaWsuaW1hPXoyLmltYS16Mi5pbWE7CiAgcmV0dXJuIHd5bmlrOwp9CgovLyBtbm96ZW5pZSBsaWN6YiB6ZXNwb2xvbnljaCA6Cnplc3BvbCB6ZXNwX3JhenkoemVzcG9sIHoxLCB6ZXNwb2wgejIpCnsKICB6ZXNwb2wgd3luaWs7CiAgd3luaWsucmVhPXoxLnJlYSp6Mi5yZWEtejEuaW1hKnoyLmltYTsKICB3eW5pay5pbWE9ejEucmVhKnoyLmltYSt6MS5pbWEqejIucmVhOwogIHJldHVybiB3eW5pazsKfQoKLy8gbGljemJhIHNwcnplem9uYSBkbyBkYW5laiB6ZXNwb2xvbmVqIDoKemVzcG9sIHplc3Bfc3ByemV6KHplc3BvbCB6KQp7CiAgemVzcG9sIHd5bmlrOwogIHd5bmlrLmltYT0tei5pbWE7CiAgcmV0dXJuIHd5bmlrOwp9CgovLyB3YXJ0b3NjIGJlend6Z2xlZG5hIGxpY3pieSB6ZXNwb2xvbmVqICwgdHp3LiAibW9kdcWCIjoKZG91YmxlIHplc3BfYWJzKHplc3BvbCB6KQp7CiAgZG91YmxlIHd5bmlrOwogIHd5bmlrPXNxcnQoei5yZWEqei5yZWErei5pbWEqei5pbWEpOwogIHJldHVybiB3eW5pazsKfQoKCmludCBtYWluKCkKewogIHplc3BvbCB6MSwgejI7CiAgcHJpbnRmKCJaZXNwb2xvbmEgWjEgPT0gIik7IHoxID0gemVzcF9nZXQoKTsKICBwcmludGYoIlplc3BvbG9uYSBaMiA9PSAiKTsgejIgPSB6ZXNwX2dldCgpOwogIHByaW50ZigiXG5aMStaMiA9PSAiKTsgemVzcF9wcmludCh6ZXNwX2RvZGFjKHoxLCB6MikpOwogIHByaW50ZigiXG5aMS1aMiA9PSAiKTsgemVzcF9wcmludCh6ZXNwX29kamFjKHoxLCB6MikpOwogIHByaW50ZigiXG5aMSpaMiA9PSAiKTsgemVzcF9wcmludCh6ZXNwX3JhenkoejEsIHoyKSk7CiAgcHJpbnRmKCJcbnxaMStaMnwgPT0gJS40bGZcbiIsIHplc3BfYWJzKHplc3BfZG9kYWMoejEsIHoyKSkpOwogIHJldHVybiAwOwp9Cg==