background image

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

background image

2

PS/TP

PROGRAMOWANIE STRUKTURALNE

WSKA

Ź

NIKI

background image

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. 

background image

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

background image

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;

background image

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). 

background image

7

PS/TP

PROGRAMOWANIE STRUKTURALNE

program ptr1;
uses Crt;

type

Tdane =  record

nazwisko  : string;
imie

: string

end;

PTdane = ^Tdane;

var

ptr :  PTdane;

Przykład

background image

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.

background image

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

background image

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

background image

11

PS/TP

PROGRAMOWANIE STRUKTURALNE

Wska

ź

niki i tablica dynamiczna

background image

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

background image

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.

background image

14

PS/TP

PROGRAMOWANIE STRUKTURALNE

Funkcje i procedury dynamicznego 

przydziału pami

ę

ci

background image

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^

background image

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^

background image

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 )

background image

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;

background image

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;

background image

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

background image

21

PS/TP

PROGRAMOWANIE STRUKTURALNE

dane 

wskaznik

dane 

wskaznik

dane 

wskaznik

dane 

wskaznik

NIL

wierzchołek 

stosu

wej

ś

cie

wyj

ś

cie

background image

22

PS/TP

PROGRAMOWANIE STRUKTURALNE

dane : string[70];
wkaznik : wskaznik_stosu;

dane : string[70];
wskaznik : wskaznik_stosu;

Budowa elementu 

wierzcholek

NIL

background image

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;

background image

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} 

background image

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}

background image

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;

background image

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)

background image

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;

background image

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.                

background image

30

PS/TP

PROGRAMOWANIE STRUKTURALNE

Kolejka składaj

ą

ca si

ę

ludków oczekuj

ą

cych na swoje mieszkanie.

background image

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

background image

32

PS/TP

PROGRAMOWANIE STRUKTURALNE

dane 

wskaznik

dane 

wskaznik

dane 

wskaznik

dane 

wskaznik

NIL

Pocz

ą

tek kolejki

wyj

ś

cie

wej

ś

cie

Koniec kolejki 

KOLEJKA

background image

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)

background image

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;

background image

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}

background image

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);

background image

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;

background image

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)

background image

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);

background image

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.

background image

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

background image

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)

background image

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”

background image

44

PS/TP

PROGRAMOWANIE STRUKTURALNE

dane : string[70];
wskaznik : wskaznik_listy;

Budowa elementu LISTY JEDNOKIERUNKOWEJ 

Poprzedni element

Nast

ę

pny element

background image

45

PS/TP

PROGRAMOWANIE STRUKTURALNE

dane 

wskaznik

dane 

wskaznik

dane 

wskaznik

NIL

Pocz

ą

tek listy

Koniec listy

LISTA JEDNOKIERUNKOWA „o kierunku do tyłu”

background image

46

PS/TP

PROGRAMOWANIE STRUKTURALNE

dane : string[70];
wskaznik : wskaznik_listy;

Budowa elementu LISTY JEDNOKIERUNKOWEJ 

background image

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;

background image

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

background image

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

background image

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

background image

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

background image

52

PS/TP

GOTOWA LISTA

dane = ‘AAAAAAAAAA’
wskaznik

pierwszy_skladnik

biezacy_skladnik

NIL

dane = ‘BBBBBBBBBB’
wskaznik

dane = ‘CCCCCCCCCC’
wskaznik

dane = ‘DDDDDDDDDD’
wskaznik

PROGRAMOWANIE STRUKTURALNE

background image

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');

background image

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

background image

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);

background image

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

background image

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

background image

58

PS/TP

PROGRAMOWANIE STRUKTURALNE

pierwszy_skladnik

biezacy_skladnik

NIL

dane = ‘CCCCCCCCCC’
wskaznik

dane = ‘DDDDDDDDDD’
wskaznik

Kierunek 

przesuwania 

si

ę

wska

ź

nika

Dispose

background image

59

PS/TP

PROGRAMOWANIE STRUKTURALNE

pierwszy_skladnik

biezacy_skladnik

NIL

dane = ‘DDDDDDDDDD’
wskaznik

Dispose

background image

60

PS/TP

PROGRAMOWANIE STRUKTURALNE

pierwszy_skladnik

biezacy_skladnik

NIL

nastepny

until (nastepny = NIL); {warunek zako

ń

czenia}

background image

61

PS/TP

PROGRAMOWANIE STRUKTURALNE

DYREKTYWY KOMPILATORA

DYREKTYWY KOMPILATORA

DYREKTYWY KOMPILATORA

DYREKTYWY KOMPILATORA

background image

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.

background image

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.

background image

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

background image

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}

background image

66

PS/TP

PROGRAMOWANIE STRUKTURALNE

Przykład – plik PROC1.PAS:

procedure NaStos;

var punkt : wskaznik_stosu;
begin
end; {NaStos} 

background image

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:

background image

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:

background image

69

PS/TP

PROGRAMOWANIE STRUKTURALNE

Doł

ą

czenie zbioru  .OBJ

Przykład:

Prog test2;
{$L  PROC2.OBJ}
Begin
…..
End.

{$L   nazwa-zbioru}

background image

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

background image

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.

background image

72

PS/TP

PROGRAMOWANIE STRUKTURALNE

Program prog1;
Uses Crt;
Begin
ClrScr;
Writeln(‘Przebieg testowy programu’);
ReadKey;
End.

Dyrektywy warunkowe spowoduj

ą

Ŝ

kod 

ź

ródłowy programu b

ę

dzie

traktowany przez kompilator tak jak poni

Ŝ

szy.

background image

73

PS/TP

PROGRAMOWANIE STRUKTURALNE

REJESTRY PROCESORA

REJESTRY PROCESORA

REJESTRY PROCESORA

REJESTRY PROCESORA

background image

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

background image

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}

………….

background image

76

PS/TP

PROGRAMOWANIE STRUKTURALNE

WBUDOWANY ASEMBLER

WBUDOWANY ASEMBLER

WBUDOWANY ASEMBLER

WBUDOWANY ASEMBLER

background image

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}

background image

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.

background image

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;

background image

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.

background image

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}

background image

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.