Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.

Podobne prezentacje


Prezentacja na temat: "Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi."— Zapis prezentacji:

1 Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka

2 int, int*, int** int a=1; int *w=&a; int **ww=&w; cout<<&ww<

3 void f1(int), void f3(int*), void f5(int**) void f2(int&), void f4(int*&), void f6(int**&) void f1(int fa){} int main() { int a=1; int *w=&a; int **ww=&w; f1(a); return 0; } 0043F8CC 0043F8CF 0043F8D0 0043F8D3 0043F8D4 0043F8D7 0043F8D8 0043F8DB a w ww fa F8CC 0043F8D0 1 Nie możemy zmienić: a, w, ww Możemy zmienić:

4 void f1(int), void f3(int*), void f5(int**) void f2(int&), void f4(int*&), void f6(int**&) void f2(int &fa){} int main() { int a=1; int *w=&a; int **ww=&w; f2(a); return 0; } 0043F8CC 0043F8CF 0043F8D0 0043F8D3 0043F8D4 0043F8D7 a w ww F8CC 0043F8D0 fa Nie możemy zmienić: w, ww Możemy zmienić: a

5 void f1(int), void f3(int*), void f5(int**) void f2(int&), void f4(int*&), void f6(int**&) void f3(int *fw){} int main() { int a=1; int *w=&a; int **ww=&w; f3(w); return 0; } 0043F8CC 0043F8CF 0043F8D0 0043F8D3 0043F8D4 0043F8D7 0043F8D8 0043F8DB a w ww fw F8CC 0043F8D0 0043f8CC Nie możemy zmienić: w, ww Możemy zmienić: a

6 void f1(int), void f3(int*), void f5(int**) void f2(int&), void f4(int*&), void f6(int**&) void f4(int *&fw){} int main() { int a=1; int *w=&a; int **ww=&w; f4(w); return 0; } 0043F8CC 0043F8CF 0043F8D0 0043F8D3 0043F8D4 0043F8D7 a w ww F8CC 0043F8D0 fw Nie możemy zmienić: ww Możemy zmienić: a, w

7 void f(int), void f(int*), void f(int**) void f(int&), void f(int*&), void f(int**&) void f5(int **fww){} int main() { int a=1; int *w=&a; int **ww=&w; f5(ww); return 0; } 0043F8CC 0043F8CF 0043F8D0 0043F8D3 0043F8D4 0043F8D7 0043F8D8 0043F8DB a w ww fww F8CC 0043F8D0 Nie możemy zmienić: ww Możemy zmienić: a, w

8 void f(int), void f(int*), void f(int**) void f(int&), void f(int*&), void f(int**&) void f6(int **&fww){} int main() { int a=1; int *w=&a; int **ww=&w; f6(ww); return 0; } 0043F8CC 0043F8CF 0043F8D0 0043F8D3 0043F8D4 0043F8D7 a w ww F8CC 0043F8D0fww Nie możemy zmienić: Możemy zmienić: a, w, ww

9 Możliwe wywołania funkcji int a=1; int *w=&a; int **ww=&w; void f1(int); void f2(int&); void f3(int*); void f4(int*&); void f5(int**); void f6(int**&); f1(a);f1(*w);f1(**ww); int a;int *w;int **ww; f2(a);f2(*w);f2(**ww); f3(&a);f3(w);f3(*ww); --f4(w);f4(*ww); --f5(&w);f5(ww); -- f6(ww); 0043F8CC 0043F8CF 0043F8D0 0043F8D3 0043F8D4 0043F8D7 a w ww F8CC 0043F8D0

10 Wskaźnik do funkcji Funkcję można wywołać lub można pobrać jej adres (miejsce, gdzie jej kod zaczyna się w pamięci). W wyniku wywołania zaczyna się wykonywać kod tej funkcji: q = fun(x, 7); W wyniku pobrania adresu funkcji uzyskuje się wskaźnik do tej funkcji: pfun = &fun; Wskaźnika tego można użyć do wywołania funkcji: q = (*pfun)(x, 7)

