1 / 16

Programowanie obiektowe III rok EiT

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

aziza
Download Presentation

Programowanie obiektowe III rok EiT

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programowanie obiektoweIII 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ź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.

  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]; 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.

  11. 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;

  12. 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);

  13. 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!!

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

  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<argc;i++) drukowanie(argv[i]); }

More Related