Programowanie Obiektowew języku C++ Zadania L4 Mirosław Głowacki 1,2 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej i Modelowania 2 Uniwersytet im. Jana Kochanowskiego w Kielcach Wydział Matematyczno-Przyrodnmiczy Instytut Fizyki Zakład Informatyki Listopad 2016 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 1 / 19
Spis treści 1 Zadanie L4-1 2 Zadanie L4-2 3 Podpowiedzi do zadań L4 4 Przykładowe rozwiązanie zadania L4-1 5 Przykładowe rozwiązanie zadania L4-2 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 2 / 19
Zadanie L4-1 Zdefiniować klasę complex tak, aby program Code wygenerował strumień wyjściowy Output przedstawiony na następnym przeźroczu. Code complex sumcmplint(complex c, int i){ return complex(c.re() + static_cast<double>(i),c.im()); int main(){ complex c(-3., -2.), *pc = &c, cmpl = c; cout << c.modul() << endl; int i = 7; double d = 3.72; cout << sumcmplint(c, i) << endl; cout << sumcmplint(*pc, d) << endl; cout << sumcmplint(cmpl, c) << endl; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 3 / 19
Zadanie L4-1 Klasa liczb zespolonych complex powinna zawierać następujące pola prywatne: Pola klasy class complex{ static int lp; const int nrcmpl; double re, im; double *modul; ; Output 5 (4, -2) (0, -2) (-6, -2) Wskaźnik modul powinien pokazywać na obszar pamięci, gdzie zapiany jest moduł liczby, który powinien być zwracany przez funkcję Modul() o dostępie publicznym Pole lp jest licznikiem powstających liczb zespolonych. Pole nrcmpl jest numerem liczby. Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 4 / 19
Spis treści 1 Zadanie L4-1 2 Zadanie L4-2 3 Podpowiedzi do zadań L4 4 Przykładowe rozwiązanie zadania L4-1 5 Przykładowe rozwiązanie zadania L4-2 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 5 / 19
Zadanie L4-2 Rozszerzyć definicję klasy complex tak, aby pole nrcmpl, które jest zwracane przez funkcję NrCmpl() było typu const, a program i strumień były następujące: int main(){ complex c(-3., -2.), *pc = &c, cmpl = c; cout << "Nr obiektu cmpl: " << cmpl.nrcmpl() << endl; char chr = 'D'; bool b = true; cout << sumcmplint(chr, chr) << endl; cout << sumcmplint(b, b) << endl; cout << "Liczba utworzonych obiektow complex: " << complex::lp() << endl; return 0; Nr obiektu cmpl: 2 (136, 0) (2, 0) Liczba utworzonych obiektow complex: 6 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 6 / 19
Spis treści 1 Zadanie L4-1 2 Zadanie L4-2 3 Podpowiedzi do zadań L4 4 Przykładowe rozwiązanie zadania L4-1 5 Przykładowe rozwiązanie zadania L4-2 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 7 / 19
Podpowiedzi do zadań L4 Instrukcja: complex c(-3., -2.), *pc = &c, cmpl = c; wymaga zdefiniowania konstruktora kopiującego do utworzenia obiektu cmpl, wskaźnik pc pobiera adres c bez udziału żadnego z konstruktorów. Instrukcja: cout << sumcmplint(c, i) << endl; nie wymaga żadnych konwersji - parametry aktualne c i i dokładnie pasują do formalnych. Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 8 / 19
Podpowiedzi do zadań L4 Instrukcja: cout << sumcmplint(*pc, d) << endl; pierwszy z parametów *pc dokładnie pasuje do formalnego. drugi z parametrów wymaga konwersji z typu double na typ int - konwersje dla typów wbudowanych są jednak predefiniowane. Instrukcja: cout << sumcmplint(cmpl, c) << endl; wymaga konwersji drugiego z parametrów z typu complex na typ int - potrzebny jest operator konwersji w klasie complex pierwszy parametr jest zgodny z formalnym. Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 9 / 19
Podpowiedzi do zadań L4 Instrukcje: cout << sumcmplint(chr, chr) << endl; cout << sumcmplint(b, b) << endl; wymagają utworzenia konstruktorów konwertujących: char complex oraz bool complex konwersje: char int oraz bool int są predefiniowane. Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 10 / 19
Spis treści 1 Zadanie L4-1 2 Zadanie L4-2 3 Podpowiedzi do zadań L4 4 Przykładowe rozwiązanie zadania L4-1 5 Przykładowe rozwiązanie zadania L4-2 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 11 / 19
Przykładowe rozwiązanie zadania L4-1/1 #include <iostream> #include <cmath> using namespace std; class complex{ double re, im; double *modul; public: complex(double r = 0, double i = 0.); complex(const complex& wzor); operator int(){return static_cast<int>(re); double Re(){return re; double Im(){return im; ; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 12 / 19
Przykładowe rozwiązanie zadania L4-1/2 complex::complex(double r, double i): re(r), im(i){ modul = new double; *modul = sqrt(re*re + im*im); complex::complex(const complex& wzor){ re = wzor.re; im = wzor.im; modul = new double; *modul = *wzor.modul; complex sumcmplint(complex c, int i){ return complex(c.re() + static_cast<double>(i),c.im()); ostream& operator<<(ostream& str, complex c){ return str << "(" << c.re() << ", " << c.im() << ")"; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 13 / 19
Przykładowe rozwiązanie zadania L4-1/3 int main(){ complex c(-3., -2.), *pc = &c, cmpl = c; int i = 7; double d = 3.72; cout << sumcmplint(c, i) << endl; cout << sumcmplint(*pc, d) << endl; cout << sumcmplint(cmpl, c) << endl; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 14 / 19
Spis treści 1 Zadanie L4-1 2 Zadanie L4-2 3 Podpowiedzi do zadań L4 4 Przykładowe rozwiązanie zadania L4-1 5 Przykładowe rozwiązanie zadania L4-2 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 15 / 19
Przykładowe rozwiązanie zadania L4-2/1 #include <iostream> #include <cmath> using namespace std; class complex{ static int lp; const int nrcmpl; double re, im; double *modul; public: complex(double r = 0, double i = 0.); complex(const complex& wzor); complex(char chr): re(static_cast<double>(chr)), im(0.), nrcmpl(++lp){ complex(bool b); static int LP(){return lp; operator int(){return static_cast<int>(re); Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 16 / 19
Przykładowe rozwiązanie zadania L4-2/2 double Re(){return re; double Im(){return im; double NrCmpl(){return nrcmpl; double Modul(){return *modul; ; int complex::lp; complex::complex(double r, double i): re(r), im(i), nrcmpl(++lp){ modul = new double; *modul = sqrt(re*re + im*im); complex::complex(const complex& wzor):nrcmpl(++lp){ re = wzor.re; im = wzor.im; modul = new double; *modul = *wzor.modul; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 17 / 19
Przykładowe rozwiązanie zadania L4-2/3 complex::complex(bool b): nrcmpl(++lp){ if(b) re = 1.; else re = 0; im = 0.; complex sumcmplint(complex c, int i){ return complex(c.re() + static_cast<double>(i),c.im()); ostream& operator<<(ostream& str, complex c){ return str << "(" << c.re() << ", " << c.im() << ")"; int main(){ complex c(-3., -2.), *pc = &c, cmpl = c; cout << "Nr obiektu cmpl: " << cmpl.nrcmpl() << endl; char chr = 'D'; bool b = true; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 18 / 19
Przykładowe rozwiązanie zadania L4-2/4 cout << sumcmplint(chr, chr) << endl; cout << sumcmplint(b, b) << endl; cout << "Liczba utworzonych obiektow complex: " << complex::lp() << endl; return 0; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 19 / 19