11 Wskaźnik do funkcji Definicja: –funkcji fun typu T (T1, T2,...): T fun(T1, T2,...) {... } –wskaźnika pf (do tej funkcji) typu T (*)(T1, T2,...): T (*pf)(T1, T2,...); int (*pf)(double, char); Ustawienie (dwa alternatywne sposoby): pf = fun; pf = &fun; Użycie (wywołanie funkcji przez wskaźnik): int res; double x=0.5; char y=a; res = (*pf)(x, y); res = pf(x, y);

12 Wskaźnik do funkcji #include using namespace std; int podwoj(int a); int potroj(int a); int main() { int a, (*fun)(int a); a=10; fun=podwoj; cout << (*fun)(a) << endl; fun=potroj; cout << (*fun)(a) << endl; cout << a << endl; return 0; } int podwoj(int a) { return (a*2); } int potroj(int a) { return (a*3); }

13 Wskaźnik do funkcji #include using namespace std; int f(int a); void fun(int (*)(int),int); int main() { int (*w)(int)=&f; fun(w,5); return 0; } int f(int a) { return 2*a; } void fun(int (*wf)(int), int a) { cout<

14 Czytanie deklaracji 1.Zaczynamy od nazwy. 2.Następnie poruszamy się w prawo. 3.Gdy napotkamy na nawias zamykający poruszamy się w lewo. 4.Jeżeli odczytaliśmy już wszystko w obrębie danego nawiasu wychodzimy na zewnątrz i znowu poruszamy się w prawo.

15 Co to jest a??? int *(*(*a)(int))[10]; int *(*(*a)(int))[10 a jest ]; int *(*(*a)(int))[10]; wskaźnikiem int *(*(*a)(int))[10]; do funkcji wywoływanej z parametrem typu int int *(*(*a)(int))[10]; zwracającej wskaźnik int *(*(*a)(int))[10]; do 10-cio elementowej tablicy int *(*(*a)(int))[10]; wskaźników do obiektów typu int

16 Co to jest a??? int (*(*a())[10])(); int (*(*a())[10])(); a jest funkcją wywoływaną bez parametrów int (*(*a())[10])(); zwracającą wskaźnik int (*(*a())[10])(); do 10-cio elementowej tablicy int (*(*a())[10])(); wskaźników int (*(*a())[10])(); do funkcji wywoływanych bez parametrów int (*(*a())[10])(); zwracających obiekty typu int

17 Co to jest a??? float (*(*a)(int))(); float (*(*a)(int))(); a jest float (*(*a)(int))(); wskaźnikiem float (*(*a)(int))(); do funkcji wywoływanej z parametrem typu int float (*(*a)(int))(); zwracającej wskaźnik float (*(*a)(int))(); do funkcji wywoływanej bez parametrów float (*(*a)(int))(); zwracających obiekty typu float

18 Co to jest a??? int (*(*(*a)())[10])(); int (*(*(*a)())[10])(); a jest int (*(*(*a)())[10])(); wskaźnikiem int (*(*(*a)())[10])(); do funkcji wywoływanej bez parametrów int (*(*(*a)())[10])(); zwracającej wskaźnik int (*(*(*a)())[10])(); do 10-cio elementowej tablicy int (*(*(*a)())[10])(); wskaźników int (*(*(*a)())[10])(); do funkcji wywoływanych bez parametrów int (*(*(*a)())[10])(); zwracających obiekty typu int

19 Wskaźnik do funkcji jako argument innej funkcji #include using namespace std; double dod (double a, double b){return (a+b);} double ode (double a, double b){return (a-b);} double mno (double a, double b){return (a*b);} double dzi (double a, double b){return (a/b);} double wykonaj(double (*)(double, double),double,double); int main() { int wybor; double a,b; cout << "Wybierz dzialanie\n"; cout << "1.Dodawanie\n2.Odejmowanie\n"; cout << "3.Mnozenie\n4.Dzielenie\n"; cin >> wybor; cout << "Podaj dwie liczby\n"; cin >> a >> b; double (*wsk[4])(double, double)={dod, ode, mno, dzi}; cout<

