Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałCelestyna Zawalski Został zmieniony 10 lat temu
1
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII
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 –Gadżety języka C++ c.d., klasy 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
4
Operatory new i delete Visual Studio: test0.sln Visual Studio: test0.sln new - operator jednoargumentowy. Bardziej użyteczny od malloc i calloc. Operator służy do sterowania pamięcią o nazwie free store. Do niszczenia obiektów założonych przy pomocy operatora new służy operator delete. Przy pomocy operatora delete można zniszczyć wyłącznie obiekt założony przy pomocy operatora new. Oznacza to w szczególności, że twór założony przy pomocy funkcji malloc musi być niszczony przy pomocy funkcji free. Składnia operatora new : new type-name new type-name initializer W każdym z powyższych przypadków operator new rezerwuje odpowiednią ilość pamięci i zwraca adres typu void* do zarezerwowanego obszaru. Składnia operatora delete : delete expression delete [] expression Operator delete nic nie zwraca, w takim znaczeniu, że zwraca void. Przykład: dynamiczna alokacja tablicy dwuwymiarowej. Program tablica1.cpp
5
Fragment programu void main(void) // Dynamiczna alokacja tablicy dwuwymiarowej { int** data; int sz1,sz2; cout << "\nEnter two sizes: "; cin >> sz1 >> sz2; // Oddzielamy Enterem lub dowolną liczbą spacji data=new int* [sz1];// alokacja tablicy wskaźników do liczb int for(int i=0;i<sz1;i++) data[i]=new int[sz2]; cout << "\nEnter " << sz1 << " by " << sz2 << " ints:\n"; int j;// Kompilator nie pozwolił na deklarację w wewnętrznej pętli for(i=0;i<sz1;i++) for(j=0;j<sz2;j++) cin >> data[i][j]; cout << "\nResult:\n\n"; for(i=0;i<sz1;cout << "\n",i++) for(j=0;j<sz2;j++) cout << data[i][j] << "\t"; getch(); }
6
Ciekawe punkty programu tablica1.cpp Przy wprowadzaniu grupy danych za pomocą operatora cin kolejne pozycje oddzielamy dowolną liczbą spacji lub klawiszem Enter. Adres data ustawiamy na wartość zwracaną przez operator new: data=new int* [sz1]; - rozmiar zajętego obszaru jest zatem zależny od modelu pamięci i jest równy sz1* rozmiar_jednego wskaźnika. Operator new można oczywiście wykorzystywać w składni: int *i; i = new int ; Wszystkie elementy tablicy data (czyli wskaźniki) ustawiamy na wskazania do obszarów, w których zapamiętywane będą kolejne wiersze tablicy: data[i]=new int[sz2]; Wykorzystanie jak przy klasycznej tablicy: cin >> data[i][j]; cout << data[i][j]; data[1][2]=3; Operator przecinkowy: for(i=0;i<sz1;cout << "\n",i++)
7
Unie anonimowe..\..\Visual Studio Projects\test0\test0.sln..\..\Visual Studio Projects\test0\test0.sln Unia anonimowa to taka, która jest deklarowana bez etykiety (tag name). C++ pozwala na bezpośredni dostęp do składowych takiej unii. W związku z tym nazwy pól powinny różnić się od nazw innych zmiennych znajdujących się w tym samym horyzoncie zdarzeń (obszarze ważności nazwy). Program unia anonimowa.cpp static union { int i; char c[8]; double w; };//kompilator domagal sie typu static void main(void) { w=3.14; cout << " i: " << i << endl; i=49; cout << "c[0]: " << c[0] << endl; i++; cout << "c[0]: " << c[0] << endl; getch(); }
8
Klasy - wprowadzenie W języku C++ struktura może mieć funkcje składowe == metody składowe == member functions. Struktura może mieć również pola opisane jako private. Konsekewncją jest koncepcja klasy - class, która jest strukturą z domniemaną widzialnością private. Modyfikatory widzialności (dostępu): public private protected Private parts są ukryte przed client code. Podejście projektowe oparte na idei OOP sprowadza się do projektowania odpowiednich ADT (Abstract Data Type). Dobrze zaprojektowany ADT oddaje nie tylko kluczowe własności modelowanego procesu ale może być często z powodzeniem stosowany w innym kodzie źródłowym. Struktura (klasa) ma komponenty o nazwie members. Etykieta struktury jest typem (nazwą typu obiektowego). Structure member operator daje dostęp do poszczególnych składników struktury. Składnia: structure_variable.member_name member_name musi być unikalne w obrębie danej struktury. Nazwy pól różnych struktur mogą być identyczne.
9
Zakres ważności nazwy obiektu a jego czas życia Czas życia obiektu to okres od momentu gdy zostanie mu przydzielone miejsce w pamięci (definicja, C++) do momentu, gdy to miejsce zostaje zwolnione. Zakres ważności nazwy obiektu to ta część programu, w której ta nazwa znana jest kompilatorowi. Przykład: void Ala(void) { static float x; … } Zakresy ważności: –Lokalny – świadomie ograniczamy go do kilku linijek programu (blok, wnętrze definicji funkcji). –Blok funkcji – zakres ważności ograniczony do bloku funkcji ma etykieta. –Obszar pliku – jeżeli program składa się z kilku plików i w jednym z nich, na zewnątrz jakiegokolwiek bloku (także bloku funkcji) zadeklarujemy jakąś nazwę, to mówimy wówczas, że taka nazwa jest globalna. Ma ona zakres ważności pliku i jest znana od miejsca, gdzie znalazła się deklaracja do końca pliku. Nazwa globalna nie jest automatycznie znana w innych plikach. –Obszar klasy – nazwa użyta do zadeklarowania jakiejś składowej klasy jest znana przez wszystkie inne składowe tej klasy.
10
Stack - stos Idea przykładu: przekształcamy definicję stosu z postaci strukturalnej na postać obiektową. Stos jest jedną z bardziej użytecznych struktur danych. Stos jest strukturą, która pozwala na składowanie i kasowanie tylko jednego elementu znajdującego się na szczycie stosu. System obsługi stosu nosi nazwę LIFO. Typowe operacje, które można dokonywać na stosie to push, pop, top, empty oraz full: –Operator push składa wartość na stosie –Operator pop pobiera wartość ze stosu –Operator top zwraca wartość znajdującą się na szczycie stosu –Operator empty sprawdza czy stos jest pusty –Operator full sprawdza, czy stos jest pełny. Stos jest typowym ADT. W postaci strukturalnej stos jest organizowany na obszarze pamięci o sztywnym rozmiarze. Szczyt stosu wskazuje składnik (member) o nazwie top. Poszczególne operacje dokonywane na stosie są w programie źródłowym zdefiniowane jako funkcje, których jednym z argumentów jest wskaźnik do obiektu typu stack.
11
Stos - wersja strukturalna Struktura stack ma dwa pola typu public. Pole s ma rozmiar max_len deklarowany jako const int. Na początku programu jest również deklarowany nowy typ Boolean przy pomocy słowa kluczowego enum. Stała False jest inicjalizowana na 0 a stała True na 1. Funkcja reset jest wykorzystywana do inicjalizacji. Ustawia wskaźnik stosu na 0. Argumentem funkcji jest adres do struktury typu stack. Funkcja push ma dwa argumenty: co oraz gdzie. Zakłada się, że stos nie jest pełny. Wpierw zwiększamy wskaźnik stosu. Następnie podstawiamy pod ten adres pierwszy argument funkcji. W funkcji pop jest zmniejszenie wskaźnika stosu po pobraniu wartości. const int max_len=1000; enum Boolean {False,True}; struct stack { char s[max_len]; int top; }; void reset(stack* stk) { stk->top=0; } void push(char c,stack* stk) { stk->top++; stk->s[stk->top]=c; } char pop(stack* stk) { return(stk->s[stk->top--]); }
12
Stos - wersja strukturalna, c.d. W funkcji top nie ma zmniejszenia wskaźnika stosu po pobraniu wartości. Funkcje empty oraz full zwracają wartość typu Boolean. Arrgumentami są adresy do obiektu typu stack. char top(stack* stk) { return(stk->s[stk->top]); } Boolean empty(stack* stk) { return((Boolean)(stk->top==0)); }//dodano rzutowanie na typ Boolean Boolean full(stack* stk) { return((Boolean)(stk->top==max_len-1)); }// dodano rzutowanie na typ Boolean
13
Stos - client code..\..\Visual Studio Projects\test0\test0.sln..\..\Visual Studio Projects\test0\test0.sln W segmencie main tekst str jest zrzucany na stos s a następnie ściągany ze stosu i drukowany na ekranie. Drukowanie w odwrotnej kolejności. Obie pętle wykorzystują konstrukcję while. Wszystkie funkcje do obsługi stosu wywoływane w segmencie main jako jeden ze swoich argumentów adres do stosu &s Program stos strukturalny.cpp. void main(void) { stack s; static char str[40]="Elektronika i Telekomunikacja"; int i=0; cout << str << endl; reset(&s); while((str[i])&&(!full(&s))) push(str[i++],&s); while(!empty(&s)) cout << pop(&s); cout << endl; getch(); }
14
Stos – wersja obiektowa, opis W wersji obiektowej funkcje do obsługi stosu stają się funkcjami składowymi klasy. Member functions są traktowane jako składowe struktury (klasy). Dostęp do nich jest identyczny jak do wszystkich innych składowych. Do dotychczasowych funkcji do obsługi stosu zostanie dodanych kilka nowych. Przy okazji zostanie zaprezentowany i wykorzystany mechanizm przeciążania funkcji. Pewne funkcje będą definiowane jako inline, definicje innych znajdą się poza klasą a w samej definicji klasy znajdą się wyłącznie ich deklaracje prototypowe.
15
Stos - wersja obiektowa Member functions mają bezpośredni dostęp przez member_name do wszystkich składowych swojej klasy - nawet do składowych ukrytych. Funkcja składowa top zmieniła nazwę na top_of aby nie było konfliktu nazw (pole top). Nazwy pop i top są przeciążone. const int max_len=1000; enum Boolean {False,True}; class stack { char s[max_len]; int top; public: void reset() { top = 0; }// definition void push(char c);// function prototype char pop() { return (s[top--]);} char pop(int n);// overloading, prototype char top_of() { return (s[top]); } Boolean empty() { return ((Boolean)(top == 0)); } Boolean empty(int n);// overloading, prototype Boolean full() { return ((Boolean)(top == max_len - 1 )); } };
16
Stos - wersja obiektowa, funkcje składowe Pełna nazwa funkcji definiowanej poza klasą ma postać: nazwa_klasy::nazwa_funkcji void stack::push(char c) - definicja składowej poza klasą Przeciążona funkcja pop(int n) zwraca n-ty element ze stosu. Przeciążona funkcja empty(int n) zwraca True, jeżeli na stosie jest mniej niż n elementów void stack::push(char c) { top++; s[top] = c; }// definicja składowej poza klasą char stack::pop(int n) { while(n-->1) top--; return(s[top--]); } Boolean stack::empty(int n) { return ((Boolean)(top-n+1 <= 0)); }// True, jeżeli jest mniej niż n elementów
17
Stos - client code..\..\Visual Studio Projects\test0\test0.sln..\..\Visual Studio Projects\test0\test0.sln W segmencie main tekst str jest zrzucany na stos s a następnie ściągany ze stosu i drukowany na ekranie. Drukujemy co drugi element w odwrotnej kolejności. Funkcje składowe są czytelniejsze - nie mają argumentów. Program stos obiektowy.cpp void main(void) { stack s; char str[50] = {"Instytut Informatyki, Automatyki i Robotyki"}; int i = 0; cout << str << endl; s.reset(); while (str[i]) if (!s.full()) s.push(str[i++]); while(!s.empty(2))// print the rewerse cout << s.pop(2);// drukujemy od końca co drugi element cout << endl; getch(); }
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.