160 likes | 297 Views
Programowanie obiektowe III rok EiT. dr inż. Jerzy Kotowski Wykład VI. Program wykładu. Źródła podejścia obiektowego Podstawy metody PRINCE - PR ojects I n C ontrolled E nvironment Podstawy metody LFA - L ogical F ramework A pproach , składanie wniosków o grant
E N D
Programowanie obiektoweIII rok EiT dr inż. Jerzy Kotowski Wykład VI
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
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.
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];
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
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
Przykłady float Ola[5], *Ola1=Ola; // WskaźnikOla1ustawiamy 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.
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.
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.
Prosty przykład 1 char *(*(*var)())[10]; 7 6 4 2 1 3 5 1 var jest 2 wskaźnikiem do 3 funkcji zwracającej 4 wskaźnik do 5 tablicy 10 elementów będących 6 wskaźnikami do 7 obiektów typu char.
Własnymi słowami char *(*(*var)())[10]; • 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;
Prosty przykład 2 ..\..\Visual Studio Projects\test1\test1.sln 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), double x) { return (*f)(x); } Użycie: y=kalkulator(sin,1); z=kalkulator(p_f[1],1); double kalkulator(double (**f)(double), int fi, double x) { return (*f[fi])(x); } Użycie: z=kalkulator(p_f,2,1);
Co to jest? • long *var(long,long); • var jest funkcją o dwóch argumentach typu long zwracającą adres do obiektu typulong • long (*var)(long,long); • varjest wskaźnikiem do funkcji o dwóch argumentach typulongzwracającej wartość typulong. • 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 typucomplexzwracających obiekt takiego samego typu. • int *var[5](void); • 5 elementowa tablica funkcji… ERROR!!
Słowo kluczowetypedef • 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.
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
Argumenty funkcji main – program // program drukuj.cpp void drukowanie(char *s) { ………………………………… } void main(int argc, char *argv[]) { int i; for(i=1;i<argc;i++) drukowanie(argv[i]); }