20 Arytmetyka wskaźników Rezultat zastosowania do wskaźników operatorów arytmetycznych +, -, +=, -=, ++ i -- zależy od typu wskazywanego obiektu. Stosując operator arytmetyczny do wskaźnika p typu T* zakładamy, że p wskazuje na element w tablicy obiektów typu T. Wtedy: –p + 1 oznacza adres następnego elementu w tablicy, –p - 1 oznacza adres poprzedniego elementu w tablicy, –p + i oznacza adres i-tego następnego elementu, –p - i oznacza adres i-tego poprzedniego elementu

21 Arytmetyka wskaźników #include using namespace std; int main() { int tab[]={0,1,2,3,4}; int *wsk1,*wsk2; wsk1=&tab[1]; wsk2=&tab[4]; cout << wsk2-wsk1 << endl; return 0; } 3

22 Arytmetyka wskaźników int main() { int tab[5]={1,2,3,4,5}; int *wsk; wsk=tab; for (int i=0;i<5;i++) { cout<<*wsk<<"\t"<

23 Porównywanie wskaźników Dwa wskaźniki tego samego typu są równe (różne) jeżeli pokazują (nie pokazują) na ten sam obiekt: int *wsk1,*wsk2; if (wsk1==wsk2){}//ten sam obiekt if (wsk1!=wsk2){}//różne obiekty Porównywanie wskaźników operatorami, = ma sens tylko wtedy, gdy oba wskaźniki wskazują na elementy tej samej tablicy. Wtedy, jeżeli w1 < w2, to oznacza to, że obiekt wskazywany przez w1 znajduje się w pamięci wcześniej niż drugi (w1 jest bliżej początku tablicy niż w2).

24 Wskaźniki i const zwykły wskaźnik: int *wsk; stały wskaźnik int * const wsk; wskaźnik do obiektu stałego const int * wsk; stały wskaźnik do stałego obiektu const int * const wsk;

25 Stały wskaźnik #include using namespace std; int main() { int a=5,b=10; int * const w=&a; cout << *w << endl; (*w)++; cout << *w << endl; w=&b; return 0; } 5 6 BŁĄD

26 Wskaźnik do obiektu stałego int main() { const int a=5,b=10; const int *st_w; int *zm_w; st_w=&a; cout << *st_w << endl; st_w=&b; cout << *st_w << endl; (*st_w)++; zm_w=&a; return 0; } 5 10 BŁĄD

27 Stały wskaźnik do stałego obiektu int main() { const int a=5,b=10; const int * const st_w=&a; cout << *st_w << endl; (*st_w)++; st_w=&b; return 0; } 5 BŁĄD

28 Wskaźnik typu void int main() { int ti[]={1,2,3,4},*wi; double td[]={1.0,2.0,3.0,4.0},*wd; void *wv; wi=ti; wd=td; wv=wi; cout<<*wv<

29 Operatory rzutowania int main() { double d=2.5; int i; i=d; cout << d << endl << i << endl; return 0; } conversion from 'double' to 'int', possible loss of data 2.5 2

30 Operatory rzutowania int main() { double d=2.5; int i; i=(int)d;// lub i=int(d) cout << d << endl << i << endl; return 0; } 2.5 2

31 Operatory rzutowania int main() { int i=65; char c; c=(char)i; cout << i << endl << c << endl; return 0; } 65 A

32 Nowe operatory rzutowania 1.Stare operatory rzutowania: –(nazwa_typu)wyrażenie –nazwa_typu (wyrażenie) 2.Nowe operatory rzutowania: –static_cast (wyrażenie) –const_cast (wyrażenie) –dynamic_cast (wyrażenie) –reinterpret_cast (wyrażenie)

33 static_cast Operator static_cast jest używany do wszystkich konwersji, które są dobrze zdefiniowane i mogą być wykonane przez kompilator (mogą powodować ostrzeżenia), np.: –konwersje roszerzające (np. int -> float, int -> long), –konwersje zawężające (utrata informacji, np. float -> int),

34 static_cast int main() { double d=3.14; int i; i=static_cast (d); cout << d << endl << i << endl; return 0; }

35 const_cast Używany do konwersji typu: –const -> non-const –volatile -> non-volatile Używany TYLKO do konwersji tego typu – jeżeli równocześnie konieczna jest inna konwersja, musi być ona wykonana za pomocą oddzielnego operatora. Nie może być użyty do bezpośredniej konwersji obiektu const na non-const.

36 const_cast int main() { const int a=2; const int *st_w=&a; int *zm_w; cout<

37 dynamic_cast dynamic_cast robi rzutowanie tylko pod warunkiem, że w danej konkretnej chwili ma to sens.

38 dynamic_cast class pojazd { protected: int l_kol, max_sp; public: pojazd(int a,int b):l_kol(a),max_sp(b){} virtual void wypisz(); }; class samochod: public pojazd { double poj_s; public: samochod(int a,int b,double c):pojazd(a,b), poj_s(c){} void wypisz(); }; class rower: public pojazd { int li_prze; public: rower(int a, int b, int c):pojazd(a,b), li_prze(c){} void wypisz(); }; int main() { pojazd P(2,30),*WP; samochod S(4,180,1.9),*WS; rower R(2,30,21); char a; cout<<"S czy R\n"; cin>>a; if (a=='S') WP=&S; else WP=&R; WS=dynamic_cast (WP); cout<<&S<

39 reinterpret_cast Jest to najmniej bezpieczny mechanizm rzutowania, mogący powodować błędy. Traktuje obiekty jak pewien zestaw bitów, nie zwraca uwagi na znaczenie.

40 reinterpret_cast int main() { int ti[]={1,2,3,4},*wi,*wt; double td[]={1.0,2.0,3.0,4.0},*wd; wi=ti; wd=td; for (int i=0;i<4;i++) cout<<*(wi+i)<<"\t"<<*(wd+i)<

41 reinterpret_cast int main() { int *wi; cin>>wi; return 0; } int main() { int *wi,a; a= ; wi=reinterpret_cast (a); cout<

42 Dynamiczne tworzenie tablic 1D int *w=new int[n]; 2D int **w = new int*[n]; for(int i=0;i

43 Usuwanie tablic 1D delete [] w; 2D for(int i=0;i

44 Dynamiczne tworzenie tablicy 2D int n=3,m=2; int **tab; tab=new int *[n]; for (int i=0; i

45 Dynamiczne tworzenie tablicy 2D int n=3,m=2; int **tab; tab=new int *[n]; for (int i=0; i

46 Dynamiczne tworzenie tablic #include using namespace std; int main() { int n; cout << "Podaj rozmiar tablicy\n"; cin >> n; int *w=new int[n]; for (int i=0; i> w[i];} for (int i=0; i

47 Dynamiczne tworzenie tablic 2-D #include using namespace std; int main() { int n; cout << "Podaj rozmiar\n"; cin >> n; int **wsk=new int*[n]; for (int i=0; i

48 Wskaźnik do tablicy wielowymiarowej int main() { int tab[][3]={1,2,3,4,5,6,7,8,9}; int **w=new int*[3]; for (int i=0; i<3; i++) *(w+i)=&tab[i][0]; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ cout<

49 Funkcja zwracająca tablicę int *fun() { int tab[5]; for (int i=0; i<5; i++) tab[i]=i; return tab; } int main() { int *w; w=fun(); for (int i=0; i<5; i++) cout << w[i] << endl; return 0; }

50 Funkcja zwracająca tablicę int *fun() { int *wsk=new int[5]; for (int i=0; i<5; i++) wsk[i]=i; return wsk; } int main() { int *w; w=fun(); for (int i=0; i<5; i++) cout << w[i] << endl; return 0; }

51 Odbieranie tablic 2-D od funkcji #include using namespace std; int **tworz(int n); int main() { int **t, n; cout << "Podaj rozmiar macierzy\n"; cin >> n; t=tworz(n); for (int i=0; i

52 Argumenty z linii wywołania programu #include using namespace std; int main(int argc, char *argv[]) { cout<<"Dostalem parametrow: "<

53 Argumenty z linii wywołania programu #include using namespace std; int main(int argc, char *argv[]) { if (!(argc-3)) { cout<


Pobierz ppt "Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi."

Podobne prezentacje


Reklamy Google