Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VI.

Podobne prezentacje


Prezentacja na temat: "Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VI."— Zapis prezentacji:

1 Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VI

2 Program wykładu Źródła podejścia obiektowego Podstawy metody PRINCE -PRojects In Controlled Environment Podstawy metody LFA -Logical Framework Approach, składanie wniosków o grant Język C++ - gadżety języka, polimorfizm, klasy, dziedziczenie –Elementy składni: Deklaratory złożone Przykład problemu Podstawy języka JAVA Klasówka

3 Literatura C++ for C programmers, Ira Pohl, The Benjamin/Cummings Publishing Company, Inc. Symfonia C++, Jerzy Grębosz, Oficyna Kallimach, Kraków 1999 Język ANSI C, Brian W. Kernigham, Dennis M. Ritchie, WNT 1994.

4 Elementy języka C i C++ - deklaratory Język C pozwala na deklarowanie –obiektów typu podstawowego –tablic obiektów –wskaźników do obiektów oraz –funkcji zwracających obiekty Do modyfikowania identyfikatorów służą modyfikatory. Język C ma trzy modyfikatory (C++ ma cztery): *[]()& W deklaratorach można używać nawiasów w celu wymuszenia interesującej nas kolejności interpretacji poszczególnych modyfikatorów. Każdy kompletny deklarator musi zawierać specyfikator typu. Deklaratory z jednym modyfikatorem: int *Ala; char Ela[10]; struct complex Ola(void); int Ula[20], &last=Ula[19];

5 Elementy języka C i C++ - deklaratory c.d. Deklarator złożony to taki, który zawiera więcej niż jeden modyfikator. Ograniczenia języka C i C++ –Elementami tablicy nie mogą być funkcje –Funkcja nie może zwracać tablicy –Funkcja nie może zwracać funkcji Priorytety modyfikatorów –[] oraz () mają wyższy priorytet niż * –[] oraz () mają względem siebie identyczny priorytet i są interpretowane w kolejności od lewej strony do prawej

6 Deklaratory – natychmiastowe konsekwencje int *Ala[10]; Ala jest 10-elementową tablicą wskaźników do liczb typu int int (*Ala)[10]; Ala jest wskaźnikiem do 10-elemetowej tablicy liczb typu int double *Ela(void); Ela jest funkcją bez argumentów zwracającą adres do liczb typu double double (*Ela)(void); Ela jest wskaźnikiem do funkcji bez argumentów zwracającej wartość typu double

7 Przykłady float Ola[5], *Ola1=Ola; // Wskaźnik Ola1 ustawiamy na adres do Ola double Ola[5][10], *Ola1[5], (*Ola2)[10]; for(int i=0;i<5;i++) Ola1[i]=Ola[i]; Ola2=Ola; Tablica 2-wymiarowa, tablicę wskaźników i wskaźnik do tablicy jednowymiarowej Elementy tablicy adresów ustawiamy początki kolejnych wierszy tablicy dwuwymiarowej: *Ola[i]==*(Ola[i]+0)=Ola[i][0] –Ola[i] jest adresem do początkowego elementu w i-tym wierszu –Ola[i]+j i Ola1[i]+j jest adresem do j-tego elementu w i-tym wierszu –Wniosek: Ola[i][j]==Ola1[i][j] Arytmetyka wskaźnika Ola2 : Ola2+1 zwiększa wskazanie jak zawsze o jeden obiekt a jest nim w tym przypadku 10 liczb typu double Wniosek: Ola[i][j]==Ola2[i][j] Czyli to samo. double **Ola3 = Ola1. Czyli jak zawsze nazwa tablicy jest adresem do jej początkowego elementu. Ola3 jest wskaźnikiem do tablicy wskaźników.

8 Przykłady c.d. double (*f)(double); f jest wskaźnikiem do funkcji z jednym argumentem typu double i zwracającej wartość typu double f=sin; f jest wskaźnikiem do funkcji z jednym argumentem typu double i zwracającej wartość typu double Nazwa funkcji jest stałym adresem podobnie jak nazwa tablicy Użycie: double y=(*f)(x); Nawiasy są niezbędne: y=*f(x) Teraz do y podstawiamy dereferencję spod adresu zwróconego przez funkcję f wywołaną z argumentem x. To może nie mieć sensu.

