Title: Programowanie obiektowe III rok EiT
1Programowanie obiektoweIII rok EiT
- dr inz. Jerzy Kotowski
- Wyklad VIII
2Program wykladu
- Zródla podejscia obiektowego
- Podstawy metody PRINCE -PRojects In Controlled
Environment - Podstawy metody LFA -Logical Framework Approach,
skladanie wniosków o grant - Jezyk C - gadzety jezyka, polimorfizm, klasy,
dziedziczenie - Gadzety jezyka C c.d., klasy
- Przyklad problemu
- Podstawy jezyka JAVA
- Klasówka
3Literatura
- C for C programmers, Ira Pohl, The
Benjamin/Cummings Publishing Company, Inc. - Symfonia C, Jerzy Grebosz, Oficyna Kallimach,
Kraków 1999
4Operatory new i delete Visual Studio test0.sln
- new - operator jednoargumentowy. Bardziej
uzyteczny od malloc i calloc. Operator sluzy do
sterowania pamiecia o nazwie free store. - Do niszczenia obiektów zalozonych przy pomocy
operatora new sluzy operator delete. Przy pomocy
operatora delete mozna zniszczyc wylacznie obiekt
zalozony przy pomocy operatora new. - Oznacza to w szczególnosci, ze twór zalozony przy
pomocy funkcji malloc musi byc niszczony przy
pomocy funkcji free. - Skladnia operatora newnew type-namenew
type-name initializer - W kazdym z powyzszych przypadków operator new
rezerwuje odpowiednia ilosc pamieci i zwraca
adres typu void do zarezerwowanego obszaru. - Skladnia operatora deletedelete
expressiondelete expression - Operator delete nic nie zwraca, w takim
znaczeniu, ze zwraca void. - Przyklad dynamiczna alokacja tablicy
dwuwymiarowej. - Program tablica1.cpp
5Fragment programu
void main(void) // Dynamiczna alokacja tablicy
dwuwymiarowej int data int sz1,sz2 cout
ltlt "\nEnter two sizes " cin gtgt sz1 gtgt sz2 //
Oddzielamy Enterem lub dowolna liczba
spacji datanew int sz1// alokacja tablicy
wskazników do liczb int for(int
i0iltsz1i) datainew intsz2 cout ltlt
"\nEnter " ltlt sz1 ltlt " by " ltlt sz2 ltlt "
ints\n" int j // Kompilator nie pozwolil na
deklaracje w wewnetrznej petli for(i0iltsz1i)
for(j0jltsz2j) cin gtgt dataij cout
ltlt "\nResult\n\n" for(i0iltsz1cout ltlt
"\n",i) for(j0jltsz2j) cout ltlt
dataij ltlt "\t" getch()
6Ciekawe punkty programu tablica1.cpp
- Przy wprowadzaniu grupy danych za pomoca
operatora cin kolejne pozycje oddzielamy dowolna
liczba spacji lub klawiszem Enter. - Adres data ustawiamy na wartosc zwracana przez
operator new datanew int sz1 - rozmiar
zajetego obszaru jest zatem zalezny od modelu
pamieci i jest równy sz1 rozmiar_jednego
wskaznika. - Operator new mozna oczywiscie wykorzystywac w
skladni int i i new int - Wszystkie elementy tablicy data (czyli wskazniki)
ustawiamy na wskazania do obszarów, w których
zapamietywane beda kolejne wiersze tablicy
datainew intsz2 - Wykorzystanie jak przy klasycznej tablicy cin
gtgt dataijcout ltlt dataijdata123 - Operator przecinkowy for(i0iltsz1cout ltlt
"\n",i)
7Unie anonimowe ..\..\Visual Studio
Projects\test0\test0.sln
- Unia anonimowa to taka, która jest deklarowana
bez etykiety (tag name). - C pozwala na bezposredni dostep do skladowych
takiej unii. W zwiazku z tym nazwy pól powinny
róznic sie od nazw innych zmiennych znajdujacych
sie w tym samym horyzoncie zdarzen (obszarze
waznosci nazwy). - Program unia anonimowa.cpp
static union int i char c8 double
w //kompilator domagal sie typu static void
main(void) w3.14 cout ltlt " i " ltlt i ltlt
endl i49 cout ltlt "c0 " ltlt c0 ltlt
endl i cout ltlt "c0 " ltlt c0 ltlt
endl getch()
8Klasy - wprowadzenie
- W jezyku C struktura moze miec funkcje skladowe
metody skladowe member functions. Struktura
moze miec równiez pola opisane jako private.
Konsekewncja jest koncepcja klasy - class, która
jest struktura z domniemana widzialnoscia
private. - Modyfikatory widzialnosci (dostepu)publicprivat
eprotected - Private parts sa ukryte przed client code.
- Podejscie projektowe oparte na idei OOP sprowadza
sie do projektowania odpowiednich ADT (Abstract
Data Type). - Dobrze zaprojektowany ADT oddaje nie tylko
kluczowe wlasnosci modelowanego procesu ale moze
byc czesto z powodzeniem stosowany w innym kodzie
zródlowym. - Struktura (klasa) ma komponenty o nazwie members.
- Etykieta struktury jest typem (nazwa typu
obiektowego). - Structure member operator daje dostep do
poszczególnych skladników struktury. Skladnia
structure_variable.member_name - member_name musi byc unikalne w obrebie danej
struktury. Nazwy pól róznych struktur moga byc
identyczne.
9Zakres waznosci nazwy obiektu a jego czas zycia
- Czas zycia obiektu to okres od momentu gdy
zostanie mu przydzielone miejsce w pamieci
(definicja, C) do momentu, gdy to miejsce
zostaje zwolnione. - Zakres waznosci nazwy obiektu to ta czesc
programu, w której ta nazwa znana jest
kompilatorowi. - Przyklad void Ala(void) static float x
- Zakresy waznosci
- Lokalny swiadomie ograniczamy go do kilku
linijek programu (blok, wnetrze definicji
funkcji). - Blok funkcji zakres waznosci ograniczony do
bloku funkcji ma etykieta. - Obszar pliku jezeli program sklada sie z kilku
plików i w jednym z nich, na zewnatrz
jakiegokolwiek bloku (takze bloku funkcji)
zadeklarujemy jakas nazwe, to mówimy wówczas, ze
taka nazwa jest globalna. Ma ona zakres waznosci
pliku i jest znana od miejsca, gdzie znalazla sie
deklaracja do konca pliku. Nazwa globalna nie
jest automatycznie znana w innych plikach. - Obszar klasy nazwa uzyta do zadeklarowania
jakiejs skladowej klasy jest znana przez
wszystkie inne skladowe tej klasy.
10Stack - stos
- Idea przykladu przeksztalcamy definicje stosu z
postaci strukturalnej na postac obiektowa. - Stos jest jedna z bardziej uzytecznych struktur
danych. - Stos jest struktura, która pozwala na skladowanie
i kasowanie tylko jednego elementu znajdujacego
sie na szczycie stosu. - System obslugi stosu nosi nazwe LIFO.
- Typowe operacje, które mozna dokonywac na stosie
to push, pop, top, empty oraz full - Operator push sklada wartosc na stosie
- Operator pop pobiera wartosc ze stosu
- Operator top zwraca wartosc znajdujaca sie na
szczycie stosu - Operator empty sprawdza czy stos jest pusty
- Operator full sprawdza, czy stos jest pelny.
- Stos jest typowym ADT.
- W postaci strukturalnej stos jest organizowany na
obszarze pamieci o sztywnym rozmiarze. Szczyt
stosu wskazuje skladnik (member) o nazwie top.
Poszczególne operacje dokonywane na stosie sa w
programie zródlowym zdefiniowane jako funkcje,
których jednym z argumentów jest wskaznik do
obiektu typu stack.
11Stos - wersja strukturalna
- Struktura stack ma dwa pola typu public. Pole s
ma rozmiar max_len deklarowany jako const int. - Na poczatku programu jest równiez deklarowany
nowy typ Boolean przy pomocy slowa kluczowego
enum. Stala False jest inicjalizowana na 0 a
stala True na 1. - Funkcja reset jest wykorzystywana do
inicjalizacji. Ustawia wskaznik stosu na 0.
Argumentem funkcji jest adres do struktury typu
stack. - Funkcja push ma dwa argumenty co oraz gdzie.
Zaklada sie, ze stos nie jest pelny. Wpierw
zwiekszamy wskaznik stosu. Nastepnie podstawiamy
pod ten adres pierwszy argument funkcji. - W funkcji pop jest zmniejszenie wskaznika stosu
po pobraniu wartosci.
const int max_len1000 enum Boolean
False,True struct stack char
smax_len int top void reset(stack
stk) stk-gttop0 void push(char c,stack
stk) stk-gttop stk-gtsstk-gttopc c
har pop(stack stk) return(stk-gtsstk-gttop--
)
12Stos - wersja strukturalna, c.d.
char top(stack stk) return(stk-gtsstk-gttop
) Boolean empty(stack stk)
return((Boolean)(stk-gttop0)) //dodano
rzutowanie na typ Boolean Boolean full(stack
stk) return((Boolean)(stk-gttopmax_len-1))
// dodano rzutowanie na typ Boolean
- W funkcji top nie ma zmniejszenia wskaznika stosu
po pobraniu wartosci. - Funkcje empty oraz full zwracaja wartosc typu
Boolean. Arrgumentami sa adresy do obiektu typu
stack.
13Stos - client code ..\..\Visual Studio
Projects\test0\test0.sln
void main(void) stack s static char
str40"Elektronika i Telekomunikacja" int
i0 cout ltlt str ltlt endl reset(s) while((str
i)(!full(s))) push(stri,s) while(!em
pty(s)) cout ltlt pop(s) cout ltlt
endl getch()
- W segmencie main tekst str jest zrzucany na stos
s a nastepnie sciagany ze stosu i drukowany na
ekranie. Drukowanie w odwrotnej kolejnosci. - Obie petle wykorzystuja konstrukcje while.
- Wszystkie funkcje do obslugi stosu wywolywane w
segmencie main jako jeden ze swoich argumentów
adres do stosu s - Program stos strukturalny.cpp.
14Stos wersja obiektowa, opis
- W wersji obiektowej funkcje do obslugi stosu
staja sie funkcjami skladowymi klasy. - Member functions sa traktowane jako skladowe
struktury (klasy). - Dostep do nich jest identyczny jak do wszystkich
innych skladowych. - Do dotychczasowych funkcji do obslugi stosu
zostanie dodanych kilka nowych. - Przy okazji zostanie zaprezentowany i
wykorzystany mechanizm przeciazania funkcji. - Pewne funkcje beda definiowane jako inline,
definicje innych znajda sie poza klasa a w samej
definicji klasy znajda sie wylacznie ich
deklaracje prototypowe.
15Stos - wersja obiektowa
const int max_len1000 enum Boolean
False,True class stack char
smax_len int top public void
reset() top 0 // definition void
push(char c) // function prototype char
pop() return (stop--) char pop(int
n) // overloading, prototype char top_of()
return (stop) Boolean empty() return
((Boolean)(top 0)) Boolean empty(int
n) // overloading, prototype Boolean full()
return ((Boolean)(top max_len - 1 ))
- Member functions maja bezposredni dostep przez
member_name do wszystkich skladowych swojej klasy
- nawet do skladowych ukrytych. - Funkcja skladowa top zmienila nazwe na top_of aby
nie bylo konfliktu nazw (pole top). - Nazwy pop i top sa przeciazone.
16Stos - wersja obiektowa, funkcje skladowe
void stackpush(char c) top stop
c // definicja skladowej poza klasa char
stackpop(int n) while(n--gt1) top-- return
(stop--) Boolean stackempty(int n)
return ((Boolean)(top-n1 lt 0)) // True,
jezeli jest mniej niz n elementów
- Pelna nazwa funkcji definiowanej poza klasa ma
postacnazwa_klasynazwa_funkcji - void stackpush(char c) - definicja skladowej
poza klasa - Przeciazona funkcja pop(int n) zwraca n-ty
element ze stosu. - Przeciazona funkcja empty(int n) zwraca True,
jezeli na stosie jest mniej niz n elementów
17Stos - client code ..\..\Visual Studio
Projects\test0\test0.sln
void main(void) stack s char str50
"Instytut Informatyki, Automatyki i
Robotyki" int i 0 cout ltlt str ltlt
endl s.reset() while (stri) if
(!s.full()) s.push(stri) while(!s.empty(2
)) // print the rewerse cout ltlt s.pop(2) //
drukujemy od konca co drugi element cout ltlt
endl getch()
- W segmencie main tekst str jest zrzucany na stos
s a nastepnie sciagany ze stosu i drukowany na
ekranie. Drukujemy co drugi element w odwrotnej
kolejnosci. - Funkcje skladowe sa czytelniejsze - nie maja
argumentów. - Program stos obiektowy.cpp