Programowanie komputerów
Transkrypt
Programowanie komputerów
Programowanie komputerów Sebastian Deorowicz PŚl Instytut Informatyki 2006–02–23 Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 1 / 58 Instrukcja warunkowa — przykład program t e s t ; var s : s t r i n g ; begin w r i t e ( ’ Po daj i m i ę : ’ ) ; read ( s ) ; i f s [ l e n g t h ( s ) ] = ’ a ’ then writeln ( ’ Jesteś kobietą ’ ) else w r i t e l n ( ’ Nie j e s t e ś k o b i e t ą ’ ) end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 2 / 58 Instrukcja złożona — przykład program i n s t w a r 2 ; var d : int eg er ; begin w r i t e ( ’ Po daj l i c z b ę : ’ ) ; readln (d ) ; i f d<0 then begin w r i t e l n ( ’ d ujemne ’ ) ; d := −d ; end ; writeln ( ’ Koniec ’ ) end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 3 / 58 Instrukcja warunkowa — wcięcia program d o b r e c i e c i a ; var d : int eg er ; begin w r i t e ( ’ Po daj l i c z b ę : ’ ) ; readln (d ) ; i f d>0 then writeln ( ’d dodatnie ’ ) else i f d<0 then w r i t e l n ( ’ d ujemne ’ ) else w r i t e l n ( ’ d=z e r o ’ ) ; writeln ( ’ ’Koniec ’ ) ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 4 / 58 Pętla for — przykład var tab : array [ 1 . . 1 0 0 ] of int ege r ; i : integer ; begin f o r i :=1 to 100 do t a b [ i ] := 1 ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 5 / 58 Pętla while program p e t l a 1 ; var tab : array [ 1 . . 1 0 0 ] of intege r ; x , index : integer ; begin { w y p e ł n i e n i e t a b l i c y tab } ; read ( x ) ; i n d e x := 1 ; w h i l e ( i n d e x <=100) and ( t a b [ i n d e x ]<>x ) do i n d e x := i n d e x + 1 ; writeln ( index ) ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 6 / 58 Przykład — while i repeat..until program p e t l a 3 ; program p e t l a 4 ; var n : integer ; var n : integer ; begin begin repeat w r i t e ( ’ Podaj l i c z b ę nieujemną : ’ ) ; w r i t e ( ’ Podaj l i c z b ę nieujemną : ’ ) ; readln (n ); readln (n ); w h i l e ( n<0) do i f n<0 t h e n begin w r i t e l n ( ’ To j e s t l i c z b a ujemna ! ’ ) ; w r i t e l n ( ’ To j e s t l i c z b a ujemna ! ’ ) ; u n t i l n>=0; w r i t e ( ’ Podaj l i c z b ę nieujemną : ’ ) ; w r i t e l n ( ’W p o r z ą d k u . ’ ) readln (n ); end . end ; w r i t e l n ( ’W p o r z ą d k u . ’ ) end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 7 / 58 Instrukcje break i continue Przykład f o r i := 1 to 100 do i f ( t a b [ i ]= x ) then begin i n d e x := i ; break ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 8 / 58 Instrukcja wyboru — przykład program p r z y k c a s e 1 ; v a r ch : char ; begin r e a d l n ( ch ) ; case ch o f ’A ’ . . ’ Z ’ , ’ a ’ . . ’ z ’ : WriteLn ( ’ L i t e r a ’ ) ; ’0 ’ . . ’9 ’ : WriteLn ( ’ C y f r a ’ ) ; ’+ ’ , ’− ’ , ’ ∗ ’ , ’ / ’ : WriteLn ( ’ O p e r a t o r ’ ) ; else WriteLn ( ’ Znak s p e c j a l n y ’ ) ; end ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 9 / 58 Instrukcja wyboru — przykład program p r z y k c a s e 2 ; v a r ch : c h a r ; begin r e a d l n ( ch ) ; i f ( ch>=’A ’ ) and ( ch<=’ Z ’ ) o r ( ch>=’ a ’ ) and ( ch<=’ z ’ ) then WriteLn ( ’ L i t e r a ’ ) else i f ( ch>=’ 0 ’ ) and ( ch<=’ 9 ’ ) then WriteLn ( ’ C y f r a ’ ) else i f ( ch= ’+ ’ ) o r ( ch= ’− ’ ) o r ( ch= ’ ∗ ’ ) o r ( ch= ’ / ’ ) then WriteLn ( ’ O p e r a t o r ’ ) else WriteLn ( ’ Znak s p e c j a l n y ’ ) ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 10 / 58 Typ zbiorowy — przykład type t o k = 0 . . 2 0 ; var a : set of tok ; { 21 p o t e n c j a l n y c h elementów } i : tok ; begin a := [ 4 , 9 ] ; { 4 9 } a := a + [ 1 , 4 , 5 ] ; { suma z b i o r ó w } { 1 4 5 9 } a := a ∗ [ 1 , 2 , 9 ] ; { p r z e c i ę c i e } { 1 9 } a := a − [ 3 , 9 ] ; { różnica } { 1 } f o r i :=0 to 20 do i f i i n a then writeln ( i , ’ : należy ’ ) ; writeln ( s i z e o f (a ) ) ; { 3 ( bajty ) } end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 11 / 58 Rekordy Odwołania do pól rekordów Po zadeklarowaniu zmiennej takiego typu, do poszczególnych pól zmiennej rekordowej odwołujemy się podając nazwę zmiennej rekordowej, kropkę i nazwę pola: type punk t = r e c o r d x , y : real ; end ; v a r p : pu nk t ; begin p . x := 1 9 ; p . y := 4 . 4 4 5 ; w r i t e l n (3∗ p . x ) ; writeln ( s i z e o f (p )) end . Sebastian Deorowicz (PŚl) { 57 } { 12 } Programowanie komputerów 2006–02–23 12 / 58 Stałe Przykłady const MaxData = 1024 ∗ 64 − 1 6 ; NumChars = Ord ( ’ Z ’ ) − Ord ( ’A ’ ) + 1 ; Message = ’ H e l l o w o r l d . . . ’ ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 13 / 58 Zmienne z początkową wartością Typy proste — przykład const x : real = 299792.458; r : integer = 1999; s : s t r i n g = ’ Halo ’ ; Typy złożone — przykład type TTab5 = a r r a y [ 1 . . 5 ] o f i n t e g e r ; TData = r e c o r d dzien , miesiac , rok : integer ; end ; const t : TTab5 = ( 2 , 3 , 5 , 7 , 1 1 ) ; r : TData = ( d z i e n : 1 ; m i e s i a c : 2 0 ; r o k : 2 0 0 0 ) ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 14 / 58 Procedury — składnia procedure nazwa ( l i s t a p a r a m e t r ó w ) ; deklaracje etykiet ; deklaracje stałych ; deklaracje typów ; deklaracje zmiennych ; deklaracje podprogramów ; begin instrukcja 1 ; instrukcja 2 ; ... instrukcja ostatnia end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 15 / 58 Procedury — wywołanie (przykład) program p r z y k p r o c ; var i : int eg er ; s : string ; procedure p i s z ; v ar i : i n t e g e r ; begin write ( s ) ; f o r i :=1 to 40 do write ( ’ ∗ ’ ) ; writeln end ; begin s := ’ G w i a z d k i : ’ ; f o r i :=1 to 10 do pisz ; end . Sebastian Deorowicz (PŚl) { zmienna g l o b a l n a } { zmienna g l o b a l n a } { zmienna l o k a l n a } { dotyczy zmiennej l o k a l n e j } { dotyczy zmiennej g l o b a l n e j } Programowanie komputerów 2006–02–23 16 / 58 Zakres widoczności identyfikatorów — przykład program i d e n t y f i k a t o r y ; var a , b , d : integer ; procedure mnozenie ( a , b : r e a l ) ; var c : r e a l ; begin c := a ∗ b ; write ( c : 0 : 2 ) ; end ; procedure dodawanie ( a , b : r e a l ) ; var c : r e a l ; procedure wypisz ( c : r e a l ) ; begin writeln (c :0:2); end ; begin c := a + b ; wypisz ( c ) ; end ; var c : integer ; begin a := 1 ; b := 2 ; c := 3 ; mnozenie ( a , b ) ; dodawanie ( a , c ) ; end . Sebastian Deorowicz (PŚl) { z m i e n n e g l o b a l n e a1 , b1 , d1 } { p a r a m e t r y l o k a l n e a2 , b2 } { z m i e n n a l o k a l n a c2 } { w i d o c z n e z m i e n n e : a2 , b2 , c2 , d1 } { p a r a m e t r y l o k a l n e a3 , b3 } { z m i e n n a l o k a l n a c3 } { p a r a m e t r l o k a l n y c4 } { w i d o c z n e z m i e n n e : a3 , b3 , c4 , d1 } { c3 j e s t n i e l o k a l n a w tym k o n t e k ś c i e } { w i d o c z n e z m i e n n e : a3 , b3 , c3 , d1 } { z m i e n n a g l o b a l n e c1 } { w i d o c z n e z m i e n n e : a1 , b1 , c1 , d1 } Programowanie komputerów 2006–02–23 17 / 58 Przekazywanie parametrów — przykłady program p a r a m e t r y 1 ; p r o c e d u r e pom ( a : i n t e g e r ) ; begin a := a – 1 ; writeln (a ); end ; var b : integer ; begin b := 1 0 ; pom ( b ) ; { 9 } w r i t e l n ( b ) ; { 10 } pom ( b ) ; { 9 } w r i t e l n ( b ) ; { 10 } pom ( b ) ; { 9 } w r i t e l n ( b ) ; { 10 } pom ( b ∗ 2 ) ; { 19 } end . Sebastian Deorowicz (PŚl) program p a r a m e t r y 2 ; p r o c e d u r e pom ( v a r a : i n t e g e r ) ; begin a := a – 1 ; writeln (a ); end ; var b : integer ; begin b := 1 0 ; pom ( b ) ; { 9 } writeln (b ); { 9 } pom ( b ) ; { 8 } writeln (b ); { 8 } pom ( b ) ; { 7 } writeln (b ); { 7 } pom ( b ∗ 2 ) ; { BŁĄD ! ! ! } end . Programowanie komputerów 2006–02–23 18 / 58 Przekazywanie danych inaczej — przykład program w i e l o m i a n ; var x , a , b , c , d : r e a l ; function wielomian : r e a l ; var i : integer ; function potega : r e a l ; begin p o t e g a := 1 ; f o r i := i downto 1 do p o t e g a := p o t e g a ∗ x ; end ; begin w i e l o m i a n := d + c ∗ x ; i := 2 ; w i e l o m i a n := w i e l o m i a n + b∗ p o t e g a ; i := 3 ; w i e l o m i a n := w i e l o m i a n + a ∗ p o t e g a ; end ; begin w r i t e l n ( ‘W ( x)= ’ , w i e l o m i a n ) ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 19 / 58 Rekurencje Po co stosować rekurencje? Rekurencja jest silną techniką programistyczną, pozwala uprościć tekst programu: n! = n ∗ (n − 1)! n! = 1 dla n > 1 dla n = 1 Przykład function s i l n i a (n : integer ) : integer ; begin i f ( n=1) then s i l n i a := 1 else s i l n i a := n ∗ s i l n i a ( n −1); end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 20 / 58 Rekurencje Zastępowanie rekurencji przez pętle Każdą rekurencję można zastąpić odpowiednio skonstruowanymi pętlami, nie zawsze jest to tak proste, jak w przypadku silni: function s i l n i a (n : integer ) : integer ; begin s i l n i a := 1 ; f o r i := 2 to n do s i l n i a := s i l n i a ∗ i ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 21 / 58 Rekurencje — inny przykład Liczby Fibonacciego Fib(n) = Fib(n − 1) + Fib(n − 2) Fib(n) = 1 dla n > 1 dla n < 2 Wersja rekurencyjna function Fib (n : integer ) : integer ; begin i f ( n<2) then F i b := 1 e l s e F i b := F i b ( n−1) + F i b ( n −2); end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 22 / 58 Liczby Fibonacciego — wersja nierekurencyjna function Fib (n : integer ) : integer ; v ar i , n 1 , n 2 , f : i n t e g e r ; begin n 1 := 1 ; n 2 := 1 ; f o r i := 2 to n do begin f := n 1 + n 2 ; n 2 := n 1 ; n 1 := f ; end ; F i b := f ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 23 / 58 Pliki elementowe — przykład type Osoba = r e c o r d Imie : string [15]; Nazwisko : s t r i n g [ 2 5 ] ; Adres : string [35]; end ; O s o b y F i l e = f i l e o f Osoba ; L i c z b y F i l e = f i l e of Integer ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 24 / 58 Pliki elementowe — przykład var f : f i l e of r e a l ; x , y : real ; begin a s s i g n ( f , ’ dane . r r r ’ ) ; rewrite ( f ); x :=5.3; y :=74.5; write ( f , x ); write ( f , x , y ); close ( f ); reset ( f ); writeln ( f i l e s i z e ( f )); w h i l e not ( e o f ( f ) ) do begin read ( f , x ) ; writeln (x :5:2); end ; writeln ( filepos ( f )); seek ( f , f i l e p o s ( f ) −1); read ( f , y ) ; writeln (y :5:2); close ( f ); end . Sebastian Deorowicz (PŚl) { związanie zmiennej plikowej z plikiem } { o t w a r c i e do z a p i s u } {writeln (f , x ); błąd ! ! ! } { write ( f ,5.1); błąd ! ! ! } { zamknięcie pliku } { o t w a r c i e do o d c z y t u } {3} { 5.30 5.30 74.50 } {3} { 74.50 } Programowanie komputerów 2006–02–23 25 / 58 Pliki tekstowe — przykład var f : Text ; i , j : integer ; begin Assign ( f , ’ t e s t . t x t ’ ) ; Rewrite ( f ) ; Writeln ( f , ’ 1 2 3 4 ’ ) ; Writeln ( f , ’ 5 6 7 8 ’ ) ; Reset ( f ) ; w h i l e not SeekEof ( f ) do begin i f S e e k E o l n ( f ) then Readln ; Read ( f , j ) ; Writeln ( j ) ; end ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 26 / 58 Pliki blokowe — przykład var plik , kopia : f i l e ; P r z e c z y t a n o , Z a p i s a n o : Word ; B u f o r : a r r a y [ 1 . . 2 0 4 8 ] o f Char ; begin A s s i g n ( p l i k , ParamStr ( 1 ) ) ; Reset ( p l i k , 1 ) ; A s s i g n ( k o p i a , ParamStr ( 2 ) ) ; Rewrite ( kopia , 1 ) ; Writeln ( ’ Kopiowanie ’ , F i l e S i z e ( p l i k ) , ’ bajtów . . . ’ ) ; repeat Bl o ck Re a d ( p l i k , Bufor , S i z e O f ( B u f o r ) , P r z e c z y t a n o ) ; B l o c k W r i t e ( k o p i a , Bufor , P r z e c z y t a n o , Z a p i s a n o ) ; u n t i l ( P r z e c z y t a n o = 0 ) o r ( Z a p i s a n o <> P r z e c z y t a n o ) ; Close ( p l i k ) ; Close ( kopia ) ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 27 / 58 Pliki w Delphi — drukowanie var p l i k , drukarka : T e x t F i l e ; bufor : string ; begin A s s i g n F i l e ( p l i k , ParamStr ( 1 ) ) ; Reset ( p l i k ) ; AssignPrn ( drukarka ) ; Rewrite ( drukarka ) ; w h i l e not Eof ( p l i k ) do begin readln ( plik , bufor ) ; writeln ( drukarka , bufor ) ; end ; CloseFile ( plik ); CloseFile ( drukarka ) ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 28 / 58 Pliki — IOResult — przykład v a r F : f i l e o f Byte ; begin A s s i g n ( F , ParamStr ( 1 ) ) ; { $ I −} { wyłączenie automatycznej k o n t r o l i } Reset ( F ) ; { $ I+} { włączenie automatycznej k o n t r o l i } i f I O R e s u l t = 0 then begin W r i t e l n ( ’ Rozmiar p l i k u : ’ , I n t T o S t r ( F i l e S i z e ( F ) ) ) ; Close (F ) ; end else W r i t e l n ( ’ Błąd – p l i k n i e i s t n i e j e ’ ) ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 29 / 58 Typ wskaźnikowy — przykład Przykład Pobranie adresu niejawnie zarezerwowanego obszaru pamięci, wykorzystywanego przez zmienną niedynamiczną: v a r wsk : ˆ r e a l ; x , y : real ; begin x := 2 0 ; wsk := @x ; y := wsk ˆ ; wsk ˆ := 3 0 ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 30 / 58 Typ wskaźnikowy — jawne rezerwowanie Jawne rezerwowanie Jawne zarezerwowanie (alokacja, przydział) obszaru pamięci: v a r wsk : ˆ r e a l ; x : real ; begin x := 2 0 ; new ( wsk ) ; wsk ˆ := x ; d i s p o s e ( wsk ) ; wsk ˆ := 3 0 ; wsk := @x ; end ; Sebastian Deorowicz (PŚl) { konieczne zwol . przydz . obszar } { błąd ! ! ! } {można ponownie w y k o r z y s t a ć w s k a ź n i k } Programowanie komputerów 2006–02–23 31 / 58 Typ wskaźnikowy — operatory Operator Operator @ służy do pobrania adresu zmiennej Kontrola typu wskaźnika nie jest wykonywana, można więc do tego samego obszaru pamięci odwoływać się na kilka różnych sposobów: v ar wsk : ˆ r e a l ; x : real ; y : integer ; begin wsk := @x ; wsk ˆ := 4 ; wsk := @y ; wsk ˆ := 4 ; end ; Sebastian Deorowicz (PŚl) {Ok} {Ok} {Ok} { Źle ! ! ! } Programowanie komputerów 2006–02–23 32 / 58 Typy wskaźnikowe — przykłady type P I n t e g e r = ˆ i n t e g e r ; PReal = ˆ r e a l ; v a r wsk : P o i n t e r ; wskx : ˆ r e a l ; x : real ; y : integer ; begin wskx := n i l ; wsk := n i l ; new ( wsk ) ; wsk := @y ; wsk := @x ; wsk ˆ := 3 ; PReal ( wsk ) ˆ := 3 ; P I n t e g e r ( wsk ) ˆ := 4 ; ˆ r e a l ( wsk ) ˆ := 5 ; d i s p o s e ( wsk ) ; wskx := wsk ; wsk := wskx ; end ; Sebastian Deorowicz (PŚl) { Źle ! ! ! } { Źle ! ! ! } { Źle ! ! ! } { Źle ! ! ! } Programowanie komputerów 2006–02–23 33 / 58 Typ wskaźnikowy — najczęstsze błędy Odwołanie do nie zarezerwowanej pamięci var x : ˆ r e a l ; begin x ˆ := 5 ; Odwołanie do pustej pamięci var x : ˆ r e a l ; begin x := n i l ; x ˆ := 5 ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 34 / 58 Typ wskaźnikowy — najczęstsze błędy Odwołanie do zwolnionej pamięci var x : ˆ r e a l ; begin new ( x ) ; dispose ( x ) ; x ˆ := 5 ; Odwołanie z niezgodnym (większym) rozmiarem obszaru pamięci type PReal = ˆ r e a l ; var x : ˆ int eg er ; begin new ( x ) ; PReal ( x ) ˆ := 5 ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 35 / 58 Typ wskaźnikowy — najczęstsze błędy Brak zwolnienia obszaru zarezerwowanego var x : ˆ r e a l ; begin new ( x ) ; x ˆ := 5 ; x := n i l ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 36 / 58 Typ wskaźnikowy — najczęstsze błędy Zgubienie wskaźnika var x : ˆ r e a l ; begin new ( x ) ; x ˆ := 5 ; new ( x ) ; dispose ( x ) ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 37 / 58 Typ wskaźnikowy — najczęstsze błędy Zwolnienie nie zarezerwowanego obszaru pamięci var x : ˆ r e a l ; y : real ; begin x := n i l ; dispose ( x ) ; x := @y ; dispose ( x ) ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 38 / 58 Typ wskaźnikowy — GetMem, FreeMem — przykład Przykład — kopiowanie pliku var F : f i l e ; Size : Integer ; B u f f e r : PChar ; begin A s s i g n F i l e (F , ’ t e s t . t x t ’ ) ; Reset ( F ) ; S i z e := F i l e S i z e ( F ) ; GetMem ( B u f f e r , S i z e ) ; BlockRead ( F , B u f f e r ˆ , S i z e ) ; FreeMem ( B u f f e r ) ; CloseFile (F ) ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 39 / 58 Dynamiczne tablice — przykład type T I n t e g e r T a b = a r r a y [ 1 . . 1 0 0 0 0 ] o f i n t e g e r ; PIntegerTab = ˆ TIntegerTab ; var t a b l i c a : PIntegerTab ; begin GetMem ( t a b l i c a , 100∗ s i z e o f ( i n t e g e r ) ) ; { 100 elem . } t a b l i c a ˆ [ 1 ] := 2 0 ; t a b l i c a ˆ [ 1 0 1 ] := 2 0 ; { Źle ! ! ! } FreeMem ( t a b l i c a , 100∗ s i z e o f ( i n t e g e r ) ) ; GetMem ( t a b l i c a , 5000∗ s i z e o f ( i n t e g e r ) ) ; { 5000 elem . } t a b l i c a ˆ [ 1 1 0 1 ] := 2 0 ; FreeMem ( t a b l i c a , 5000∗ s i z e o f ( i n t e g e r ) ) ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 40 / 58 Dynamiczne tablice — Delphi — przykład Przykład var tab : array of integer ; i , n : integer ; begin ReadLn ( n ) ; S e t L e n g t h ( tab , n ) ; f o r i := 0 to n−1 do ReadLn ( t a b [ i ] ) ; ... t a b := NIL ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 41 / 58 Dynamiczne tablice — Delphi Tablice wielowymiarowe var tab : array of array of array of integer ; begin S e t L e n g t h ( tab , 1 0 0 , 1 2 , 3 1 ) ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 42 / 58 Lista jednokierunkowa — zapis Zapis w Pascalu Lista jednokierunkowa, wskaźniki następny pokazują kolejny element (tylko z jednej strony): type PElement = ˆ TElement ; TElement = r e c o r d nazwisko : string ; { i n n e dane } n a s t e p n y : PElement ; end ; v ar glowa : PElement ; begin glowa := n i l ; {Inicjalizacja} Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 43 / 58 Lista dwukierunkowa — zapis Zapis w Pascalu Głowa wskazuje na pierwszy element listy, a ogon na ostatni element: type PElement = ˆ TElement ; TElement = r e c o r d nazwisko : string ; { i n n e dane } p o p r z e d n i : PElement ; n a s t e p n y : PElement ; end ; v a r glowa , ogon : PElement ; begin glowa := n i l ; {Inicjalizacja} ogon := n i l ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 44 / 58 Przeglądanie listy jednokierunkowej wprzód Procedura procedure wprzod ( wsk : PElement ) ; begin w h i l e ( wsk<>n i l ) do begin w r i t e l n ( wsk ˆ . n a z w i s k o ) ; { l u b i n n e c z y n n o ś c i } wsk := wsk ˆ . n a s t e p n y ; end ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 45 / 58 Przeglądanie listy dwukierunkowej w tył Procedura procedure w t y l ( wsk : PElement ) ; begin w h i l e ( wsk<>n i l ) do begin w r i t e l n ( wsk ˆ . n a z w i s k o ) ; { l u b i n n e c z y n n o ś c i } wsk := wsk ˆ . p o p r z e d n i ; end ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 46 / 58 Stos na liście jednokierunkowej Procedura wstaw procedure wstaw ( v a r wsk : PElement ; n a z w i s k o : s t r i n g ) ; v ar nowy : PElement ; begin new ( nowy ) ; i f ( nowy<>n i l ) then begin nowy ˆ . n a z w i s k o := n a z w i s k o ; nowy ˆ . n a s t e p n y := wsk ; wsk := nowy ; end ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 47 / 58 Stos na liście jednokierunkowej Funkcja pobierz f u n c t i o n p o b i e r z ( v a r wsk : PElement ) : s t r i n g ; v ar p o c z : PElement ; begin p o c z := wsk ; i f ( pocz<>n i l ) then begin p o b i e r z := p o c z ˆ . n a z w i s k o ; wsk := p o c z ˆ . n a s t e p n y ; dispose ( pocz ) ; end ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 48 / 58 Kolejka — wstawianie Procedura wstaw do kolejki p r o c e d u r e wstaw ( v a r glowa , ogon : PElement ; n a z w i s k o : s t r i n g ) ; v a r nowy : PElement ; begin new ( nowy ) ; i f ( nowy<> n i l ) then begin nowy ˆ . n a z w i s k o := n a z w i s k o ; nowy ˆ . p o p r z e d n i := ogon ; nowy ˆ . n a s t e p n y := n i l ; i f ( ogon<> n i l ) then ogon ˆ . n a s t e p n y := nowy ; ogon := nowy ; i f ( g l o w a= n i l ) then g l o w a := nowy ; end ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 49 / 58 Kolejka — usuwanie Funkcja usun z kolejki f u n c t i o n p o b i e r z ( v a r glowa , ogon : PElement ) : s t r i n g ; v a r p o c z : PElement ; begin p o c z := g l o w a ; i f ( pocz<> n i l ) then begin p o b i e r z := p o c z ˆ . n a z w i s k o ; g l o w a := p o c z ˆ . n a s t e p n y ; i f ( glowa<> n i l ) then g l o w a . ˆ p o p r z e d n i := n i l else ogon := n i l ; dispose ( pocz ) ; end ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 50 / 58 Lista — zamiana elementów Prosty sposób Zamiana dwóch elementów listy — ważna operacja, wykorzystywaną np. w czasie sortowania: procedure zamien ( wsk1 , wsk2 : PElement ) ; v a r tmp : s t r i n g ; begin tmp := wsk1 ˆ . n a z w i s k o ; wsk1 ˆ . n a z w i s k o := wsk2 ˆ . n a z w i s k o ; wsk2 ˆ . n a z w i s k o := tmp ; { Dla k a ż d e g o p o l a w r e k o r d z i e a n a l o g . zamiana } end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 51 / 58 Programowanie obiektowe — dodajmy procedurę Przykład type TOsoba = c l a s s nazwisko : s t r i n g ; imię : string ; procedure p r i n t ; end ; p r o c e d u r e TOsoba . p r i n t ; begin w r i t e l n ( ’ osoba ’ , nazwisko , end ; ’ , ’ , imie ); v a r o s o b a : TOsoba ; begin o s o b a . n a z w i s k o := ’ K o w a l s k i ’ ; o s o b a . i m i e := ’ Jan ’ ; osoba . p r i n t ; end . Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 52 / 58 Dziedziczenie — przykład Przykład type TOsoba = c l a s s imie , nazwisko : s t r i n g ; procedure P r i n t ; end ; TStudent = c l a s s ( TOsoba ) srednia : real ; end ; var student begin student student student end ; : TStudent ; . n a z w i s k o := ‘ K o w a l s k i ’ ; . s r e d n i a := 3 . 3 ; . Print ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 53 / 58 Dziedziczenie — porównanie Wersja z dziedziczeniem Wersja bez dziedziczenia t y p e TOsoba = c l a s s imie , nazwisko : s t r i n g ; procedure Print ; end ; TS tudent = c l a s s ( TOsoba ) srednia : real ; end ; t y p e TOsoba = c l a s s imie , nazwisko : procedure Print end ; TStudent = c l a s s imie , nazwisko : srednia : real ; procedure Print end ; Sebastian Deorowicz (PŚl) Programowanie komputerów string ; ; string ; ; 2006–02–23 54 / 58 Programowanie obiektowe — konstruktory i destruktory Zapis type T L i s t a = c l a s s ... procedure C r e a t e ; procedure D e s t r o y ; end ; v ar l i s t a : T L i s t a ; begin l i s t a . Create ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 55 / 58 Programowanie obiektowe — konstruktory i destruktory Nazwa konstruktorów i destruktorów Dla wyróżnienia specjalnej roli, jaką pełnią te metody słowo używa się słów kluczowych constructor i destructor: type T L i s t a = c l a s s ... constructor Create ; d e s t r u c t o r Destroy ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 56 / 58 Obiekty dynamiczne Turbo Pascal Delphi t y p e TOsoba = o b j e c t imie , nazwisko : s t r i n g ; procedure Print ; constructor Create ; d e s t r u c t o r Destroy ; end ; v a r o s o b a : ˆTOsoba ; begin New( o s o b a ) ; osoba ˆ . Create ; osoba ˆ . P r i n t ; osoba ˆ . Destroy ; Dispose ( osoba ) ; t y p e TOsoba = c l a s s imie , nazwisko : s t r i n g ; procedure Print ; constructor Create ; d e s t r u c t o r Destroy ; end ; v a r o s o b a : TOsoba ; begin o s o b a := TOsoba . C r e a t e ; osoba . P r i n t ; osoba . Free ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 57 / 58 Polimorfizm — przykład Przykład type TOsoba = c l a s s procedure P r i n t ; v i r t u a l ; end ; TStudent = c l a s s ( TOsoba ) procedure P r i n t ; o v e r r i d e ; end ; Sebastian Deorowicz (PŚl) Programowanie komputerów 2006–02–23 58 / 58