Programowanie C/C++ Jezyk C++ klasy i obiekty wykład V
Transkrypt
Programowanie C/C++ Jezyk C++ klasy i obiekty wykład V
Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Programowanie C/C++ Język C++ klasy i obiekty wykład V Przykłady Wnioski Wnioski dr Jarosław Mederski uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy 1 Język C++ - klasy Konstruktor Destruktor Konstruktor Destruktor Przykłady 2 Przykłady Wnioski Wnioski 3 Wnioski 4 Wnioski Programowanie C/C++ Język C++ klasy i obiekty wykład V Obiektowość języka C++ dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Na tym wykładzie poznamy: Klasa (w języku C++ rozszerzenie struktury, „typ”), obiekt (instancja klasy, „zmienna”), konstruktory i destruktory Enkapsulacja - kapsułkowanie, ukrywanie informacji (public, protected, private, friend) Polimorfizm i metody wirtualne Dziedziczenie Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Klasa, obiekt, dostęp do danych class NazwaKlasy { public: typ1 zmienna1; typ2 zmienna2; metoda1 ... Wnioski Wnioski private: typ1 zmienna3; typ2 zmienna4; metoda2 ... }; Instancją klasy jest obiekt: NazwaKlasy obiekt;. Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # include <i o s t r e a m > # include <cmath> using namespace std ; class Punkt { private : double x ; double y ; public : double z ; void setX ( double xx ) { x = xx ; } void setY ( double yy ) { y = yy ; } Programowanie 23 C/C++ 24 Język C++ klasy i obiekty 25 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski double getX ( ) { return x ; } 26 27 double getY ( ) { 28 return y ; 29 } 30 } ; 31 32 33 int main ( ) { 34 35 Punkt p1 ; 36 37 p1 . setX ( 3 . 1 4 ) ; 38 p1 . setY ( 1 . 1 4 ) ; 39 p1 . z = . 0 ; 40 41 cout << p1 . getX ( ) << endl ; 42 // c o u t << p1 . x << e n d l ; B la d ! 43 44 } Programowanie C/C++ Język C++ klasy i obiekty wykład V this dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Wskaźnik this przechowuje adres do obiektu. void setX(double xx) { x = xx; } Programowanie C/C++ Język C++ klasy i obiekty wykład V this dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wskaźnik this przechowuje adres do obiektu. void setX(double xx) { x = xx; } Wnioski void setX(double x) { this->x = x; } Programowanie C/C++ Język C++ klasy i obiekty wykład V Konstruktor dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Konstruktor jest metodą wywoływaną w trakcie tworzenia każdego obiektu danej klasy. Konstruktor ma identyczną nazwę jak nazwa klasy, nie zwraca żadnej wartości, znajduje się w przestrzeni publicznej klasy public: Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # include <i o s t r e a m > # include <cmath> using namespace std ; class Punkt { private : double x ; double y ; public : Punkt ( ) { this−>x = 0 ; this−>y = 0 ; } Punkt ( double x , double y ) { this−>x = x ; this−>y = y ; } Programowanie 23 C/C++ 24 Język C++ klasy i obiekty 25 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski void setX ( double x ) { this−>x = x ; } void setY ( double y ) { this−>y = y ; } double getX ( ) { return this−>x ; } double getY ( ) { return this−>y ; } 26 27 28 29 30 31 32 33 34 35 } ; 36 37 int main ( ) { 38 39 Punkt p1 , p2 ( 3 . 1 4 , 5 . 3 4 ) ; 40 41 cout << p1 . getX ( ) << endl ; 42 cout << p2 . getX ( ) << endl ; 43 44 } Programowanie C/C++ Język C++ klasy i obiekty wykład V Konstruktor kopiujący dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 Punkt p1 , p2 ( 3 . 1 4 , 5 . 3 4 ) ; Punkt kopia_p2 ( p2 ) ; cout << p1 . getX ( ) << endl ; cout << p2 . getX ( ) << endl ; cout << kopia_p2 . getX ( ) << endl ; Programowanie C/C++ Język C++ klasy i obiekty wykład V Konstruktor kopiujący dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 Punkt p1 , p2 ( 3 . 1 4 , 5 . 3 4 ) ; Punkt kopia_p2 ( p2 ) ; cout << p1 . getX ( ) << endl ; cout << p2 . getX ( ) << endl ; cout << kopia_p2 . getX ( ) << endl ; Wynik: 0 3.14 3.14 Programowanie C/C++ Język C++ klasy i obiekty wykład V Destruktor dr Jarosław Mederski Wykonuje się w celu zwolnienia pamięci; następuje niszczenie obiektu danej klasy. Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 7 Punkt p1 , p2 ( 3 . 1 4 , 5 . 3 4 ) ; Punkt * p3 = new Punkt ( 7 . 2 , 4 . 4 ) ; cout << p1 . getX ( ) << endl ; cout << p2 . getX ( ) << endl ; cout << p3−>getX ( ) << endl ; delete p3 ; // wywołujemy d e s t r u k t o r Programowanie C/C++ Język C++ klasy i obiekty wykład V Destruktor dr Jarosław Mederski Wykonuje się w celu zwolnienia pamięci; następuje niszczenie obiektu danej klasy. Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 7 Punkt p1 , p2 ( 3 . 1 4 , 5 . 3 4 ) ; Punkt * p3 = new Punkt ( 7 . 2 , 4 . 4 ) ; cout << p1 . getX ( ) << endl ; cout << p2 . getX ( ) << endl ; cout << p3−>getX ( ) << endl ; delete p3 ; // wywołujemy d e s t r u k t o r Zasady tworzenia destruktora są podobne do konstruktora. Nazwa destruktora zaczyna się od ~ i nazwy klasy. Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # include <i o s t r e a m > using namespace std ; class Punkt { private : double x ; double y ; double * tab ; public : Punkt ( double x , double y ) { this−>x = x ; this−>y = y ; tab = new double [ 1 0 ] ; } ˜ Punkt ( ) { delete [ ] tab ; cout << " Destruktor " << this−>x << endl ; } }; Programowanie 23 C/C++ 24 Język C++ klasy i obiekty 25 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski int main ( ) { 26 Punkt p2 ( 3 . 1 4 , 5 . 3 4 ) ; 27 Punkt * p3 = new Punkt ( 7 . 7 , 4 . 4 ) ; 28 29 delete p3 ; 30 31 } Programowanie C/C++ Język C++ klasy i obiekty wykład V Metody Monte Carlo dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski „Stosowana do modelowania matematycznego procesów zbyt złożonych (obliczania całek, łańcuchów procesów statystycznych), aby można było przewidzieć ich wyniki za pomocą podejścia analitycznego. Istotną rolę w metodzie MC odgrywa losowanie (wybór przypadkowy) wielkości charakteryzujących proces, przy czym losowanie dokonywane jest zgodnie z rozkładem, który musi być znany.” - Źródło: Wikipedia. Programowanie C/C++ Język C++ klasy i obiekty wykład V Przykłady dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Obliczenie liczby π - losowanie punktów z kwadratu [−1, 1] × [−1, 1] i zliczenie punktów w kole jednostkowym o środku (0, 0). Prawdopodobieńswo wylosowania punktu z koła wynosi π4 . Programowanie C/C++ Język C++ klasy i obiekty wykład V Przykłady dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Obliczenie liczby π - losowanie punktów z kwadratu [−1, 1] × [−1, 1] i zliczenie punktów w kole jednostkowym o środku (0, 0). Prawdopodobieńswo wylosowania punktu z koła wynosi π4 . R Σn f (x ) Obliczenie całki ab f (x)dx ≈ (b − a) i=1n i , gdzie punkty xi są wylosowane z przedziału [a, b]. Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # include <i o s t r e a m > # include < c s t d l i b > # include <cmath> using namespace std ; class Punkt { private : double x, y; public : Punkt ( ) ; Punkt ( double x , double y ) ; void losuj_wsp ( double a , double b , double c , ←double d ) ; double dlugosc_wek ( ) ; 16 17 18 } ; 19 double losuj ( ) ; 20 double losuj ( double a , double b ) ; 21 Programowanie 22 C/C++ 23 Język C++ klasy i obiekty 24 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 25 26 27 28 29 30 31 32 33 34 35 36 37 int main ( ) { srand ( time ( 0 ) ) ; Punkt p ; long n ; cin >> n ; long licznik =0; for ( long i=0; i<n ; i++){ p . losuj_wsp ( −1 ,1 , −1 ,1) ; if ( p . dlugosc_wek ( ) <= 1 ) licznik++; } cout << " Wynik "<< 4 * double ( licznik ) / double ( n ) ←<< "\n" ; 38 cout << "Pi "<< M_PI << "\n" ; 39 40 } // main 41 42 Punkt : : Punkt ( ) { this−>x = 0 ; this−>y = 0 ; 46 } Programowanie 43 C/C++ 44 Język C++ klasy i obiekty 45 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady 47 48 Punkt : : Punkt ( double x , double y ) { 49 this−>x = x ; 50 this−>y = y ; 51 } 52 53 void Punkt : : losuj_wsp ( double a , double b , ←- Wnioski Wnioski double c , double d ) { 54 this−>x = losuj ( a , b ) ; 55 this−>y = losuj ( c , d ) ; 56 } 57 58 double Punkt : : dlugosc_wek ( ) { 59 return sqrt ( this−>x * this−>x + this−>y * this←- −>y ) ; 60 } 61 62 double losuj ( ) { return rand ( ) / double ( RAND_MAX ) ; } 66 double losuj ( double a , double b ) { 67 return ( b−a ) * losuj ( ) +a ; 68 } Programowanie 63 C/C++ 64 Język C++ klasy i obiekty 65 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Programowanie C/C++ Język C++ klasy i obiekty wykład V Igła Buffona dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Rzucamy igłę długości 1 na podłogę pomalowaną w cienkie paski oddalone od siebie o 1. Jakie jest prawdopodobieństwo, że igła przetnie pasek na podłodze? Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # include <i o s t r e a m > # include < c s t d l i b > # include <cmath> using namespace std ; class Punkt { private : double x, y; public : Punkt ( ) ; Punkt ( double x , double y ) ; double getX ( ) ; double getY ( ) ; void losuj_wsp ( double a , double b , double c , double d ) ; double dlugosc_wek ( ) ; }; double losuj ( ) ; double losuj ( double a , double b ) ; Programowanie 23 C/C++ 24 Język C++ klasy i obiekty 25 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski int main ( ) { 26 srand ( time ( 0 ) ) ; 27 28 Punkt p ; 29 long n ; 30 cin >> n ; 31 long licznik =0; 32 33 for ( long i=0; i<n ; i++){ 34 p . losuj_wsp ( 0 , 1 , 0 , 2 * M_PI ) ; 35 if ( floor ( p . getX ( ) ) 36 != floor ( p . getX ( )+cos ( p . getY ( ) ) ) ) 37 licznik++; 38 } 39 40 cout << " Wynik " 41 << double ( licznik ) / double ( n ) << "\n" ; 42 43 } // main 44 Punkt : : Punkt ( ) { this−>x = 0 ; this−>y = 0 ; 48 } Programowanie 45 C/C++ 46 Język C++ klasy i obiekty 47 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 Punkt : : Punkt ( double x , double y ) { this−>x = x ; this−>y = y ; } double Punkt : : getX ( ) { return this−>x ; } double Punkt : : getY ( ) { return this−>y ; } void Punkt : : losuj_wsp ( double a , double b , double c , double d ) { this−>x = losuj ( a , b ) ; this−>y = losuj ( c , d ) ; } Programowanie 67 C/C++ 68 Język C++ klasy i obiekty 69 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski double Punkt : : dlugosc_wek ( ) { return sqrt ( this−>x * this−>x 70 + this−>y * this−>y ) ; 71 } 72 73 74 75 76 77 78 79 80 double losuj ( ) { return rand ( ) / double ( RAND_MAX ) ; } double losuj ( double a , double b ) { return ( b−a ) * losuj ( ) +a ; } Programowanie C/C++ Język C++ klasy i obiekty wykład V Igła Buffona - wynik dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Wykonując 1000 000 000 pętli otrzymujemy wynik 0.636608. Ciąg liczb 6, 3, 6, 6, 1 sprawdzamy w Encyklopedii ciągów liczb całkowitych: http://www.research.att.com/~njas/sequences/ Programowanie C/C++ Język C++ klasy i obiekty wykład V Igła Buffona - wynik dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wykonując 1000 000 000 pętli otrzymujemy wynik 0.636608. Ciąg liczb 6, 3, 6, 6, 1 sprawdzamy w Encyklopedii ciągów liczb całkowitych: http://www.research.att.com/~njas/sequences/ Wnioski wynik ≈ 2 . π Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Zadania Zadanie Napisz program, który oblicza średnią odległość pomiędzy dwoma wylosowanymi punktami kwadratu [0, 1] × [0, 1]. Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Zadania Zadanie Napisz program, który oblicza średnią odległość pomiędzy dwoma wylosowanymi punktami kwadratu [0, 1] × [0, 1]. Konstruktor Destruktor Przykłady Zadanie Napisz program, który dla danej wejściowej n oblicza sumę Wnioski Wnioski Σnk=1 1 Ile wynosi Σ∞ k=1 k 2 ? 1 . k2 Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Zadania Zadanie Napisz program, który oblicza średnią odległość pomiędzy dwoma wylosowanymi punktami kwadratu [0, 1] × [0, 1]. Konstruktor Destruktor Przykłady Zadanie Napisz program, który dla danej wejściowej n oblicza sumę Wnioski Wnioski Σnk=1 1 . k2 1 Ile wynosi Σ∞ k=1 k 2 ? Skorzystaj z Encyklopedii ciągów liczb całkowitych i postaw odpowiednie hipotezy. Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Uwaga Nie zawsze użycie metody Monte Carlo jest korzystne pod względem czasu działania lub dokładności wyniku. Zadanie Napisz trzy programy, który obliczają całkę oznaczoną Konstruktor Destruktor Z 1 Przykłady Wnioski 0 4 Σni=1 1+x 2 4 i dx ≈ , 1 + x2 n Wnioski gdzie punkty xi odpowiednio 1 są wylosowane z przedziału [0, 1], 2 i są wylosowane z przedziału [ i−1 n , n ], 3 przyjmują wartość 2i−1 2n . Porównaj wyniki otrzymane przez te programy i czas działania tych programów. Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # include <i o s t r e a m > # include < c s t d l i b > # include <cmath> # include <c t i m e > using namespace std ; class Losuj { public : Losuj ( ) { srand ( time ( 0 ) ) ; } static double Wartosc ( ) { return rand ( ) / double ( RAND_MAX ) ; } static double Wartosc ( double pocz , double koniec ) { return ( koniec−pocz ) * Wartosc ( ) + pocz ; } }; class Funkcja { private : long iloscProbek ; double dlugoscPrzedzialu ; Programowanie 23 C/C++ 24 Język C++ klasy i obiekty 25 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski public : Funkcja ( ) { 26 iloscProbek = 1 ; 27 dlugoscPrzedzialu = 1 . 0 / iloscProbek ; 28 } 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 Funkcja ( long iloscProbek ) { this−>iloscProbek = iloscProbek ; dlugoscPrzedzialu = 1 . 0 / iloscProbek ; } double Calka1 ( ) { double t , pi = 0 . 0 ; for ( long i=0; i < iloscProbek ; i++) { t = Losuj : : Wartosc ( ) ; pi = pi + 4 . 0 / ( 1 . 0 + t * t ) ; } return pi * dlugoscPrzedzialu ; } Programowanie 45 C/C++ 46 Język C++ klasy i obiekty 47 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski double Calka2 ( ) { double t , pi = 0 . 0 ; for ( long i=0; i < iloscProbek ; i++) { t = Losuj : : Wartosc ( dlugoscPrzedzialu * i , dlugoscPrzedzialu * ( i+1) ) ; pi = pi + 4 . 0 / ( 1 . 0 + t * t ) ; } return pi * dlugoscPrzedzialu ; } 48 49 50 51 52 53 54 55 double Calka3 ( ) { 56 double t , pi =0.0 , w ; 57 w = 1 . 0 / iloscProbek ; 58 for ( long i=0; i < iloscProbek ; i++) { 59 t = (i + 0.5) * w ; 60 pi = pi + 4 . 0 / ( 1 . 0 + t * t ) ; 61 } 62 return pi * w ; 63 } 64 } ; 65 66 Programowanie 67 C/C++ 68 Język C++ klasy i obiekty 69 wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski int main ( int argc , char * argv [ ] ) { Funkcja f = Funkcja ( 1 0 0 0 ) ; 70 cout << " Calka liczona pierwsza metoda " 71 << f . Calka1 ( ) << endl ; 72 cout << " Calka liczona druga metoda " 73 << f . Calka2 ( ) << endl ; 74 cout << " Calka liczona trzecia metoda " 75 << f . Calka3 ( ) << endl ; 76 } Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ klasy Konstruktor Destruktor Przykłady Wnioski Wnioski Dziękuję za uwagę.