9 Interpretowanie deklaratorów złożonych Idea: from the inside out. Algorytm interpretowania deklaratorów złożonych –Krok 1 Znaleźć identyfikator lub miejsce gdzie powinien on być –Krok 2 Zinterpretować znaczenie modyfikatorów [] i () po prawej stronie (jeżeli takie są) –Krok 3 Zinterpretować znaczenie modyfikatora * po lewej stronie –Krok 4 Jeżeli przy przesuwaniu się w prawo natrafi się na prawy nawias ) to wtedy należy znaleźć lewy nawias ( od tej pary nawiasów i zinterpretować wszystko, co znajduje się wewnątrz (tej pary nawiasów) zgodnie z regułami z Kroku 2 i Kroku 3. –Krok 5 Zakończyć na specyfikatorze typu.

10 Prosty przykład 1 char *(*(*var)())[10]; 1 1var jest 2 2wskaźnikiem do 3 3funkcji zwracającej 4 4wskaźnik do 5 5tablicy 10 elementów będących 6 6wskaźnikami do 7 7obiektów typu char.

11 Własnymi słowami Dwuwymiarowa tablica wskaźników do liczb typu char: char *alfa[5][10]; Wskaźnik, który może zapamiętać adres do takiej tablicy: char *(*beta)[10]; beta=alfa; Kompilator powinien to przeżyć Funkcja zwracająca adres takiego typu: char *(*gamma())[10]; Nasz deklarator: char *(*(*delta)())[10]; Powinno się udać: delta=gamma; char *(*(*var)())[10];

12 Prosty przykład 2 double kalkulator(double (*f)(double), double x) { return (*f)(x); } Użycie: y=kalkulator(sin,1); z=kalkulator(p_f[1],1); double f0(double x) { return x;} double (*p_f[5])(double)={f0,sin,cos,log,exp}; Tablica adresów do funkcji we-wy typu double-double double kalkulator(double (**f)(double), int fi, double x) { return (*f[fi])(x); } Użycie: z=kalkulator(p_f,2,1);..\..\Visual Studio Projects\test1\test1.sln

13 Co to jest? long *var(long,long); var jest funkcją o dwóch argumentach typu long zwracającą adres do obiektu typu long long (*var)(long,long); var jest wskaźnikiem do funkcji o dwóch argumentach typu long zwracającej wartość typu long. Przykład użycia: long Ola(long x,long y){return x+y;} var=Ola; long y=(*var)(3,7); //y=10 complex (*var[5])(complex); var jest 5 elementową tablicą wskaźników do funkcji o jednym argumencie typu complex zwracających obiekt takiego samego typu. int *var[5](void); 5 elementowa tablica funkcji… ERROR!!

14 Słowo kluczowe typedef double (*Ola(double(*)[5]))[5]; Ola jest funkcją, której jedynym argumentem jest adres do 5 elementowej tablicy liczb typu double. Funkcja zwraca adres tego samego typu. Okropne! cośtamcośtam ident; - Deklaracja obiektu o nazwie ident. Ogólnie - dowolny deklarator (również złożony). typedef cośtamcośtam ident; - definicja typu obiektowego o nazwie ident. Nowa nazwa znanego tworu. P1: typedef unsigned char byte; byte x; // mniej pisania P2: typedef char String50[51]; String50 Ala[10]; // tablica dwuwymiarowa P3: typedef char *p_char; p_char Ela[10]; // tablica wskaźników P4: typedef double (*Ula)[5]; Ula Ola(Ula); // Dużo lepiej! Widać, że argument i zwracana wartość są obiektami tego samego typu.

15 Argumenty funkcji main int main(int argc, char *argv[]) Interpretacja argumentów argc - liczba argumentów, z którymi wywołano program *argv[] - adres do tablicy adresów. To samo co **argv Jeżeli argc jest różne od zera to te argumenty są dostępne jako zakończone znakiem \0 napisy w elementach tablicy argv : argv[0], argv[1],…, argv[argc-1] argv[0] - nazwa użyta do wywołania programu argv[argc]==0 (NULL) - gwarancja standardu ANSI Chcemy napisać program, który wydrukuje na ekranie zawartość plików dyskowych o podanej nazwie. Przykład użycia: drukuj Ala.cpp Ala.h Ela1.cpp Ela2.cpp

16 Argumenty funkcji main – program // program drukuj.cpp void drukowanie(char *s) { ………………………………… } void main(int argc, char *argv[]) { int i; for(i=1;i


Pobierz ppt "Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VI."

Podobne prezentacje


Reklamy Google