jsas pp wyklad1


PARADYGMATY PROGRAMOWANIA
dr inż. Jerzy Sas, e-mail jerzy.sas@pwr.wroc.pl
(w tytule e-mail'i: EDU-PP ...)
Literatura:
1. Grębosz J.  Symfonia C++, Oficyna Kalimach, Kraków, 2000, 2005
2. Grębosz J.  Pasja C++, Oficyna Kalimach, Kraków, 2000, 2005
3. Eckel B. - Thinkink in C++, Helion, 2002
4. Eckel B. _ Thinkink in Java, Wydanie 3. Helion, 2003
5. http://wazniak.mimuw.edu.pl/index.php
6. Walczak K. - Nauka programowania obiektowego w C++, W&W, W-wa, 2001
7. Kain E. - Od C do C++, Helion, 1993
8. Liberty J. - Poznaj C++, Intersoftland 1999,
9. Dumański R., Kasprzyk A., Kozłowski M. - Analiza i projektowanie obiektowe,
10. Subieta K. - Obiektowość w projektowaniu i bazach danych, Akademicka Oficyna
Wydawnicza PLJ, 1998
11. Subieta K. - Słownik terminów z zakresu obiektowości, Akademicka Oficyna
Wydawnicza PLJ, 1999.
Program:
1. Wstęp, p`odstawowe pojęcia z zakresu języków programowania i kompilacji
2. Podstawy programowania obiektowego w C++: pojęcia podstawowe, składniki klasy,
definiowanie klasy w C++, dziedziczenie, polimorfizm, metody wirtualne, wstęp do
przeciążania operatorów
3. Definiowanie własnych operatorów, przeciążanie operatorów, konwersje typów,
zaawansowane techniki dziedziczenia, obiektowe wejście-wyjście w C++
4. Wyjątki
5. Szablony i wzorce projektowe
6. STL  omówienie podstawowych elementów
7. Przykłady praktyczne i ćwiczenia
8. Podstawy programowania w Java
9. Elementy najważniejszych pakietów Java
10. Przykładowe programy w Javie
Paradygmat:
1) przyjęty wzorzec w jakiejś dziedzinie (np. postępowania, rozwiązywania kategorii
problemów)
2) przyjęty sposób widzenia rzeczywistości w danej dziedzinie
3) niekwestionowalny zbiór pojęć i teorii tworzących podstawy danej nauki
Paradygmaty
programowania
Programowanie
Programowanie
deklaratywne
imperatywne
Programowanie
Programowanie Programowanie
Programowanie
sekwencyjne
obiektowe funkcyjne
w logice
Programowanie
strukturalne
(proceduralne)
Programowanie imperatywne - polega na podaniu sposobu wykonania zadania
przez określenie kolejnych kroków (poleceń zrozumiałych dla komputera) prowadzących do
wykonania zadania
Programowanie deklaratywne - polega na określeniu oczekiwanych własności
rozwiązania które ma być uzyskane bez podawania szczegółowego algorytmu jego uzyskania
Program deklaratywny = sformułowanie problemu w
pewnym języku formalnym
Przykład:
type
r_autora = record
id : integer;
nazwisko, imie : string;
narodowosc : (polska, angielska, rosyjska, niemiecka);
end;
r_ksiazki = record
id : integer;
tytul : string;
id_autora : integer;
ilosc_wypozyczen : integer;
end;
var
aut = array [0 .. 1000] of r_autora;
ksiazki = array [0 .. 1000] of r_ksiazki;
Zadanie:
Znajdz narodowość, z której książki są najczęściej wypożyczane
Program imperatywny:
dla każdej książki wyznacz narodowość autora;
utwórz tabelę liczności wypozyczeń dla każdej książki
dla każdej książki:
dodaj jej liczbę wypożyczeń do tabeli liczności
na pozycji odpowiadającej narodowości;
znajdz pozycję w tabeli liczności o maksymalnej liczbie wypożyczeń;
zwróć narodowość odpowiadającą znalezionej pozycji
Program deklaratywny:
Znajdz narodowość, z której książki są najczęściej wypożyczane
wyrażone w języku formalnym (np. SQL)
SELECT NARODOWOSC
FROM
SELECT SUM(ILOSC_WYPOZYCZEN) AS SUMA, NARODOWOSC
FROM AUT, KSIAZKI
WHERE KSIAZKI.ID_AUTORA = AUT.ID
WHERE SUMA = MAX( T1.SUMA )
Cechy programu imperatywnego:
" Obliczenia rozumiemy tu jako sekwencję poleceń zmieniających krok po kroku stan
maszyny, aż do uzyskania oczekiwanego wyniku.
" Stan maszyny należy rozumieć jako zawartość całej pamięci oraz rejestrów i znaczników
procesora.
" Ten sposób patrzenia na programy związany jest ściśle z budową sprzętu komputerowego
o architekturze von Neumanna, w którym poszczególne instrukcje (w kodzie
maszynowym) to właśnie polecenia zmieniające ów globalny stan.
" Języki wysokiego poziomu  takie jak Fortran, Algol, Pascal, Ada lub C  posługują
się pewnymi abstrakcjami, ale wciąż odpowiadają paradygmatowi programowania
imperatywnego.
" Przykładowo, instrukcje podstawienia działają na danych pobranych z pamięci i
umieszczają wynik w tejże pamięci, zaś abstrakcją komórek pamięci są zmienne. 1
Programowanie sekwencyjne:
" program jest ciągiem prostych instrukcji o ustalonej postaci tekstowej
" kolejność wykonania instrukcji może być zmieniana za pomocą instrukcji skoku
warunkowego i bezwarunkowego
" skok może nastąpić do dowolnego miejsca w programie,
" można tworzyć podprogramy, do których można przejść z dowolnego miejsca w
programie a następnie powrócić do tego miejsca
Przykładowe języki: Assembler, BASIC (wczesne wersje), Fortran (wczesne wersje)
Programowanie strukturalne:
" z ciągów instrukcji można tworzyć instrukcje złożone;
" instrukcje można zagnieżdżać (w szczególności można zagnieżdżać instrukcje złożone,
" instrukcja skoku (aczkolwiek zwykle dopuszczalna) jest zdecydowanie niezalecana
" niekiedy istnieje możliwość zagnieżdżania podprogramów,
" pojawia się pojęcie zmiennych lokalnych.
Przykładowe języki: Pascal, C, Ada, BASIC (nowsze wersje)
Programowanie obiektowe:
" program traktuje się jako zbiór autonomicznych i porozumiewających się ze sobą bytów
programistycznych zwanych obiektami,
" obiekt jest połączeniem danych i wykonywanych na tych danych operacji,
" program powstaje jako model wycinka rzeczywistości, w której też wyróżniamy obiekty
" obiekty dzielimy na kategorie - dla każdej kategorii tworzymy wzorzec zwany klasą
Przykładowe języki: Java, C++, C#
Programowanie deklaratywne:
Programowanie funkcyjne:
Program jest funkcją wyznaczającą wynik działania programu
Przykład - obliczanie wartosci ciągu Fibonacciego:
1
Żródło:
http://wazniak.mimuw.edu.pl/index.php?title=Paradygmaty_programowania/Wyk%C5%82ad_1:_Co_to_jest_paradygmat_progra
mowania%3F
procedure proc_imper( ind : integer, var wynik : real)
begin
if (ind = 1)
wynik := 3
else
if (wyn = 2)
wynik := 2
else
begin
w_2 := 3; w_1 := 2;
for i := 3 to ind do
begin
wynik := w_2 + w_1;
w_2 := w_1;
w_1 := wynik;
end;
end;
end;
function func_deklar( ind : integer ) : real;
begin
if (ind = 1)
func_deklar := 3
else
if (wyn = 2)
func_deklar := 2;
else
func_deklar := func_deklar( ind - 2) + func_deklar( ind - 1);
end;
Cechy programu funkcyjnego:
" nie ma zmiennych (stanu programu) - tylko argumenty funkcji
" nie ma trwałych efektów ubocznych wykonania funkcji
" nie ma instrukcji iteracyjnych
" instrukcjom iteracyjnym odpowiada rekurencja,
" do rozwiązania bardziej złożonych problemów definiuje się liczne funkcje pomocnicze
Przykładowe języki: LISP, Haskell, można ten styl stosować w większości języków
strukturalnych
Programowanie w logice:
Problem definiuje się w taki sposób aby rozwiązanie mogło być znalezione poprzez
wyznaczenie elementów z pewnego zbioru, dla których zachodzi określona własność
wyrażona za pomocą formuł (predykatów) logicznych
Cechy programu funkcyjnego:
" Program to sformułowanie własności rozwiązania w języku formalnym pozwalającym na
definiowanie predykatów.
" Wykonanie programu polega na znalezieniu takich danych, dla których mozna
"udowodnić" spełnienie wymaganej własności .
" Zadaniem kompilatora i interpretera programu logicznego jest znalezienie ciągu operacji
prowadzących do rozwiązania problemu (udowodnienia własności
Przykład:
ojciec(jan, jerzy).
ojciec(jerzy, janusz).
ojciec(jerzy, józef).
dziadek(X, Z) :- ojciec(X, Y), ojciec(Y, Z).
?- dziadek(X, janusz).2
Przykładowe języki: Prolog, SQL
Inne paradygmaty programowania:
" programowanie sterowane danymi
" programowanie sterowane zdarzeniami
" programowanie współbieżne
" programowanie wizualne (języki 4GL)
2
Żródło:
http://wazniak.mimuw.edu.pl/index.php?title=Paradygmaty_programowania/Wyk%C5%82ad_1:_Co_to_jest_paradygmat_progra
mowania%3F
Elementy definicji języka programowania:
Składnia - opis wlaśności tekstowych poprawnych programów (pozwalający rozstrzygnąś
jaki napis jest poprawnym programem)
Metody opisu: - gramatyki bezkontekstowe, gramatyki atrybutowe, notacja BNF
Semantyka - opis znaczenia składniowo poprawnych programów
Metody opisu: metoda operacyjna, metoda denotacyjna, metoda aksjomatyczna
Pragmatyka - zbiór zasad i wskazówek określających jak konstrukcje języka stosować do
rozwiązywania praktycznych problemów
Metoda opisu: nieformalna
Etapy tworzenia programu wynikowego z tekstu napisanego przez
programistę
Cel: przetworzyć tekst programu w języku zródłowym na program wykonywalny
Etapy
" Wstępne przetwarzanie tekstu,
" Kompilacja
" Konsolidacja
" Interpretacja (opcjonalnie)
Programowanie obiektowe w C++
Pojęcie klasy, obiektu i ich zastosowania
Programowanie jako sposób modelowania świata
Zastosowanie Modelowane byty Modele
Aplikacje w bazach dokumenty, towary, osoby oraz rekordy w bazie danych,
danych związki pomiędzy nimi powiązania za pomocą
kluczy obcych
Edytory tekstu lub dokumenty, rozdziały, akapity, tablice znakowe
HTML ilustracje oraz ich wzajemne (teksty), struktury
położenie danych opisujące ich
położenie na stronie
oraz formatowanie
Program do punkty, wielokąty tablice liczbowe
projektowania CAD powierzchnie, bryły, zestawy
brył
Program symulacyjny klienci, wózki/koszyki, towary, struktury danych
(np. do analizy pracy kolejki do kas, kasy, CZAS połączone w listach i
kas w hipermarkecie) (zegar) tablicach
Program obliczeniowy liczby zespolone, wektory, tablice liczbowe
(np. do obliczeń macierze
inżynierskich)
Program używający stosy, listy, kolejki, drzewa zmienne dynamiczne,
złożonych struktur binarne, grafy listy i tablice zmiennych
danych
Program z interfejsem dokumenty i ich położenie na okno główne
okienkowym typu biurku modelujące blat biurka,
desktop okna modelujące
poszczególne
dokumenty
Obiekt = dane + specyficzne operacje na tych danych
(metody)
Klasa - typ danych określający dane składowe obiektu i
sposób wykonywania operacji na nich
Obiekt klasy == konkret klasy
Relacja pomiędzy klasą a obiektem - taka sama jak pomiędzy definicją typu a zmienną
tego typu, np.
typedef struct { /* definicja typu dla liczb zespolonych */
double Re,
double Im
} Complex;
...
Complex c1, c2; /* deklaracja dwóch zmiennych zespolonych */
Przykład 1) - stos jako obiekt
dane:
" tablica elementów stosu,
" maksymalna ilość elementów stosu,
" aktualna ilość elementów na stosie
metody:
" inicjuj,
" skasuj cały stos,
" dodaj element do stosu,
" zdejmij element ze stosu,
" podaj ilość elementów na stosie
Rozważyć możliwe metody implementacji.
Przykład 2) - macierz jako obiekt
dane:
" tablica liniowa zawierająca elementy macierzy,
" rozmiary n x m,
" wartość wyznacznika,
" flaga oznaczająca czy dla aktualnej postaci macierzy obliczono wyznacznik,
metody:
" inicjuj na zadany rozmiar (n, m),
" odczytaj wartość z pozycji (i, j),
" wstaw wartość na pozycji (i, j),
" odczytaj wektor-wiersz (j)
" odczytaj wektor-kolumnę (i)
" dodaj/odejmij/pomnóż przez inną macierz (M),
" pomnóż przez wektor,
" oblicz wyznacznik,
" odwróć macierz,
" ustaw macierz jednostkową
" skasuj
Przykład 3) - punkty i wielokąty
Punkt 2D
dane:
" współrzędna x
" współrzędna y
" współrzędna w
metody:
" ustaw współrzędną x/y,
" odczytaj współrzędną x/y
" przesuń o podany wektor (u, v)
" skaluj przez podany współczynnik,
" obróć wokół (0,0) o kąt a.
Wielokąt 2D:
dane:
" ilość wierzchołków,
" tablica lub lista wierzchołków,
" pole powierzchni,
" flaga oznaczająca czy pole powierzchni obliczone,
metody:
" inicjuj jako trójkąt (p1, p2, p3)
" inicjuj jako pusty
" podaj tablicę wierzchołków,
" podaj ilość wierzchołków,
" dodaj wierzchołek po wskazanym (n, p),
" usuń wskazany wierzchołek (n)
" podaj pole powierzchni,
" przesuń o wektor (u, v),
" skaluj przez podany współczynnik (w),
" obróć wokół (0,0) o kąt a.
Metodologie programowania
Metodologia Struktury Konstrukcje Cechy Języki
danych programowe
niestrukturalne typy proste, instrukcje łatwa Assembler,
tablice typów proste, implementacja, Fortran
prostych podprogramy nieczytelność Basic
programów,
trudności w
modelowaniu
strukturalne rekordy, instrukcje czytelność Pascal,
zbiory, strukturalne, programów, C, PL/I
zagnieżdżanie zagnieżdżanie ułatwienie
typów procedur i analizy
funkcji programu,
trudności w
modelowaniu
obiektowe j/w metody łatwość Modula, C++,
obiekty obiektów modelowania, Java, Delphi-
przy Pascal
nierozważnym
użyciu -
zmniejszenie
czytelności i
ryzyka błędów
Dlaczego warto stosować styl obiektowy
Aspekt projektowy:
" większe zbliżenie kodu do modelowanego fragmentu rzeczywistości,
" powiązanie danych i wykonywanych na nich operacji
" możliwość modelowania hierarchii obiektów i modelowania
Aspekt programistyczny:
" możliwość ukrycia szczegółów implementacji - hermetyzacja,
" ograniczenie dostępności do składowych obiektu,
" możliwość zmiany sposobu implementacji bez zmiany interfejsu,
" zwiększenie czytelności zapisu poprzez jawne powiązanie danych z operacjami na nich
Definiowanie klas w C++
Prototyp klasy (deklaracja) - specyfikacja danych i metod klasy
Implementacja klasy (definicja) - kod metod klasy .
Prototyp klasy x - w pliku x.h
Implementacja klasy x - w pliku x.cpp
Składnia definicji klasy w EBNF:
::= class { * };
::= *
::= public: | private: | protected:
::= ; | ;
::=
Kwalifikator dostępu - określa możliwość używania określonej składowej klasy:
public - dostęp nieograniczony,
private - dostęp tylko z metod tej klasy,
protected - dostęp tylko z metod tej klasy i z metod klas dziedziczących od tej klasy.
Po zdefiniowaniu nazwa klasy staje się typem zmiennych.
Przykład:
class Point2D {
private:
double x;
double y;
double w;
int calc_dist_to_zero();
public:
void set_x( double x_coord );
void set_y( double y_coord );
double get_x( void );
double dist_to_zero;
};
Definiowanie metod klasy:
::=
::
( )
Jeśli metoda będzie zdefiniowana bezpośrednio w definicji klasy to zostanie
uznana za metodę inline
Przykład:
double Point2D::get_x( void )
{
return x / w;
}
void Point2D::set_x( double x_coord )
{
x = x_coord * w;
calc_dist_to_zero();
}
Deklarowanie obiektów klasy (konkretów):
= || , ;
Przykład:
Point2D p1, p2, p3; // deklarowanie pojedynczych
// obiektów
Point2D points[10]; // deklarowanie tablicy obiektów
Odwoływanie się do składowych klasy
" wewnątrz metod obiektu - bezpośrednio przez nazwę składowej
" spoza obiektu - przez podanie identyfikatora obiektu i nazwy składowej.
p1.set_x( 10.3);
x = p1.get_y();
dtz = p1.dist_to_zero;
x = p1.x; // BAD - składowa x jest prywatna
for (i=0; i < 10; i++)
{
points[i].set_x( 10.6);
points[i].set_y( 10.5 + i );
distance_total += points[i].dist_to_zero;
}
Tworzenie dynamicznych obiektów w pamięci
tworzenie obiektu w pamięci - operator new
likwidacja obiektu - operator delete
= ( * Point2D *p1, *p2, *p3; // deklaracja wskazników do
// trzech obiektów
lub lepiej
typedef Point2D *Point2DPtr
Pointer2DPtr p1, p2, p3;
Pointer2DPtr points[10]; // tablica 10 wskaznikow
Pointer2DPtr p_10; // wskaznik na tablice 10
// obiektow
Tworzenie obiektów:
p1 = new Point2D; p2 = new Point2D; p3 = new Point2D;
for (i = 0; i < 10; i++)
points[i] = new Point2D;
p_5 = new Point2D [ 10 ];
Odwoływanie się:
p1->set_x( 10.3);
x = p1->get_y();
dtz = p1->dist_to_zero;
for (i=0; i < 10; i++)
{
points[i]->set_x( 10.6);
points[i]->set_y( 10.5 + i );
distance_total += points[i]->dist_to_zero;
}
for (i=0; i < 10; i++)
{
p_10[i].set_x( 10.6);
p_10[i].set_y( 10.5 + i );
distance_total += p_10[i].dist_to_zero;
}
Kasowanie obiektów:
delete p1; delete p2; delete p3;
for (i=0; i < 10; i++)
{
delete points[i];
}
delete [] p_10;
Konstruktory i destruktory
konstruktor - metoda wywoływana automatycznie w momencie tworzenia obiektu
używana do inicjalizacji danych obiektu.
Cechy konstruktora:
" ma taką samą nazwę jak klasa,
" nie zwraca żadnej wartości.
Przykład:
class Point2D {
private:
double x;
double y;
double w;
...
public:
Point2D( void );
Point2D( double coord_x, double coord_y );
...
double dist_to_zero;
};
Point2D::Point2D( void )
{
x = 0.0; y = 0.0; w = 1.0; dist_to_zero = 0.0;
}
Point2D::Point2D( double coord_x, double coord_y )
{
x := coord_x; y = coord_y; w = 1.0;
dist_to_zero = sqrt(sqr(x) + sqr(y));
}
. . .
Point2D p1; // wywołuje pierwszy konstruktor
Point2D p2(10.3, 4.5);// wywołuje drugi konstruktor
Przy użyciu wartości domyślnych parametrów można te dwa konstruktory zastąpić jednym:
Point2D::Point2D( double coord_x = 0.0,
double coord_y = 0.0 )
{
x := coord_x; y = coord_y; w = 1.0;
dist_to_zero = sqrt(sqr(x) + sqr(y));
}
konstruktor domyślny - konstruktor, nie wymagający jawnego podawania parametrów
aktualnych
Konstruktory a tablice obiektów
Jeśli istnieje konstruktor domyślny możliwa inicjalicacja tablicy obiektów w postaci
Point2D points[3];
Jeśli konstruktor domyślny nie istnieje to należy podać jawnie parametry konstruktora:
Point2D points[3] = { Points2D(10.3, 15.7 ),
Points2D( 8.1, 5.3 ),
Points2D( 5.9, 1.7 ) };
Point2DPtr p1 = new Point2D( 10,1. 1.7 );
Jeśli konstruktor domyślny nie istnieje to nie można alokować tablicy obiektów.
destruktor - metoda wywoływana automatycznie w momencie gdy obiekt przestaje być
dostępny, zwykle używana do zwalniania pamięci zaalokowanej przez obiekt
Cechy destruktora:
" ma nazwę postaci ~XXX gdzie XXX jest nazwą klasy,
" nie przyjmuje parametrów i nie zwraca wartości,
" dla zadeklarowanych zmiennych obiektowych wywołuje się gdy zmienna przestaje być
dostępna a dla zmiennych dynamicznych w momencie użycia operatora delete.
Zadania do wykonania:
1. Napisać klasę i jej implementację modelującą stos
2. Napisać klasę (bez implementacji metod) do modelowania brył w 3D
3. Napisać klasę i jej implementację do wykonywania operacji algebraicznych na wektorach.
4. Napisać klasę i jej implementację do zarządzania zbiorem liczb naturalnych


Wyszukiwarka

Podobne podstrony:
pp wyklady 2
pp wyklady 5
pp wyklady 1
PP wyklady?sia
PP wykład w pigułce
pp wyklady 4
pp wyklady 4
pp wyklady 3
ZW Pol pien PP 2011 2012 odcinek 1 dla studentów slides z wykładów w dniach 02 16 10 2011
Podstawy automatyki wykład 1 Politechnika Poznańska PP
materialy wyklad pp cz 3 (2)
Wykład PP (1)
materialy wyklad pp cz 2
PP 2012 Program wykładu
Podstawy automatyki wykład 4 Politechnika Poznańska PP

więcej podobnych podstron