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