pas czesc 4a

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

ą

,

ż

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


Wyszukiwarka

Podobne podstrony:
Czesc 4a Blachownice, Elem rozciag
pas czesc 1b
pas czesc 1c
pas czesc 0
pas czesc 1d
pas czesc 4b id 349723 Nieznany
pas czesc 3
pas czesc 1a
Czesc 4a Blachownice, Elem rozciag
4.4A Zadania testowe - część A , ZESP?? SZK?? DRZEWNYCH
88 Leki przeciwreumatyczne część 2

więcej podobnych podstron