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ę.