i obiekty Programowanie i obiekty uzupełnienie notatek: dr Jerzy Białkowski
i obiekty 1 2 3 4
i obiekty Obiektowość języka C++ Na tym wykładzie poznamy: ˆ Klasa (w języku C++ rozszerzenie struktury, typ ), obiekt (instancja, zmienna ), konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie, ukrywanie informacji (public, protected, private, friend) ˆ Polimorfizm i metody wirtualne ˆ Dziedziczenie
i obiekty class NazwaKlasy { public: typ1 zmienna1; typ2 zmienna2; metoda1... private: typ1 zmienna3; typ2 zmienna4; metoda2... }; Klasa, obiekt, dostęp do danych Instancją jest obiekt: NazwaKlasy obiekt;.
i obiekty 1 #include <i o s t r e a m > 2 # include <cmath> 3 using namespace std ; 4 5 class Punkt { 6 7 private : 8 double x ; 9 double y ; 10 11 public : 12 double z ; 13 14 void setx ( double xx ) { 15 x = xx ; 16 } 17 18 void sety ( double yy ) { 19 y = yy ; 20 } 21 22
i obiekty 23 double getx ( ) { 24 return x ; 25 } 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 // cout << p1. x << e n d l ; Blad! 43 44 }
i obiekty this Wskaźnik this przechowuje adres do obiektu. void setx(double xx) { x = xx; }
i obiekty this Wskaźnik this przechowuje adres do obiektu. void setx(double xx) { x = xx; } void setx(double x) { this->x = x; }
i obiekty jest metodą wywoływaną w trakcie tworzenia każdego obiektu danej. ˆ ma identyczną nazwę jak nazwa, ˆ nie zwraca żadnej wartości, ˆ znajduje się w przestrzeni publicznej public:
i obiekty 1 #include <i o s t r e a m > 2 # include <cmath> 3 using namespace std ; 4 5 class Punkt { 6 7 private : 8 double x ; 9 double y ; 10 11 public : 12 13 Punkt ( ) { 14 this >x = 0 ; 15 this >y = 0 ; 16 } 17 18 Punkt ( double x, double y ) { 19 this >x = x ; 20 this >y = y ; 21 } 22
i obiekty 23 void setx ( double x ) { 24 this >x = x ; 25 } 26 void sety ( double y ) { 27 this >y = y ; 28 } 29 double getx ( ) { 30 return this >x ; 31 } 32 double gety ( ) { 33 return this >y ; 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 }
i obiekty kopiujący 1 Punkt p1, p2 ( 3. 1 4, 5. 3 4 ) ; 2 Punkt kopia_p2 ( p2 ) ; 3 4 cout << p1. getx ( ) << endl ; 5 cout << p2. getx ( ) << endl ; 6 cout << kopia_p2. getx ( ) << endl ;
i obiekty kopiujący 1 Punkt p1, p2 ( 3. 1 4, 5. 3 4 ) ; 2 Punkt kopia_p2 ( p2 ) ; 3 4 cout << p1. getx ( ) << endl ; 5 cout << p2. getx ( ) << endl ; 6 cout << kopia_p2. getx ( ) << endl ; Wynik: 0 3.14 3.14
i obiekty Wykonuje się w celu zwolnienia pamięci; następuje niszczenie obiektu danej. 1 Punkt p1, p2 ( 3. 1 4, 5. 3 4 ) ; 2 Punkt *p3 = new Punkt ( 7. 2, 4. 4 ) ; 3 4 cout << p1. getx ( ) << endl ; 5 cout << p2. getx ( ) << endl ; 6 cout << p3 >getx ( ) << endl ; 7 delete p3 ; // wywołujemy d e s t r u k t o r
i obiekty Wykonuje się w celu zwolnienia pamięci; następuje niszczenie obiektu danej. 1 Punkt p1, p2 ( 3. 1 4, 5. 3 4 ) ; 2 Punkt *p3 = new Punkt ( 7. 2, 4. 4 ) ; 3 4 cout << p1. getx ( ) << endl ; 5 cout << p2. getx ( ) << endl ; 6 cout << p3 >getx ( ) << endl ; 7 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.
i obiekty 1 #include <i o s t r e a m > 2 using namespace std ; 3 4 class Punkt { 5 6 private : 7 double x ; 8 double y ; 9 double * tab ; 10 11 public : 12 Punkt ( double x, double y ) { 13 this >x = x ; 14 this >y = y ; 15 tab = new double [ 1 0 ] ; 16 } 17 18 Punkt ( ) { 19 delete [ ] tab ; 20 cout << " " << this >x << endl ; 21 } 22 } ;
i obiekty 23 24 int main ( ) { 25 26 Punkt p2 ( 3. 1 4, 5. 3 4 ) ; 27 Punkt *p3 = new Punkt ( 7. 7, 4. 4 ) ; 28 29 delete p3 ; 30 31 }
i obiekty Metody Monte Carlo 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.
i obiekty ˆ 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.
i obiekty ˆ 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. ˆ Obliczenie całki b a f (x)dx (b a) Σn i=1 f (x i ) n, gdzie punkty x i są wylosowane z przedziału [a, b].
i obiekty 1 #include <i o s t r e a m > 2 #include <c s t d l i b > 3 # include <cmath> 4 using namespace std ; 5 6 class Punkt { 7 8 private : 9 double x, y ; 10 11 public : 12 13 Punkt ( ) ; 14 Punkt ( double x, double y ) ; 15 void losuj_wsp ( double a, double b, double c, double d ) ; 16 double dlugosc_wek ( ) ; 17 18 } ; 19 double losuj ( ) ; 20 double losuj ( double a, double b ) ; 21
i obiekty 22 int main ( ) { 23 24 srand ( time ( 0 ) ) ; 25 26 Punkt p ; 27 long n ; 28 cin >> n ; 29 long licznik =0; 30 31 for ( long i=0; i<n ; i++){ 32 p. losuj_wsp ( 1,1, 1,1) ; 33 if ( p. dlugosc_wek ( ) <= 1 ) 34 licznik++; 35 } 36 37 cout << "Wynik "<< 4* double ( licznik ) /double ( n ) << "\n" ; 38 cout << " Pi "<< M_PI << "\n" ; 39 40 }// main 41 42
i obiekty 43 Punkt : : Punkt ( ) { 44 this >x = 0 ; 45 this >y = 0 ; 46 } 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, 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
i obiekty 63 double losuj ( ) { 64 return rand ( ) /double ( RAND_MAX ) ; 65 } 66 double losuj ( double a, double b ) { 67 return ( b a ) *losuj ( ) +a ; 68 }
i obiekty Igła Buffona 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?
i obiekty 1 #include <i o s t r e a m > 2 #include <c s t d l i b > 3 # include <cmath> 4 using namespace std ; 5 6 class Punkt { 7 8 private : 9 double x, y ; 10 11 public : 12 Punkt ( ) ; 13 Punkt ( double x, double y ) ; 14 double getx ( ) ; 15 double gety ( ) ; 16 void losuj_wsp ( double a, double b, 17 double c, double d ) ; 18 double dlugosc_wek ( ) ; 19 } ; 20 21 double losuj ( ) ; 22 double losuj ( double a, double b ) ;
i obiekty 23 24 int main ( ) { 25 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
i obiekty 45 Punkt : : Punkt ( ) { 46 this >x = 0 ; 47 this >y = 0 ; 48 } 49 50 Punkt : : Punkt ( double x, double y ) { 51 this >x = x ; 52 this >y = y ; 53 } 54 55 double Punkt : : getx ( ) { 56 return this >x ; 57 } 58 double Punkt : : gety ( ) { 59 return this >y ; 60 } 61 62 void Punkt : : losuj_wsp ( double a, double b, 63 double c, double d ) { 64 this >x = losuj ( a, b ) ; 65 this >y = losuj ( c, d ) ; 66 }
i obiekty 67 68 double Punkt : : dlugosc_wek ( ) { 69 return sqrt ( this >x* this >x 70 + this >y* this >y ) ; 71 } 72 73 74 double losuj ( ) { 75 return rand ( ) /double ( RAND_MAX ) ; 76 } 77 78 double losuj ( double a, double b ) { 79 return ( b a ) *losuj ( ) +a ; 80 }
i obiekty Igła Buffona - wynik 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/
i obiekty Igła Buffona - wynik 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/ wynik 2 π.
i obiekty Zadania Zadanie Napisz program, który oblicza średnią odległość pomiędzy dwoma wylosowanymi punktami kwadratu [0, 1] [0, 1].
i obiekty Zadania Zadanie Napisz program, który oblicza średnią odległość pomiędzy dwoma wylosowanymi punktami kwadratu [0, 1] [0, 1]. Zadanie Napisz program, który dla danej wejściowej n oblicza sumę Ile wynosi Σ k=1 1 k 2? Σ n k=1 1 k 2.
i obiekty Zadania Zadanie Napisz program, który oblicza średnią odległość pomiędzy dwoma wylosowanymi punktami kwadratu [0, 1] [0, 1]. Zadanie Napisz program, który dla danej wejściowej n oblicza sumę Ile wynosi Σ k=1 1 k 2? Σ n k=1 1 k 2. Skorzystaj z Encyklopedii ciągów liczb całkowitych i postaw odpowiednie hipotezy.
i obiekty 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ą 1 gdzie punkty x i odpowiednio 0 Σn 4 dx 1 + x 2 1 są wylosowane z przedziału [0, 1], 4 i=1 1+xi 2 n 2 są wylosowane z przedziału [ i 1 n, i n ], 3 przyjmują wartość 2i 1 2n. Porównaj wyniki otrzymane przez te programy i czas działania tych programów.,
i obiekty 1 #include <i o s t r e a m > 2 #include <c s t d l i b > 3 # include <cmath> 4 #include <ctime> 5 using namespace std ; 6 7 class Losuj { 8 public : 9 Losuj ( ) { srand ( time ( 0 ) ) ; } 10 static double Wartosc ( ) { 11 return rand ( ) /double ( RAND_MAX ) ; 12 } 13 static double Wartosc ( double pocz, 14 double koniec ) { 15 return ( koniec pocz ) * Wartosc ( ) + pocz ; 16 } 17 } ; 18 19 class Funkcja { 20 private : 21 long iloscprobek ; 22 double dlugoscprzedzialu ;
i obiekty 23 24 public : 25 Funkcja ( ) { 26 iloscprobek = 1 ; 27 dlugoscprzedzialu = 1. 0 / iloscprobek ; 28 } 29 30 Funkcja ( long iloscprobek ) { 31 this >iloscprobek = iloscprobek ; 32 dlugoscprzedzialu = 1. 0 / iloscprobek ; 33 } 34 35 double Calka1 ( ) { 36 double t, pi =0.0; 37 for ( long i=0; i < iloscprobek ; i++) { 38 t = Losuj : : Wartosc ( ) ; 39 pi = pi + 4. 0 / ( 1. 0 + t*t ) ; 40 } 41 return pi* dlugoscprzedzialu ; 42 } 43 44
i obiekty 45 double Calka2 ( ) { 46 double t, pi =0.0; 47 for ( long i=0; i < iloscprobek ; i++) { 48 t = Losuj : : Wartosc ( dlugoscprzedzialu *i, 49 dlugoscprzedzialu *( i+1) ) ; 50 pi = pi + 4. 0 / ( 1. 0 + t*t ) ; 51 } 52 return pi* dlugoscprzedzialu ; 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
i obiekty 67 int main ( int argc, char * argv [ ] ) { 68 Funkcja f = Funkcja (1000) ; 69 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 }
i obiekty Dziękuję za uwagę.