1
PS/TP
TI
TI
TI
TI----PS
PS
PS
PS----4A
4A
4A
4A
DYNAMICZNE STRUKTURY DANYCH
DYNAMICZNE STRUKTURY DANYCH
DYNAMICZNE STRUKTURY DANYCH
DYNAMICZNE STRUKTURY DANYCH
2
PS/TP
PROGRAMOWANIE STRUKTURALNE
WSKA
Ź
NIKI
3
PS/TP
PROGRAMOWANIE STRUKTURALNE
Typy wska
ź
nikowe.
Zmienne dotychczas omówionych typów, tj. typów prostych i strukturalnych,
charakteryzuj
ą
si
ę
tym,
ż
e istniej
ą
przez cały czas wykonywania tej cz
ęś
ci ,
w której s
ą
zadeklarowane. S
ą
to tzw. zmienne statyczne. W j
ę
zyku Turbo Pascal
wyst
ę
puj
ą
te
ż
zmienne dynamiczne reprezentuj
ą
ce obiekty, dla których pami
ęć
jest przydzielana i zwalniana na okre
ś
lone
żą
danie. Zmienne te nie posiadaj
ą
identyfikatorów, a odwołanie do nich nast
ę
puje za pomoc
ą
wska
ź
nika.
Warto
ś
ciami wska
ź
ników s
ą
elementy typu wska
ź
nikowego, które okre
ś
laj
ą
adresy
pami
ę
ci zmiennych dynamicznych. Zastosowanie w programie zmiennych
dynamicznych poci
ą
ga za sob
ą
konieczno
ść
zdefiniowania odpowiednich
typów wska
ź
nikowych.
4
PS/TP
PROGRAMOWANIE STRUKTURALNE
Definicja pojedynczego typu wska
ź
nikowego ma posta
ć
:
TYPE
identyfikator_typu_wska
ź
nikowego = ^identyfikator_typu_bazowego;
Przykład:
TYPE wskaznik = ^zapis;
zapis = record
Tekst: String[80];
Liczba: Integer;
end;
5
PS/TP
PROGRAMOWANIE STRUKTURALNE
Definicja ta wi
ąż
e typ wskaznik ze zbiorem wskaza
ń
danych typu zapis.
Je
ś
li wprowadzimy teraz deklaracj
ę
:
VAR adres : wskaznik;
to zmiennej wska
ź
nikowej adres b
ę
d
ą
mogły by
ć
w programie przypisywane
adresy pami
ę
ci danych typu zapis.
adres
Tekst: String[80];
Liczba: Integer;
6
PS/TP
PROGRAMOWANIE STRUKTURALNE
W Pascalu wyst
ę
puj
ą
dwa predefiniowane typy wska
ź
nikowe:
•Pointer (zmienne tego typu s
ą
zgodne z dowolnym innym typem wska
ź
nikowym)
•PChar (reprezentuje wska
ź
nik do ła
ń
cuchów zako
ń
czonych znakiem pustym).
Słowo kluczowe jest słowo NIL, które
oznacza stał
ą
typu wska
ź
nikowego nie okre
ś
laj
ą
c
ą ż
adnego adresu
(NIL wskazuje na adres pusty).
7
PS/TP
PROGRAMOWANIE STRUKTURALNE
program ptr1;
uses Crt;
type
Tdane = record
nazwisko : string;
imie
: string
end;
PTdane = ^Tdane;
var
ptr : PTdane;
Przykład
8
PS/TP
PROGRAMOWANIE STRUKTURALNE
begin
clrscr;
if ptr = NIL then writeln('ptr=NIL');
New(ptr);
if ptr = NIL then writeln('ptr=NIL');
ptr^.nazwisko := 'Nowak';
ptr^.imie := 'Janusz';
writeln(ptr^.imie, ' ', ptr^.nazwisko);
Dispose(ptr);
readkey;
end.
9
PS/TP
PROGRAMOWANIE STRUKTURALNE
program ptr2;
uses Crt, Strings;
const
Turbo: PChar = 'Turbo';
Pascal: PChar = 'Pascal';
var
S : array [0..80] of char;
begin
clrscr;
StrCopy(S, Turbo);
StrCat(S, ' ');
StrCat(S, Pascal);
Writeln(S);
readkey;
end.
Przykład
10
PS/TP
PROGRAMOWANIE STRUKTURALNE
PROGRAM Zmienne_dynamiczne;
USES
Crt;
VAR
i : INTEGER;
suma : ^INTEGER; {Deklaracja zmiennej dynamicznej}
BEGIN
ClrScr;
New(suma); {Przydzielenie pamieci dla zmiennej}
suma^:= 0;
FOR i:=1 TO 100 DO
suma^:= suma^ + i;
Writeln('Suma = ', suma^);
Dispose(suma); {Zwolnienie przydzielonej pamieci}
REPEAT UNTIL KeyPressed;
END.
Przykład
11
PS/TP
PROGRAMOWANIE STRUKTURALNE
Wska
ź
niki i tablica dynamiczna
12
PS/TP
PROGRAMOWANIE STRUKTURALNE
PROGRAM Dynamiczna_tablica;
USES
Crt;
TYPE
tablica = ARRAY[1..100, 1..100] OF Real;
VAR
tab
: ^tablica; {Deklaracja tablicy dynamicznej}
rozmiar : Word;
BEGIN
ClrScr;
New(tab); {Przydzielenie pamieci dla tablicy}
rozmiar := SizeOf(tab^);
Przykład
13
PS/TP
PROGRAMOWANIE STRUKTURALNE
IF MaxAvail < rozmiar THEN
Writeln ('Nie mozna przydzielic pamieci')
ELSE
Writeln('Udana alokacja pamieci');
Dispose(tab); {Zwolnienie pamieci przydzielonej dla tablicy}
REPEAT UNTIL KeyPressed;
END.
14
PS/TP
PROGRAMOWANIE STRUKTURALNE
Funkcje i procedury dynamicznego
przydziału pami
ę
ci
15
PS/TP
PROGRAMOWANIE STRUKTURALNE
Procedura
New
słu
ż
y do utworzenia zmiennej dynamicznej i ustalenia zmiennej
wska
ź
nikowej wskazuj
ą
cej na obszar zmiennej dynamicznej.
Posta
ć
procedury:
New( zmienna-wska
ź
nikowa )
Odwołanie si
ę
do zmiennej dynamicznej nast
ę
puje za pomoc
ą
konstrukcji:
zmienna-wska
ź
nikowa^
16
PS/TP
PROGRAMOWANIE STRUKTURALNE
Procedura
GetMem
słu
ż
y do utworzenia zmiennej dynamicznej o podanym
rozmiarze (w bajtach).
Posta
ć
procedury:
GetMem( zmienna-wska
ź
nikowa, rozmiar )
Odwołanie si
ę
do zmiennej dynamicznej:
zmienna-wska
ź
nikowa^
17
PS/TP
PROGRAMOWANIE STRUKTURALNE
Procedura
Dispose
słu
ż
y do zwolnienia obszaru pami
ę
ci przydzielonej dla
zmiennej dynamicznej, czyli usuni
ę
cia zmiennej dynamicznej.
Posta
ć
procedury:
Dispose( zmienna-wska
ź
nikowa )
18
PS/TP
PROGRAMOWANIE STRUKTURALNE
Funkcja
MaxAvail
słu
ż
y do pobrania rozmiaru (w bajtach) najwi
ę
kszego
wolnego bloku na stogu (Heap).
Posta
ć
funkcji:
MaxAvail
Przykład:
Max_block_size := MaxAvail;
19
PS/TP
PROGRAMOWANIE STRUKTURALNE
Funkcja
MemAvail
słu
ż
y do pobrania sumy rozmiarów (w bajtach) wszystkich
wolnych bloków na stogu (Heap).
Posta
ć
funkcji:
MemAvail
Przykład:
Max_size := MemAvail;
20
PS/TP
PROGRAMOWANIE STRUKTURALNE
STOS (ang. Stack)
Stos jest to struktura danych składaj
ą
ca si
ę
z liniowo uporz
ą
dkowanych elementów
w której ostatnio doł
ą
czony element nazywamy wierzchołkiem stosu). Stos działa
na zasadzie pami
ę
ci LIFO (ang. Last Input – First Output) – ostatnio wprowadzony
do niego element zostanie pierwszy wyprowadzony.
Element 1
Element 2
Element 3
Element 4
Element 5
Element 6
Wierzchołek
stosu
21
PS/TP
PROGRAMOWANIE STRUKTURALNE
dane
wskaznik
dane
wskaznik
dane
wskaznik
dane
wskaznik
NIL
wierzchołek
stosu
wej
ś
cie
wyj
ś
cie
22
PS/TP
PROGRAMOWANIE STRUKTURALNE
dane : string[70];
wkaznik : wskaznik_stosu;
dane : string[70];
wskaznik : wskaznik_stosu;
Budowa elementu
wierzcholek
NIL
23
PS/TP
PROGRAMOWANIE STRUKTURALNE
Przykładowy program
PROGRAM Stos1;
USES
Crt;
TYPE
wskaznik_stosu = ^skladnik_stosu;
skladnik_stosu = record
dane : string[70];
wskaznik : wskaznik_stosu;
end;
VAR
{Deklaracje zmiennych dynamicznych}
wierzcholek, element : wskaznik_stosu;
{Deklaracje zmiennych pomocniczych}
tekst : string;
koniec : boolean;
i,k,n : integer;
24
PS/TP
PROGRAMOWANIE STRUKTURALNE
{Procedura tworzenia stosu i doł
ą
czania
do niego składników}
procedure NaStos(var element : string[70];
var wierzcholek : wskaznik_stosu);
var punkt : wskaznik_stosu;
begin
punkt := wierzcholek;
New(wierzcholek);
wierzcholek^.dane := element;
wierzcholek^.wskaznik := punkt;
end; {NaStos}
25
PS/TP
PROGRAMOWANIE STRUKTURALNE
{Procedura usuwania (zdejmowania) składnika
z wierzchołka stosu}
procedure ZeStosu(var element : string[70];
var wierzcholek : wskaznik_stosu);
var punkt : wskaznik_stosu;
begin
if (wierzcholek <> NIL) then
begin
element := wierzcholek^.dane;
punkt := wierzcholek^.wskaznik;
Dispose(wierzcholek);
wierzcholek := punkt;
end;
end; {ZeStosu}
26
PS/TP
PROGRAMOWANIE STRUKTURALNE
BEGIN
ClrScr;
TextColor(YELLOW);
TextBackground(BLUE);
GoToXY(32,1);
writeln('PRZYKŁAD STOSU');
window(1,3,80,25);
TextBackground(BLACK);
write('Wprowad
ź
teksty (ka
ż
dy maks. 70 znaków)');
writeln('** - koniec wprowadzania');
wierzcholek := NIL;
i:=0;
koniec := false;
repeat
i:=i+1;
write('Tekst ',i,' :');
readln(tekst);
if (tekst='**') then koniec := true
else NaStos(tekst,wierzcholek);
until koniec;
27
PS/TP
PROGRAMOWANIE STRUKTURALNE
if (i>1) then
begin
clrscr;
writeln('Stos został utworzony');
i:=i-1;
writeln('Liczba składników stosu: ',i);
koniec := false;
repeat
writeln('Podaj liczb
ę
n tekstów do usuni
ę
cia ');
write('ze stosu (n<1 - koniec) : ');
readln(n);
if (n<1)
then koniec := true
else
if (n>i)
then writeln('Liczba składników stosu : ',i)
28
PS/TP
PROGRAMOWANIE STRUKTURALNE
else begin
k:=0;
repeat
k:=k+1;
ZeStosu(tekst, wierzcholek);
until (wierzcholek=NIL) or (k=n);
writeln('Teksty pozostałe na stosie:');
if (wierzcholek=NIL)
then begin
writeln('Brak tekstów');
koniec := true;
end
else begin
i:=0;
element := wierzcholek;
29
PS/TP
PROGRAMOWANIE STRUKTURALNE
element := wierzcholek;
repeat
i:=i+1;
writeln('Tekst ',i,' : ');
writeln(element^.dane);
element := element^.wskaznik;
until (element=NIL);
end
until koniec;
for k:=1 to i do ZeStosu(tekst, wierzcholek);
writeln('Koniec programu');
Delay(2000);
end; {(i>1)}
writeln('Naci
ś
nij dowolny klawisz...');
Readkey;
END.
30
PS/TP
PROGRAMOWANIE STRUKTURALNE
Kolejka składaj
ą
ca si
ę
ludków oczekuj
ą
cych na swoje mieszkanie.
31
PS/TP
PROGRAMOWANIE STRUKTURALNE
KOLEJKA (ang. Queue)
Kolejka jest struktur
ą
danych składaj
ą
c
ą
si
ę
z liniowo uporz
ą
dkowanych elementów,
do której mo
ż
na doł
ą
czy
ć
nowy element tylko na ko
ń
cu kolejki, a usun
ąć
tylko na
pocz
ą
tku kolejki. Kolejka działa na zasadzie pami
ę
ci FIFO
(ang. Last Input – First Output) – pierwszy wprowadzony do niej element
zostanie pierwszy wyprowadzony.
Element 1
Element 2
Element 3
Element 4
Element 5
Pocz
ą
tek
kolejki
Koniec kolejki
32
PS/TP
PROGRAMOWANIE STRUKTURALNE
dane
wskaznik
dane
wskaznik
dane
wskaznik
dane
wskaznik
NIL
Pocz
ą
tek kolejki
wyj
ś
cie
wej
ś
cie
Koniec kolejki
KOLEJKA
33
PS/TP
PROGRAMOWANIE STRUKTURALNE
dane : string[70];
wkaznik : wskaznik_kolejki;
dane : string[70];
wskaznik : wskaznik_kolejki;
Budowa elementu kolejki
Pocz
ą
tek kolejki
NIL (koniec kolejki)
34
PS/TP
PROGRAMOWANIE STRUKTURALNE
Przykładowy program
PROGRAM Kolejka1;
USES
Crt;
TYPE
wskaznik_kolejki = ^skladnik_kolejki;
skladnik_kolejki = record
dane : string[70];
wskaznik : wskaznik_kolejki;
end;
VAR
{Deklaracje zmiennych dynamicznych}
poczatek_kolejki, koniec_kolejki, element : wskaznik_kolejki;
{Deklaracje zmiennych pomocniczych}
tekst : string;
koniec : boolean;
i,k,n : integer;
35
PS/TP
PROGRAMOWANIE STRUKTURALNE
{Procedura tworzenia kolejki i doł
ą
czania
na jej ko
ń
cu nowych składników}
procedure DoKolejki(var element : string[70];
var koniec_kolejki : wskaznik_kolejki);
var punkt : wskaznik_kolejki;
begin
punkt := koniec_kolejki;
New(koniec_kolejki);
koniec_kolejki^.dane := element;
koniec_kolejki^.wskaznik := NIL;
if (punkt<>NIL) then punkt^.wskaznik := koniec_kolejki;
end; {DoKolejki}
36
PS/TP
PROGRAMOWANIE STRUKTURALNE
{Procedura usuwania składnika
z pocz
ą
tku kolejki}
procedure ZKolejki(var element : string[70];
var poczatek_kolejki : wskaznik_kolejki);
var punkt : wskaznik_kolejki;
begin
if (poczatek_kolejki <> NIL) then
begin
element := poczatek_kolejki^.dane;
punkt := poczatek_kolejki^.wskaznik;
Dispose(poczatek_kolejki);
poczatek_kolejki := punkt;
end;
end; {ZKolejki}
BEGIN
ClrScr;
TextColor(YELLOW);
TextBackground(BLUE);
37
PS/TP
PROGRAMOWANIE STRUKTURALNE
GoToXY(32,1);
writeln('PRZYKŁAD KOLEJKI');
window(1,3,80,25);
TextBackground(BLACK);
write('Wprowad
ź
teksty (ka
ż
dy maks. 70 znaków)');
writeln('** - koniec wprowadzania');
koniec_kolejki := NIL;
i:=0;
koniec := false;
repeat
i:=i+1;
write('Tekst ',i,' :');
readln(tekst);
if (tekst='**') then koniec := true
else begin
DoKolejki(tekst,koniec_kolejki);
if (i=1) then poczatek_kolejki := koniec_kolejki;
end;
until koniec;
38
PS/TP
PROGRAMOWANIE STRUKTURALNE
if (i>1) then
begin
clrscr;
writeln('Kolejka została utworzona');
i:=i-1;
writeln('Liczba składników kolejki: ',i);
koniec := false;
repeat
writeln('Podaj liczb
ę
n tekstów do usuni
ę
cia ');
write('z kolejki (n<1 - koniec) : ');
readln(n);
if (n<1)
then koniec := true
else
if (n>i)
then writeln('Liczba składników kolejki : ',i)
39
PS/TP
PROGRAMOWANIE STRUKTURALNE
else begin
k:=0;
repeat
k:=k+1;
ZKolejki(tekst, poczatek_kolejki);
until (poczatek_kolejki=NIL) or (k=n);
writeln('Teksty pozostałe w kolejce:');
if (poczatek_kolejki=NIL)
then begin
writeln('Brak tekstów');
koniec := true;
end
else begin
i:=0;
element := poczatek_kolejki;
repeat
i:=i+1;
writeln('Tekst ',i,' : ');
writeln(element^.dane);
element := element^.wskaznik;
until (element=NIL);
40
PS/TP
PROGRAMOWANIE STRUKTURALNE
end
end
until koniec;
for k:=1 to i do ZKolejki(tekst, poczatek_kolejki);
writeln('Koniec programu');
Delay(2000);
end; {(i>1)}
writeln('Naci
ś
nij dowolny klawisz...');
Readkey;
END.
41
PS/TP
PROGRAMOWANIE STRUKTURALNE
LISTA JEDNOKIERUNKOWA
List
ą
liniow
ą
nazywamy liniowo uporz
ą
dkowany zbiór elementów, z którego
w dowolnym miejscu mo
ż
na usun
ąć
, jak równie
ż
doł
ą
czy
ć
nowy element.
W zale
ż
no
ś
ci od rodzajów poł
ą
cze
ń
pomi
ę
dzy elementami wyró
ż
niamy listy:
jednokierunkowe
dwukierunkowe
cykliczne
Element 1
Element 2
Element 3
Element 4
Element 5
42
PS/TP
PROGRAMOWANIE STRUKTURALNE
LISTA JEDNOKIERUNKOWA
List
ą
JEDNOKIERUNKOW
Ą
nazywamy liniowo uporz
ą
dkowany zbiór elementów,
W KRÓRYM dla ka
ż
dego elementu,
poza pierwszym
jest okre
ś
lony element poprzedni.
Element 1
Element 2
Element 3
Element 4
Element 5
Pocz
ą
tek LISTY
(pierwszy element)
Koniec listy
(ostatni element)
43
PS/TP
PROGRAMOWANIE STRUKTURALNE
dane
wskaznik
dane
wskaznik
dane
wskaznik
dane
wskaznik
NIL
Pocz
ą
tek listy
Koniec listy
LISTA JEDNOKIERUNKOWA „o kierunku do przodu”
44
PS/TP
PROGRAMOWANIE STRUKTURALNE
dane : string[70];
wskaznik : wskaznik_listy;
Budowa elementu LISTY JEDNOKIERUNKOWEJ
Poprzedni element
Nast
ę
pny element
45
PS/TP
PROGRAMOWANIE STRUKTURALNE
dane
wskaznik
dane
wskaznik
dane
wskaznik
NIL
Pocz
ą
tek listy
Koniec listy
LISTA JEDNOKIERUNKOWA „o kierunku do tyłu”
46
PS/TP
PROGRAMOWANIE STRUKTURALNE
dane : string[70];
wskaznik : wskaznik_listy;
Budowa elementu LISTY JEDNOKIERUNKOWEJ
47
PS/TP
PROGRAMOWANIE STRUKTURALNE
Tworzenie listy
PROGRAM Lista0; {Demonstracja listy jednokierunkowej}
USES
Crt;
TYPE
wskaznik_listy = ^skladnik_listy;
skladnik_listy = record
dane : string[70];
wskaznik : wskaznik_listy;
end;
VAR
{Deklaracje zmiennych dynamicznych}
pierwszy_skladnik,
biezacy_skladnik
: wskaznik_listy;
{Deklaracje zmiennych pomocniczych}
poprzedni, nastepny : wskaznik_listy;
48
PS/TP
PROGRAMOWANIE STRUKTURALNE
BEGIN
ClrScr;
{====================================}
writeln('Tworzenie listy');
writeln('Dodanie pierwszego składnika');
i:=0;
New(biezacy_skladnik);
biezacy_skladnik^.dane := 'AAAAAAAAAA';
biezacy_skladnik^.wskaznik := NIL;
pierwszy_skladnik := biezacy_skladnik;
dane = ‘AAAAAAAAAA’
wskaznik
pierwszy_skladnik
NIL
biezacy_skladnik
49
PS/TP
PROGRAMOWANIE STRUKTURALNE
writeln('Dodanie nast
ę
pnego składnika');
poprzedni := biezacy_skladnik;
New(biezacy_skladnik);
biezacy_skladnik^.dane := 'BBBBBBBBBB';
biezacy_skladnik^.wskaznik := NIL;
poprzedni^.wskaznik := biezacy_skladnik;
dane = ‘AAAAAAAAAA’
wskaznik
pierwszy_skladnik
biezacy_skladnik
NIL
dane = ‘BBBBBBBBBB’
wskaznik
50
PS/TP
PROGRAMOWANIE STRUKTURALNE
poprzedni := biezacy_skladnik;
New(biezacy_skladnik);
biezacy_skladnik^.dane := 'CCCCCCCCCC';
biezacy_skladnik^.wskaznik := NIL;
poprzedni^.wskaznik := biezacy_skladnik;
dane = ‘AAAAAAAAAA’
wskaznik
pierwszy_skladnik
biezacy_skladnik
NIL
dane = ‘BBBBBBBBBB’
wskaznik
dane = ‘CCCCCCCCCC’
wskaznik
51
PS/TP
PROGRAMOWANIE STRUKTURALNE
poprzedni := biezacy_skladnik;
New(biezacy_skladnik);
biezacy_skladnik^.dane := 'CCCCCCCCCC';
biezacy_skladnik^.wskaznik := NIL;
poprzedni^.wskaznik := biezacy_skladnik;
dane = ‘AAAAAAAAAA’
wskaznik
pierwszy_skladnik
biezacy_skladnik
NIL
dane = ‘BBBBBBBBBB’
wskaznik
dane = ‘CCCCCCCCCC’
wskaznik
dane = ‘DDDDDDDDDD’
wskaznik
52
PS/TP
GOTOWA LISTA
dane = ‘AAAAAAAAAA’
wskaznik
pierwszy_skladnik
biezacy_skladnik
NIL
dane = ‘BBBBBBBBBB’
wskaznik
dane = ‘CCCCCCCCCC’
wskaznik
dane = ‘DDDDDDDDDD’
wskaznik
PROGRAMOWANIE STRUKTURALNE
53
PS/TP
PROGRAMOWANIE STRUKTURALNE
Wy
ś
wietlanie listy
if (pierwszy_skladnik<>NIL) then
begin
biezacy_skladnik := pierwszy_skladnik;
repeat
writeln(biezacy_skladnik^.dane);
biezacy_skladnik := biezacy_skladnik^.wskaznik;
until (biezacy_skladnik=NIL);
end
else writeln('Lista jest pusta');
54
PS/TP
dane = ‘AAAAAAAAAA’
wskaznik
pierwszy_skladnik
biezacy_skladnik
NIL
dane = ‘BBBBBBBBBB’
wskaznik
dane = ‘CCCCCCCCCC’
wskaznik
dane = ‘DDDDDDDDDD’
wskaznik
PROGRAMOWANIE STRUKTURALNE
Kierunek
przesuwania
si
ę
wska
ź
nika
55
PS/TP
PROGRAMOWANIE STRUKTURALNE
Usuwanie elementów z listy
biezacy_skladnik := pierwszy_skladnik;
repeat
nastepny := biezacy_skladnik^.wskaznik;
Dispose(biezacy_skladnik);
biezacy_skladnik := nastepny;
pierwszy_skladnik := biezacy_skladnik;
until (nastepny=NIL);
56
PS/TP
PROGRAMOWANIE STRUKTURALNE
dane = ‘AAAAAAAAAA’
wskaznik
pierwszy_skladnik
biezacy_skladnik
NIL
dane = ‘BBBBBBBBBB’
wskaznik
dane = ‘CCCCCCCCCC’
wskaznik
dane = ‘DDDDDDDDDD’
wskaznik
Kierunek
przesuwania
si
ę
wska
ź
nika
Dispose
57
PS/TP
PROGRAMOWANIE STRUKTURALNE
pierwszy_skladnik
biezacy_skladnik
NIL
dane = ‘BBBBBBBBBB’
wskaznik
dane = ‘CCCCCCCCCC’
wskaznik
dane = ‘DDDDDDDDDD’
wskaznik
Kierunek
przesuwania
si
ę
wska
ź
nika
Dispose
58
PS/TP
PROGRAMOWANIE STRUKTURALNE
pierwszy_skladnik
biezacy_skladnik
NIL
dane = ‘CCCCCCCCCC’
wskaznik
dane = ‘DDDDDDDDDD’
wskaznik
Kierunek
przesuwania
si
ę
wska
ź
nika
Dispose
59
PS/TP
PROGRAMOWANIE STRUKTURALNE
pierwszy_skladnik
biezacy_skladnik
NIL
dane = ‘DDDDDDDDDD’
wskaznik
Dispose
60
PS/TP
PROGRAMOWANIE STRUKTURALNE
pierwszy_skladnik
biezacy_skladnik
NIL
nastepny
until (nastepny = NIL); {warunek zako
ń
czenia}
61
PS/TP
PROGRAMOWANIE STRUKTURALNE
DYREKTYWY KOMPILATORA
DYREKTYWY KOMPILATORA
DYREKTYWY KOMPILATORA
DYREKTYWY KOMPILATORA
62
PS/TP
PROGRAMOWANIE STRUKTURALNE
Kompilator słu
ż
y do przetłumaczenia programu u
ż
ytkownika (programu
ź
ródłowego
.PAS) na j
ę
zyk wewn
ę
trzny komputera. Po przetłumaczeniu programu jego
kod wynikowy mo
ż
e by
ć
zapisany na dysku (.EXE).
Dyrektywy kompilatora mog
ą
wyst
ą
pi
ć
w dowolnym miejscu programu
ź
ródłowego
i maj
ą
posta
ć
:
{$dyrektywa}
lub
{$dyrektywa parametry}
Dyrektywa wyst
ę
puje bezpo
ś
rednio po znaku $ (odst
ę
p nie jest tu dozwolony),
a pomi
ę
dzy ni
ą
i parametrami musi wyst
ą
pi
ć
przynajmniej jeden odst
ę
p.
63
PS/TP
PROGRAMOWANIE STRUKTURALNE
Wyró
ż
niamy trzy grupy dyrektyw kompilatora:
dyrektywy przeł
ą
cznikowe, które odpowiednie cechy kompilatora wł
ą
czone
lub wył
ą
czone (aktywne lub nie aktywne),
dyrektywy parametryczne, które przekazuj
ą
informacje kompilatorowi
(nazwy zbiorów i rozmiary pami
ę
ci),
dyrektywy warunkowe, które stosowane s
ą
w celu sterowania warunkow
ą
kompilacj
ą
okre
ś
lonych cz
ęś
ci kodu
ź
ródłowego.
64
PS/TP
PROGRAMOWANIE STRUKTURALNE
Dyrektywy przeł
ą
cznikowe, które odpowiednie cechy kompilatora wł
ą
czone
lub wył
ą
czone (aktywne lub nie aktywne),
Options/Compiler/Var-string checking
Lokalna
{$V+}
{$V}
Options/Compiler/Stack checking
Lokalna
{$S+}
{$S}
Options/Compiler/Range checking
Lokalna
{$R-}
{$R}
Options/Compiler/IO checking
Lokalna
{$I+}
{$I}
Options/Compiler/Debug information
Globalna
{$D+}
{$D}
Options/Compiler/Boolean evaluation
Lokalna
{$B-}
{$B}
Options/Compiler/Align data
Globalna
{$A+}
{$A}
Odpowiednik w menu
Typ dyrektywy
Warto
ść
domy
ś
lna
Dyrektywa
65
PS/TP
PROGRAMOWANIE STRUKTURALNE
Dyrektywy parametryczne, które przekazuj
ą
informacje kompilatorowi
(nazwy zbiorów i rozmiary pami
ę
ci),
{$dyrektywa parametry}
Doł
ą
czenie zbioru
ź
ródłowego .PAS
Przykład:
Prog test;
{$I PROC1.PAS}
Begin
…..
End.
{$I nazwa-zbioru}
66
PS/TP
PROGRAMOWANIE STRUKTURALNE
Przykład – plik PROC1.PAS:
procedure NaStos;
var punkt : wskaznik_stosu;
begin
end; {NaStos}
67
PS/TP
PROGRAMOWANIE STRUKTURALNE
PROGRAM PROG1.PAS
USES Crt;
{$I PROC1.PAS}
BEGIN
ClrScr;
TextColor(YELLOW);
TextBackground(BLUE);
END.
Przykład – plik PROG1.PAS:
68
PS/TP
PROGRAMOWANIE STRUKTURALNE
PROGRAM PROG1.PAS
USES Crt;
procedure NaStos;
var punkt : wskaznik_stosu;
begin
end; {NaStos}
BEGIN
ClrScr;
TextColor(YELLOW);
TextBackground(BLUE);
END.
Kompilator skompiluje nast
ę
puj
ą
cy tekst:
69
PS/TP
PROGRAMOWANIE STRUKTURALNE
Doł
ą
czenie zbioru .OBJ
Przykład:
Prog test2;
{$L PROC2.OBJ}
Begin
…..
End.
{$L nazwa-zbioru}
70
PS/TP
PROGRAMOWANIE STRUKTURALNE
Dyrektywy warunkowe, które stosowane s
ą
w celu sterowania warunkow
ą
kompilacj
ą
okre
ś
lonych cz
ęś
ci kodu
ź
ródłowego.
Słu
żą
do tworzenia
wariantowych dyrektyw
warunkowych
{$ENDIF}
{$ELSE}
Powoduje skompilowanie
wyst
ę
puj
ą
cego po niej tekstu w
przypadku, gdy nazwa
symboliczna nie jest
zdefiniowana
{$IFNDEF TEST}
{$IFNDEF nazwa-symbolicz}
Powoduje skompilowanie
wyst
ę
puj
ą
cego po niej tekstu w
przypadku, gdy nazwa
symboliczna jest zdefiniowana
{$IFDEF TEST}
{$IFDEF nazwa-symbolicz}
Ustala stan niezdefiniowania
nazwy symbolicznej
{$UNDEF TEST}
{$UNDEF nazwa-symbolicz}
Definiuje nazw
ę
symboliczn
ą
{$DEFINE TEST}
{$DEFINE nazwa-symbolicz}
Opis dyrektywy
Warto
ść
przykładowa
Dyrektywa
71
PS/TP
PROGRAMOWANIE STRUKTURALNE
Program prog1;
Uses Crt;
{$DEFINE TEST}
Begin
ClrScr;
{$IFDEF TEST}
Writeln(‘Przebieg testowy programu’);
ReadKey;
{$ELSE}
Writeln(‘Obliczenia’);
{$ENDIF}
End.
72
PS/TP
PROGRAMOWANIE STRUKTURALNE
Program prog1;
Uses Crt;
Begin
ClrScr;
Writeln(‘Przebieg testowy programu’);
ReadKey;
End.
Dyrektywy warunkowe spowoduj
ą
,
ż
e kod
ź
ródłowy programu b
ę
dzie
traktowany przez kompilator tak jak poni
ż
szy.
73
PS/TP
PROGRAMOWANIE STRUKTURALNE
REJESTRY PROCESORA
REJESTRY PROCESORA
REJESTRY PROCESORA
REJESTRY PROCESORA
74
PS/TP
PROGRAMOWANIE STRUKTURALNE
Ś
rodowiska Turbo Pascal 6.0/7.x oraz Free Pascal Compiler posiadaj
ą
wbudowany j
ę
zyk asemblerowy Build-In Assembler. Dzi
ę
ki niemu mo
ż
na pisa
ć
krótkie wstawki asemblerowe w kodzie pascalowym.
Trzeba jednak zna
ć
troch
ę
podstaw na temat rejestrów procesora Intel widocznych
w trybie 16-bitowym (pami
ę
taj,
ż
e Turbo Pascal zatrzymał si
ę
w swoim rozwoju na
Procesorze Intel 80486).
Symbole rejestrów procesora Intel 80486
═══════════════════════════════
AX BX CX DX
16-bitowe ogólnego przeznaczenia
AL BL CL DL
8-bitowe dolne połówki rejestrów
AH BH CH DH
8-bitowe górne połówki rejestrów
SP BP SI DI
16-bitowe rejestry dla wska
ź
ników lub indeksów
CS DS SS ES
16-bitowe rejestry segmentowe
ST 8087 rejestr dla stosu
75
PS/TP
PROGRAMOWANIE STRUKTURALNE
Dost
ę
p do wbudowanego asemblera odbywa si
ę
za pomoc
ą
słowa kluczowego
asm
.
Składnia:
asm
ci
ą
g rozkazów asemblera
end
Uwaga:
Je
ś
li w jednej linii umieszczasz wiele rozkazów asemblera to rozdzielaj je
ś
rednikami.
………….
asm {pocz
ą
tek wstawki asemblerowej}
sekwencja rozkazów asemblera
end; {koniec wstawki asemblerowej}
………….
76
PS/TP
PROGRAMOWANIE STRUKTURALNE
WBUDOWANY ASEMBLER
WBUDOWANY ASEMBLER
WBUDOWANY ASEMBLER
WBUDOWANY ASEMBLER
77
PS/TP
PROGRAMOWANIE STRUKTURALNE
Ś
rodowiska Turbo Pascal 6.0/7.x oraz Free Pascal Compiler posiadaj
ą
wbudowany j
ę
zyk asemblerowy Build-In Assembler.
Dzi
ę
ki niemu mo
ż
na pisa
ć
krótkie wstawki asemblerowe w kodzie pascalowym.
W kompilatorze Free Pascal Compiler nale
ż
y sprawdzi
ć
ustawienia
nast
ę
puj
ą
cych opcji:
Options
Compiler
Compiler Mode: Turbo Pascal compatible
Options
Compiler
Assembler
Intel Style assembler
Przykładowa wstawka asemblerowa:
asm
{pocz
ą
tek wstawki asemblerowej}
mov ax, 20
mul wynik
mov wynik, ax
end;
{koniec wstawki asemblerowej}
78
PS/TP
PROGRAMOWANIE STRUKTURALNE
Przykładowy program:
program asm1;
uses crt;
var
wynik : word;
BEGIN
clrscr;
wynik := 10;
asm {pocz
ą
tek wstawki asemblerowej}
mov ax, 20 {zaladuj liczbe 20 do rejestru ax}
mul wynik {pomnoz wynik przez rejestr ax}
mov wynik, ax {zaladuj rejestr ax do zmiennej wynik}
end; {koniec wstawki asemblerowej}
writeln(wynik);
readkey;
END.
79
PS/TP
PROGRAMOWANIE STRUKTURALNE
Przykładowy program (
tylko w Turbo Pascalu
):
program asm2;
uses crt;
var
licznik : byte;
losowanie : word;
BEGIN
clrscr;
randomize;
writeln('Nacisnij dowolny klawisz, to narysuje 200 zielonych pikseli');
readkey;
asm
mov ah, 00h { 00h do rejestru ah }
mov al, 13h { 13h do rejestru al - nr trybu pracy karty graficznej}
int 10h { wywolaj przerwanie 10h }
end;
80
PS/TP
PROGRAMOWANIE STRUKTURALNE
Przykładowy program:
for licznik := 0 to 199 do
begin
losowanie := random(64000);
asm
mov ax, 0A000h;
mov es, ax
mov di, losowanie
mov byte ptr es:[di], 2 {zaladuj 2 do komorki pamieci pod adresem ES:DI}
{FPC error: 16-bit reference not supported}
end;
end; {koniec petli for}
readkey;
END.
81
PS/TP
PROGRAMOWANIE STRUKTURALNE
Przykładowy program (
tylko w Turbo Pascalu
):
program asm3;
uses crt;
procedure ZamalujEkran(kolor : byte);
begin
asm
mov ah, 00h
mov al, 13h
int 10h {uruchomienie trybu graficznego}
mov ax, 0A000h;
mov es, ax
mov di, 0
mov cx, 32000
mov ah, kolor
mov al, ah
cld
rep stosw
{zamalowanie kolorem}
end;
end; {ZamalujEkran}
82
PS/TP
PROGRAMOWANIE STRUKTURALNE
Przykładowy program:
BEGIN
clrscr;
writeln('Nacisnij dowolny klawisz, aby zamalowac ekran');
readkey;
ZamalujEkran(RED);
writeln('Nacisnij dowolny klawisz, aby zakonczyc');
readkey;
END.