Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Programowanie obiektowe III rok EiT
:48:55 Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VI
2
Program wykładu Klasówka
Ź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=sin;
f jest wskaźnikiem do funkcji z jednym argumentem typu double i zwracającej wartość typu double f=sin; 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
char *(*(*var)())[10]; Prosty przykład 1 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
char *(*(*var)())[10]; Własnymi słowami char *alfa[5][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 double f0(double x) { return x;}
..\..\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
ERROR!! 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<argc;i++) drukowanie(argv[i]);
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.