Jerzy Nawrocki, Jerzy Nawrocki Wydział Informatyki Politechnika Poznańska jerzy.nawrocki@put.poznan.pl Kryzys oprogramowania Struktury danych i inżynieria oprogramowania Przekraczanie terminów Przekraczanie budżetu Nadgodziny Kiepska jakość Struktury danych i inż. oprogr. (2) Rozwój języków programowania Cel wykładu Języki modelowania (UML) Języki dziedzinowe (YACC) Języki wysokiego poziomu (C, Pascal, ) Języki asemblerowe Przedstawić: Podstawowe struktury danych Podstawowe diagramy języka UML Elementy metod formalnych Struktury danych i inż. oprogr. (3) Struktury danych i inż. oprogr. (4) Cykl życia Plan wykładu Wymagania Projekt Wykonanie Podstawowe struktury danych Diagramy języka UML Metody formalne Struktury danych i inż. oprogr. (5) Struktury danych i inż. oprogr. (6) Struktury danych i inżynieria oprogramowania 1
Jerzy Nawrocki, C Wartość Indeks int Age [4]; Age[emp]= Age[emp] + 1; Elementarne struktury danych Tablice Age 5 10 15 30 0 1 2 3 Age [j+1] Pascal Age [0..3] of integer; Age[emp]:= Age[emp] + 1; Struktury danych i inż. oprogr. (7) Wielomiany p(x) = a k x Σ k = a 0 x 0 + a 1 x 1 + a 2 x 2 + k=0 float p(float x, int n, float a[ ]){ float result, PowerX; int k = 0; PowerX = 1; result = a[0] * PowerX; while (k < n){ k = k+1; PowerX = PowerX * x; result = result + a[k] * PowerX; return result; Struktury danych i inż. oprogr. (8) Born: Cash: Elementarne struktury danych Rekordy Student 1990 777,51 First Elementarne struktury danych Listy i wskaźniki Sequence Next 1990 1984 79 Val C struct Student {int Born float Cash;; struct Student Einstein; Einstein.Born= 79; Student.Age Pascal Student = record Born: integer; Cash: real; end; var Einstein: Student; Einstein.Born := 79; Struktury danych i inż. oprogr. (9) C struct Elem {int Val Elem *Next;; struct Elem *First; X = (*First).Val; Pascal Elem = record Val: integer; Next: ^Elem; end; var First: ^Elem; X := First^.Val; Struktury danych i inż. oprogr. (10) Stos Stos: push(e), pop Kolejka: insert(e), take Kolejka priorytetowa: insert(e), takemax First nil 1990 1984 79 push (e) pop Struktury danych i inż. oprogr. (11) Struktury danych i inż. oprogr. (12) Struktury danych i inżynieria oprogramowania 2
Jerzy Nawrocki, Kolejka Kolejka priorytetowa First nil 1990 1984 79 First nil 1990 1984 79 insert (e) take Last insert (e) takemax Struktury danych i inż. oprogr. (13) Struktury danych i inż. oprogr. (14) Wartość(Ojciec) Wartość(Syn) Wartość(Ojciec) Wartość(Syn) 90 40 60 Struktury danych i inż. oprogr. (15) 90 40 60 Struktury danych i inż. oprogr. (16) Wartość(Ojciec) Wartość(Syn) Wartość(Ojciec) Wartość(Syn) 90 40 60 Struktury danych i inż. oprogr. (17) 90 60 40 Struktury danych i inż. oprogr. () Struktury danych i inżynieria oprogramowania 3
Jerzy Nawrocki, Wartość(Ojciec) Wartość(Syn) Wartość(Ojciec) Wartość(Syn) 90 60 40 Struktury danych i inż. oprogr. (19) 90 60 40 Struktury danych i inż. oprogr. (20) Wartość(Ojciec) Wartość(Syn) 90 60 40 Struktury danych i inż. oprogr. (21) Wartość(Ojciec) Wartość(Syn) 90 60 40 Struktury danych i inż. oprogr. () Implementacja za pomocą wskaźników 90 60 40 Struktury danych i inż. oprogr. (23) 90 60 nil nil Struktury danych i inż. oprogr. (24) Struktury danych i inżynieria oprogramowania 4
Jerzy Nawrocki, Drzewo binarne bez wskaźników a b c d e f g h i j k 1 2 3 4 5 6 7 8 9 10 11 Ojciec(x) =? a Drzewo binarne bez wskaźników a b c d e f g h i j k 1 2 3 4 5 6 7 8 9 10 11 Ojciec(x) =? a b c b c d e f g d e f g h i j k h i j k Struktury danych i inż. oprogr. (25) Struktury danych i inż. oprogr. (26) Drzewo binarne bez wskaźników a b c d e f g h i j k 1 2 3 4 5 6 7 8 9 10 11 Ojciec(x) =? Ojciec(6) = 3 Ojciec(7)= 3 Ojciec(10)= 5 b Ojciec(11)= 5 d e a f c g Drzewo binarne bez wskaźników a b c d e f g h i j k 1 2 3 4 5 6 7 8 9 10 11 Ojciec(x)= entier(x/2 ) Ojciec(6) = 3 Ojciec(7)= 3 Ojciec(10)= 5 Ojciec(11)= 5 C int(x/2) Pascal x div 2 h i j k Struktury danych i inż. oprogr. (27) Struktury danych i inż. oprogr. (28) Plan wykładu www.uml.org Podstawowe struktury danych Diagramy języka UML Metody formalne Struktury danych i inż. oprogr. (29) Struktury danych i inż. oprogr. (30) Struktury danych i inżynieria oprogramowania 5
Jerzy Nawrocki, Diagramy UML Diagram stanów Diagramy stanów Diagramy przypadków użycia Diagramy sekwencji Diagramy czynności Diagramy klas... Struktury danych i inż. oprogr. (31) Nieprzyjęty Maturzysta Kandydat Zakwalifikowany Przyjęty Student /Zdanie Matury /Złożenie podania na studia /Złożenie oryginału świadectwa /Złożenie ślubowania Struktury danych i inż. oprogr. (32) Diagram przypadków użycia Diagram sekwencji Złożenie podania Maturzysta System rekrutacji KReM Maturzysta Obejrzenie wyników rekrutacji Składa podanie i wprowadza oceny Potwierdza przyjęcie podania i ocen Wnosi opłatę rekrutacyjną Czy oceny są poprawne? Są poprawne Potwierdza przyjęcie opłaty Zakwalifikowany Nieprzyjęty Struktury danych i inż. oprogr. (33) Struktury danych i inż. oprogr. (34) Diagram sekwencji Obiekt Transakcja Nazwa klasy Klasy i obiekty Obiekt-1 Obiekt-2 Linia życia obiektu Waluta Ilość Kurs Data Godz Klient WartośćPLN(): float Atrybuty Operacje Struktury danych i inż. oprogr. (35) Struktury danych i inż. oprogr. (36) Struktury danych i inżynieria oprogramowania 6
Jerzy Nawrocki, Klasy i obiekty Jakie atrybuty i operacje? Transakcja Waluta Ilość Kurs Data Godz Klient WartośćPLN(): float Transakcja Waluta USD Ilość 1000 Kurs 3.41 Data 2005.10.13 Godz 13:15 Klient Amica WartośćPLN(): float Transakcja Waluta EUR Ilość 0 Kurs 4. Data 2005.10.14 Godz 11:14 Klient Tivoli WartośćPLN(): float Obywatel NIP Podatek Zaliczka... DoZwrotu(): float... Obywatel PESEL Punkty Karany... DodajPkt(int): float WyzerujPkt() Struktury danych i inż. oprogr. (37) Struktury danych i inż. oprogr. (38) Pracownik Konto: string NoweKonto(string) Dziedziczenie Pracownik Konto: string NoweKonto(string) Dziedziczenie Etatowy Konto: string Pensja: float NoweKonto(string) NowaPensja(float) Godzinowy Konto: string Stawka: float Godz: float NoweKonto(string) NowaStawka(float) NoweGodz(float) Struktury danych i inż. oprogr. (39) Etatowy Pensja: float NowaPensja(float) Godzinowy Stawka: float Godz: float NowaStawka(float) NoweGodz(float) Struktury danych i inż. oprogr. (40) Etatowy Pensja: float NowaPensja(float) Pracownik Konto: string NoweKonto(string) Godzinowy Stawka: float Godz: float NowaStawka(float) NoweGodz(float) Dziedziczenie 1 1 Asocjacje Struktury danych i inż. oprogr. (41) Struktury danych i inż. oprogr. (42) Struktury danych i inżynieria oprogramowania 7
Jerzy Nawrocki, Asocjacje Asocjacje 1 1..4 1 * 0.. nieskończoności Struktury danych i inż. oprogr. (43) Struktury danych i inż. oprogr. (44) Nawigowalność Nawigowalność 1 1..4 1 1 Struktury danych i inż. oprogr. (45) Struktury danych i inż. oprogr. (46) Ograniczenia Ograniczenia 1 1 1 1..4 {.DataŚlubu ==..DataŚlubu Struktury danych i inż. oprogr. (47) {.RokUrodz >..RokUrodz 50 Struktury danych i inż. oprogr. (48) Struktury danych i inżynieria oprogramowania 8
Jerzy Nawrocki, Diagramy języka UML Plan wykładu Podstawowe struktury danych Diagramy języka UML Metody formalne Struktury danych i inż. oprogr. (49) Struktury danych i inż. oprogr. (50) Przetestuję. Metody formalne Ograniczenia testowania Czy on jest poprawny? Program Przeczytam. Udowodnię. Testowanie może pokazać obecność błędów, ale nigdy ich brak E. W. Dijkstra Struktury danych i inż. oprogr. (51) Struktury danych i inż. oprogr. (52) Silnia Silnia int Silnia (int n) { /*** PRE n >= 0 ***/ int k, s; k= 0; s= 1; /*** INV s== k! ***/ while (k!= n) { k= k + 1; s= s * k; /*** INV s== k! ***/ return s; /*** POST s== n! ***/ int Silnia (int n) { /*** PRE n >= 0 ***/ 1 = 0! int k, s; k= 0; s= 1; /*** INV s== k! ***/ while (k!= n) { k= k + 1; s= s * k; /*** INV s== k! ***/ return s; /*** POST s== n! ***/ Struktury danych i inż. oprogr. (53) Struktury danych i inż. oprogr. (54) Struktury danych i inżynieria oprogramowania 9
5 000 LOC 7 000 LOC Jerzy Nawrocki, Silnia Silnia s== k! int Silnia (int n) { /*** PRE n >= 0 ***/ int k, s; k= 0; s= 1; /*** INV s== k! ***/ while (k!= n) { s== k! k== k + 1 k= k + 1; s == (k 1)! s= s * k; /*** INV s== k! ***/ return s; /*** POST s== n! ***/ s== (k 1)! int Silnia (int n) { /*** PRE n >= 0 ***/ int k, s; k= 0; s= 1; /*** INV s== k! ***/ while (k!= n) { s == (k 1)! s == s * k k= k + 1; s == (k 1)! * k == k! s= s * k; /*** INV s== k! ***/ return s; /*** POST s== n! ***/ Struktury danych i inż. oprogr. (55) Struktury danych i inż. oprogr. (56) Silnia Dowodzenie poprawności programów k == n int Silnia (int n) { /*** PRE n >= 0 ***/ int k, s; k= 0; s= 1; /*** INV s== k! ***/ while (k!= n) { k= k + 1; s= s * k; /*** INV s== k! ***/ return s; /*** POST s== n! ***/ Wolfgang Reif Specyfikacja Program Struktury danych i inż. oprogr. (57) Struktury danych i inż. oprogr. (58) eqns forall x,y ofsort nat x + 0 = x; x + succ(y) = succ(x+y); x plus(x, zero())= x x,y plus(x,succ(y))= succ(plus(x,y)) Specyfikacja aksjomatyczna type ext_nat_numbers is sorts nat opns 0 nat suc: nat nat _ + _ : nat, nat nat int zero () int succ (int x) int plus (int x, int y) Nasza intuicja: plus(2, 3)= 5 Struktury danych i inż. oprogr. (59) int zero () { return 1; int succ (int x) { return 2*x; x plus(x, zero())= x x,y plus(x,succ(y))= succ(plus(x,y)) Niestandardowa implementacja int plus (int x, int y) { return x * y; Implementacja spełnia te warunki... ale plus(2,3)= 6 Nasza intuicja: plus(2, 3)= 5 Struktury danych i inż. oprogr. (60) Struktury danych i inżynieria oprogramowania 10