26.02.2015 Views

Skripte za vezbe iz SPA1 - Univerzitet u Novom Sadu

Skripte za vezbe iz SPA1 - Univerzitet u Novom Sadu

Skripte za vezbe iz SPA1 - Univerzitet u Novom Sadu

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Skripte</strong> <strong>za</strong> vežbe <strong>iz</strong> predmeta<br />

STRUKTURE PODATAKA I ALGORITMI I<br />

Vladimir Kurbalija<br />

Departman <strong>za</strong> matematiku i informatiku<br />

Prirodno-matematički fakultet<br />

<strong>Univerzitet</strong> u <strong>Novom</strong> <strong>Sadu</strong><br />

e-mail: kurba@im.ns.ac.yu<br />

1


ZADATAK: Pronaći sve pitagorine trojke do <strong>za</strong>date granice.<br />

MODULE Trojke1;<br />

(* Pitagorine trojke koriscenjem "Brute-force" *)<br />

FROM InOut IMPORT WriteString, WriteLn, WriteCard;<br />

CONST<br />

Gr = 100;<br />

VAR<br />

x, y, z : [1 .. Gr];<br />

BEGIN<br />

FOR x := 1 TO Gr DO<br />

FOR y := 1 TO Gr DO<br />

FOR z := 1 TO Gr DO<br />

IF x*x + y*y = z*z THEN<br />

WriteLn;<br />

WriteString('x = ');<br />

WriteCard(x,2);<br />

WriteString(', y = ');<br />

WriteCard(y,2);<br />

WriteString(', z = ');<br />

WriteCard(z,2)<br />

END<br />

END<br />

END<br />

END<br />

END Trojke1.<br />

MODULE Trojke2;<br />

(*Pitagorine trojke koriscenjem <strong>za</strong>okrugljivanja*)<br />

FROM InOut IMPORT WriteString, WriteLn, WriteCard;<br />

FROM MATHLIB IMPORT Sqrt;<br />

CONST<br />

Gr = 100;<br />

VAR<br />

x, y, z : [1 .. Gr];<br />

zreal : REAL;<br />

BEGIN<br />

FOR x := 1 TO Gr DO<br />

FOR y := 1 TO Gr DO<br />

zreal := REAL(Sqrt(LONGREAL(x*x + y*y)));<br />

z := TRUNC(zreal);<br />

IF zreal = FLOAT(z) THEN<br />

WriteLn;<br />

WriteString('x = ');<br />

WriteCard(x,2);<br />

WriteString(', y = ');<br />

WriteCard(y,2);<br />

WriteString(', z = ');<br />

WriteCard(z,2)<br />

END<br />

END<br />

END<br />

END Trojke2.<br />

MODULE Trojke3;<br />

(* Pitagorine trojke koriscenjem toereme *)<br />

FROM InOut IMPORT WriteString, WriteLn, WriteCard;<br />

CONST<br />

Gr = 10;<br />

VAR<br />

x, y, z, m, n : CARDINAL;<br />

BEGIN<br />

FOR m := 1 TO Gr DO<br />

FOR n := 1 TO m-1 DO<br />

x := m*m - n*n;<br />

y := 2*m*n;<br />

z := m*m + n*n;<br />

WriteLn;<br />

WriteString('x = ');<br />

WriteCard(x,2);<br />

WriteString(', y = ');<br />

WriteCard(y,2);<br />

WriteString(', z = ');<br />

WriteCard(z,2)<br />

END<br />

END<br />

END Trojke3.<br />

MODULE Trojke4;<br />

(* Pitagorine trojke kod kojih je razlika <strong>iz</strong>medju<br />

katete i hipotenuze tacno 1 *)<br />

FROM InOut IMPORT WriteString, WriteLn, WriteCard;<br />

CONST<br />

Gr = 10;<br />

VAR<br />

x, y, z, m, n : CARDINAL;<br />

BEGIN<br />

FOR m := 2 TO Gr DO<br />

n := m - 1;<br />

x := m*m - n*n;<br />

y := 2*m*n;<br />

z := m*m + n*n;<br />

WriteLn;<br />

WriteString('x = ');<br />

WriteCard(x,2);<br />

WriteString(', y = ');<br />

WriteCard(y,2);<br />

WriteString(', z = ');<br />

WriteCard(z,2)<br />

END<br />

END Trojke4.<br />

MODULE Trojke5;<br />

(* Pitagorine trojke kod kojih je razlika <strong>iz</strong>medju<br />

kateta jedan *)<br />

FROM InOut IMPORT WriteString, WriteLn, WriteCard;<br />

CONST<br />

Gr = 100;<br />

VAR<br />

x, y, z, m, n, w, i, temp : CARDINAL;<br />

BEGIN<br />

w := 1;<br />

n := 0;<br />

FOR i := 1 TO Gr DO<br />

m := n + w;<br />

x := m*m - n*n;<br />

y := 2*m*n;<br />

z := m*m + n*n;<br />

WriteLn;<br />

WriteString('x = ');<br />

WriteCard(x,2);<br />

WriteString(', y = ');<br />

WriteCard(y,2);<br />

WriteString(', z = ');<br />

WriteCard(z,2);<br />

temp := w;<br />

w := 3*w + 4*n;<br />

n := 2*temp + 3*n<br />

END<br />

END Trojke5.<br />

ZADATAK: Maksimalna suma pro<strong>iz</strong>voljnog broja susendnih<br />

elemenata u n<strong>iz</strong>u celih brojeva.<br />

MODULE MaxNi<strong>za</strong>1;<br />

(* Prvo resenje. Brute Force: O(n^3) *)<br />

FROM InOut IMPORT<br />

WriteString,ReadInt,WriteInt,WriteCard,WriteLn;<br />

CONST<br />

N = 10;<br />

TYPE<br />

Interval = [1..N];<br />

VAR<br />

Max, Suma : INTEGER;<br />

d,g,i,Ood,Doo : Interval;<br />

X : ARRAY Interval OF INTEGER;<br />

BEGIN<br />

WriteString(' Unesite n<strong>iz</strong> X ');<br />

WriteLn;<br />

FOR i := 1 TO N DO<br />

ReadInt(X[i]);<br />

WriteLn<br />

END;<br />

Max := 0;<br />

FOR d := 1 TO N DO<br />

FOR g := 1 TO N DO<br />

Suma := 0;<br />

FOR i := d TO g DO<br />

Suma := Suma + X[i]<br />

END;<br />

IF Suma > Max THEN<br />

Max := Suma;<br />

Ood := d;<br />

Doo := g<br />

END<br />

END<br />

END;<br />

WriteLn;<br />

WriteString(' Maksimum je ');<br />

2


WriteInt(Max,3);<br />

WriteString(' u intervalu od ');<br />

WriteCard(Ood,3);<br />

WriteString(' do ');<br />

WriteCard(Doo,3)<br />

END MaxNi<strong>za</strong>1.<br />

MODULE MaxNi<strong>za</strong>2;<br />

(* Drugo resenje: O(n^2). Koristi se cinjenica da je<br />

suma X[d..g] <strong>iz</strong>racunljiva <strong>iz</strong> X[d..g-1]. *)<br />

FROM InOut IMPORT<br />

WriteString,ReadInt,WriteInt,WriteCard,WriteLn;<br />

CONST<br />

N = 10;<br />

TYPE<br />

Interval = [1..N];<br />

VAR<br />

Max, Suma : INTEGER;<br />

d,g,i,Ood,Doo : Interval;<br />

X : ARRAY Interval OF INTEGER;<br />

BEGIN<br />

WriteString(' Unesite n<strong>iz</strong> X ');<br />

WriteLn;<br />

FOR i := 1 TO N DO<br />

ReadInt(X[i]);<br />

WriteLn<br />

END;<br />

Max := 0;<br />

FOR d := 1 TO N DO<br />

Suma := 0;<br />

FOR g := d TO N DO<br />

Suma := Suma + X[g];<br />

IF Suma > Max THEN<br />

Max := Suma;<br />

Ood := d;<br />

Doo := g<br />

END<br />

END<br />

END;<br />

WriteLn;<br />

WriteString(' Maksimum je ');<br />

WriteInt(Max,3);<br />

WriteString(' u intervalu od ');<br />

WriteCard(Ood,3);<br />

WriteString(' do ');<br />

WriteCard(Doo,3)<br />

END MaxNi<strong>za</strong>2.<br />

MODULE MaxNi<strong>za</strong>3;<br />

(* Trece resenje: O(n^2). Koristi pomocni n<strong>iz</strong> u kome je<br />

na i-tom mestu suma podni<strong>za</strong> x[1..i] *)<br />

FROM InOut IMPORT<br />

WriteString,ReadInt,WriteInt,WriteCard,WriteLn;<br />

CONST<br />

N = 10;<br />

TYPE<br />

Interval = [1..N];<br />

VAR<br />

Max, Suma : INTEGER;<br />

d,g,i,Ood,Doo : Interval;<br />

X : ARRAY Interval OF INTEGER;<br />

Pom : ARRAY [0..N] OF INTEGER;<br />

BEGIN<br />

WriteString(' Unesite n<strong>iz</strong> X ');<br />

WriteLn;<br />

FOR i := 1 TO N DO<br />

ReadInt(X[i]);<br />

WriteLn<br />

END;<br />

Pom[0] := 0;<br />

FOR i := 1 TO N DO<br />

Pom[i] := Pom[i-1] + X[i]<br />

END;<br />

Max := 0;<br />

FOR d := 1 TO N DO<br />

FOR g := d TO N DO<br />

Suma := Pom[g] - Pom[d-1];<br />

IF Suma > Max THEN<br />

Max := Suma;<br />

Ood := d;<br />

Doo := g<br />

END<br />

END<br />

END;<br />

WriteLn;<br />

WriteString(' Maksimum je ');<br />

WriteInt(Max,3);<br />

WriteString(' u intervalu od ');<br />

3<br />

WriteCard(Ood,3);<br />

WriteString(' do ');<br />

WriteCard(Doo,3)<br />

END MaxNi<strong>za</strong>3.<br />

MODULE MaxNi<strong>za</strong>4;<br />

(* Cetvrto resenje. Najbolje moguce: O(n) *)<br />

FROM InOut IMPORT<br />

WriteString,ReadInt,WriteInt,WriteCard,WriteLn;<br />

CONST<br />

N = 10;<br />

TYPE<br />

Interval = [1..N];<br />

VAR<br />

Max, MaxDovde : INTEGER;<br />

i,d,Ood,Doo : Interval;<br />

X : ARRAY Interval OF INTEGER;<br />

BEGIN<br />

WriteString(' Unesite n<strong>iz</strong> X ');<br />

WriteLn;<br />

FOR i := 1 TO N DO<br />

ReadInt(X[i]);<br />

WriteLn<br />

END;<br />

Max := 0;<br />

MaxDovde := 0;<br />

FOR i := 1 TO N DO<br />

IF MaxDovde = 0 THEN<br />

d := i<br />

END;<br />

MaxDovde := MaxDovde + X[i];<br />

IF MaxDovde < 0 THEN<br />

MaxDovde := 0<br />

END;<br />

IF MaxDovde > Max THEN<br />

Ood := d;<br />

Doo := i;<br />

Max := MaxDovde<br />

END<br />

END;<br />

WriteLn;<br />

WriteString(' Maksimum je ');<br />

WriteInt(Max,3);<br />

WriteString(' u intervalu od ');<br />

WriteCard(Ood,3);<br />

WriteString(' do ');<br />

WriteCard(Doo,3)<br />

END MaxNi<strong>za</strong>4.<br />

ZADATAK: Ilustracija rada sa nekim standardnim modulima.<br />

MODULE Primer;<br />

FROM InOut IMPORT ReadString, ReadCard, Read, WriteLn,<br />

WriteString, WriteCard;<br />

FROM FIO IMPORT File, StandardOutput, PrinterDevice,<br />

Create, Close, Exists, WrCard, WrStr, WrReal, WrLn,<br />

WrChar, WrLngReal;<br />

FROM Str IMPORT Length, Slice;<br />

FROM Lib IMPORT Sound, NoSound, Delay;<br />

FROM MATHLIB IMPORT Sqrt, Log;<br />

CONST<br />

Gr = 5;<br />

TYPE<br />

string = ARRAY [1..50] OF CHAR;<br />

podatakTip = RECORD<br />

UcitString : string;<br />

UcitBroj : CARDINAL<br />

END;<br />

VAR<br />

imedat : string;<br />

UlazniPod : ARRAY [1..Gr] OF podatakTip;<br />

PodStr : ARRAY [1..4] OF CHAR;<br />

<strong>iz</strong>laz : File;<br />

i, frekv : CARDINAL;<br />

<strong>iz</strong>bor : CHAR;<br />

BEGIN<br />

REPEAT<br />

WriteString('p - <strong>iz</strong>laz na printer');<br />

WriteLn;<br />

WriteString('f - <strong>iz</strong>laz u fajl');<br />

WriteLn;<br />

WriteString('e - ekran');<br />

WriteLn;<br />

Read(<strong>iz</strong>bor)<br />

UNTIL (CAP(<strong>iz</strong>bor) = 'P') OR (CAP(<strong>iz</strong>bor) = 'F') OR<br />

(CAP(<strong>iz</strong>bor) = 'E');<br />

IF CAP(<strong>iz</strong>bor) = 'P' THEN<br />

<strong>iz</strong>laz := PrinterDevice;


ELSIF CAP(<strong>iz</strong>bor) = 'F' THEN<br />

REPEAT<br />

WriteString('Unesite ime fajla ---- ');<br />

ReadString(imedat);<br />

WriteLn<br />

UNTIL Length(imedat) > 0;<br />

IF Exists(imedat) THEN<br />

WriteString('Fajl ');<br />

WriteString(imedat);<br />

WriteString(' vec postoji. Bice <strong>za</strong>menjen<br />

novim.');<br />

WriteLn<br />

END;<br />

<strong>iz</strong>laz := Create(imedat)<br />

ELSE<br />

<strong>iz</strong>laz := StandardOutput<br />

END;<br />

FOR i := 1 TO Gr DO<br />

WITH UlazniPod[i] DO<br />

WriteString('Unesite ');<br />

WriteCard(i,2);<br />

WriteString(' .broj ----- ');<br />

ReadCard(UcitBroj);<br />

WriteLn;<br />

WriteString('Unesite ');<br />

WriteCard(i,2);<br />

WriteString('. string --- ');<br />

ReadString(UcitString);<br />

WriteLn;<br />

END;<br />

END;<br />

FOR i := 1 TO Gr DO<br />

WITH UlazniPod[i] DO<br />

WrCard(<strong>iz</strong>laz,UcitBroj,5);<br />

WrChar(<strong>iz</strong>laz,' ');<br />

WrStr(<strong>iz</strong>laz,UcitString);<br />

WrChar(<strong>iz</strong>laz,' ');<br />

IF Length(UcitString) < 5 THEN<br />

WrStr(<strong>iz</strong>laz,'Ne moze se napraviti trazeni<br />

podstring')<br />

ELSE<br />

Slice(PodStr,UcitString,1,4);<br />

WrStr(<strong>iz</strong>laz,PodStr)<br />

END;<br />

WrLngReal(<strong>iz</strong>laz,Sqrt(Log(LONGREAL(UcitBroj))),<br />

10,12);<br />

WrLn(<strong>iz</strong>laz)<br />

END;<br />

FOR frekv := 50 TO 150 DO<br />

Sound(frekv);<br />

Delay(10)<br />

END;<br />

NoSound;<br />

END;<br />

Close(<strong>iz</strong>laz)<br />

END Primer.<br />

ZADATAK: Prikaz osnovih operacija nad listama real<strong>iz</strong>ovanih<br />

pomoću pokazivača.<br />

MODULE Radnici;<br />

FROM InOut IMPORT WriteString, ReadString,WriteLn,<br />

WriteCard, ReadCard, Done, Read;<br />

FROM Window IMPORT Clear;<br />

FROM Storage IMPORT ALLOCATE, DEALLOCATE;<br />

TYPE<br />

skupZn = SET OF CHAR;<br />

str = ARRAY [1..20] OF CHAR;<br />

radnici = POINTER TO slog;<br />

slog = RECORD<br />

ime, prez : str;<br />

broj : CARDINAL;<br />

sled : radnici<br />

END;<br />

VAR<br />

meni, pom : CHAR;<br />

rad : radnici;<br />

PROCEDURE Spisak(rad : radnici);<br />

BEGIN<br />

WHILE rad # NIL DO<br />

WriteString(rad^.ime);<br />

WriteString(' ');<br />

WriteString(rad^.prez);<br />

WriteCard(rad^.broj, 8);<br />

WriteLn;<br />

rad := rad^.sled<br />

END<br />

END Spisak;<br />

4<br />

(*PROCEDURE Spisak(rad : radnici);<br />

BEGIN<br />

IF rad # NIL THEN<br />

WriteString(rad^.ime);<br />

WriteString(' ');<br />

WriteString(rad^.prez);<br />

WriteCard(rad^.broj, 8);<br />

WriteLn;<br />

Spisak(rad^.sled)<br />

END<br />

END Spisak; *)<br />

PROCEDURE Zaposli(VAR rad : radnici);<br />

VAR<br />

novi, tek : radnici;<br />

nadjen : BOOLEAN;<br />

BEGIN<br />

NEW(novi);<br />

REPEAT<br />

WriteString('Unesite ime prezime i jedinstveni<br />

broj novog radnika:');<br />

WriteLn;<br />

ReadString(novi^.ime);<br />

ReadString(novi^.prez);<br />

ReadCard(novi^.broj);<br />

nadjen := FALSE;<br />

tek := rad;<br />

WHILE NOT nadjen AND (tek # NIL) AND<br />

(tek^.broj br) THEN<br />

WriteString('Greska.')<br />

ELSE<br />

pom := tek^.sled;<br />

tek^.sled := tek^.sled^.sled;<br />

DISPOSE(pom)<br />

END<br />

END<br />

END Otpusti;<br />

PROCEDURE Inform(rad : radnici);<br />

VAR<br />

br : CARDINAL;


BEGIN<br />

REPEAT<br />

WriteLn;<br />

WriteString('Unesite redni broj radnika -- ');<br />

ReadCard(br)<br />

UNTIL Done;<br />

WriteLn;<br />

WHILE (rad # NIL) AND (rad^.broj < br) DO<br />

rad := rad^.sled<br />

END;<br />

IF (rad = NIL) OR (rad^.broj # br) THEN<br />

WriteString('Greska.')<br />

ELSE<br />

WriteString(rad^.ime);<br />

WriteString(' ');<br />

WriteString(rad^.prez)<br />

END<br />

END Inform;<br />

PROCEDURE Bankrot(VAR rad : radnici);<br />

VAR<br />

pom : radnici;<br />

BEGIN<br />

WHILE rad # NIL DO<br />

pom := rad;<br />

rad := rad^.sled;<br />

DISPOSE(pom)<br />

END<br />

END Bankrot;<br />

BEGIN<br />

rad := NIL;<br />

REPEAT<br />

Clear;<br />

WriteString('s - spisak svih <strong>za</strong>poslenih');<br />

WriteLn;<br />

WriteString('z - <strong>za</strong>poslavanje novog radnika');<br />

WriteLn;<br />

WriteString('o - otpustanje radnika');<br />

WriteLn;<br />

WriteString('i - informacije o radniku');<br />

WriteLn;<br />

WriteString('b - bankrot firme');<br />

WriteLn;<br />

WriteString('k - kraj rada');<br />

WriteLn;<br />

REPEAT<br />

Read(meni)<br />

UNTIL CAP(meni) IN skupZn{'S','Z','O','I','B','K'};<br />

Clear;<br />

IF CAP(meni) # 'K' THEN<br />

CASE CAP(meni) OF<br />

'S' : Spisak(rad)|<br />

'Z' : Zaposli(rad)|<br />

'O' : Otpusti(rad)|<br />

'I' : Inform(rad)|<br />

'B' : Bankrot(rad)<br />

END;<br />

Read(pom)<br />

END<br />

UNTIL CAP(meni) = 'K'<br />

END Radnici.<br />

ZADATAK: Dvostruko pove<strong>za</strong>na lista osoba sortirana po visini i<br />

po težini.<br />

(* Sa tastature ucitavati dva broja (visina i tezina) i<br />

smestati ih u dvostruko pove<strong>za</strong>nu listu, tako da ona<br />

bude neopadajuce uredena po visini i tezini. *)<br />

MODULE VisTez;<br />

FROM Storage IMPORT ALLOCATE, DEALLOCATE;<br />

FROM IO IMPORT WrLn, WrStr, RdCard, WrCard;<br />

FROM SYSTEM IMPORT TSIZE;<br />

TYPE<br />

pok = POINTER TO element;<br />

element = RECORD<br />

visina, tezina : CARDINAL;<br />

Vve<strong>za</strong>, Tve<strong>za</strong> : pok<br />

END;<br />

VAR<br />

pocV, pocT : pok;<br />

vis, tez : CARDINAL;<br />

PROCEDURE Ispisi(pocV, pocT : pok);<br />

VAR<br />

tek : pok;<br />

BEGIN<br />

tek := pocV;<br />

5<br />

WrStr('Po visini:');<br />

WrLn;<br />

WHILE tek # NIL DO<br />

WrCard(tek^.visina, 6);<br />

tek := tek^.Vve<strong>za</strong><br />

END;<br />

WrLn;<br />

tek := pocT;<br />

WrStr('Po tezini:');<br />

WrLn;<br />

WHILE tek # NIL DO<br />

WrCard(tek^.tezina,6);<br />

tek := tek^.Tve<strong>za</strong><br />

END<br />

END Ispisi;<br />

PROCEDURE Ubaci(VAR pocV, pocT : pok;<br />

vis, tez : CARDINAL);<br />

VAR<br />

novi, tek, i<strong>za</strong> : pok;<br />

nadjen : BOOLEAN;<br />

BEGIN<br />

IF pocV = NIL THEN<br />

ALLOCATE(pocV, TSIZE(element));<br />

pocV^.visina := vis;<br />

pocV^.tezina := tez;<br />

pocV^.Vve<strong>za</strong> := NIL;<br />

pocV^.Tve<strong>za</strong> := NIL;<br />

pocT := pocV<br />

ELSE<br />

ALLOCATE(novi, TSIZE(element));<br />

novi^.visina := vis;<br />

novi^.tezina := tez;<br />

tek := pocV;<br />

nadjen := FALSE;<br />

WHILE (tek # NIL) AND NOT nadjen DO<br />

nadjen := vis


DEFINITION MODULE PolinomL;<br />

TYPE<br />

Polinom;<br />

PROCEDURE Anuliraj(VAR p: Polinom);<br />

PROCEDURE Unos(VAR p: Polinom);<br />

PROCEDURE Stampaj(p: Polinom; d: CARDINAL);<br />

PROCEDURE Kopiraj(VAR kopija: Polinom; p: Polinom);<br />

PROCEDURE UbaciMonom(VAR p, novi: Polinom);<br />

PROCEDURE PromeniZnak(VAR p: Polinom);<br />

PROCEDURE Saberi(p1, p2: Polinom; VAR zbir: Polinom);<br />

PROCEDURE Oduzmi(p1,p2: Polinom; VAR razlika: Polinom);<br />

PROCEDURE MonomPuta(p, m: Polinom; VAR mp : Polinom);<br />

PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom);<br />

PROCEDURE Kolicnik(p1, p2: Polinom;<br />

VAR kol, ost: Polinom;<br />

VAR ok : BOOLEAN);<br />

END PolinomL.<br />

IMPLEMENTATION MODULE PolinomL;<br />

FROM InOut IMPORT Write, WriteString, WriteLn,<br />

WriteCard, ReadCard, Done;<br />

FROM RealInOut IMPORT WriteReal, ReadReal;<br />

FROM Storage IMPORT ALLOCATE, DEALLOCATE;<br />

TYPE<br />

Stepen = CARDINAL;<br />

Polinom = POINTER TO Monom;<br />

Monom = RECORD<br />

k : REAL;<br />

st : Stepen;<br />

ve<strong>za</strong> : Polinom<br />

END;<br />

PROCEDURE Anuliraj(VAR p: Polinom);<br />

BEGIN<br />

p := NIL<br />

END Anuliraj;<br />

PROCEDURE Kopiraj(VAR kopija: Polinom; p: Polinom);<br />

VAR<br />

pomocni: Polinom;<br />

BEGIN<br />

IF p = NIL THEN<br />

kopija := NIL<br />

ELSE<br />

NEW(kopija);<br />

kopija^ := p^;<br />

p := p^.ve<strong>za</strong>;<br />

pomocni := kopija;<br />

WHILE p NIL DO<br />

NEW(pomocni^.ve<strong>za</strong>);<br />

pomocni := pomocni^.ve<strong>za</strong>;<br />

pomocni^ := p^;<br />

p := p^.ve<strong>za</strong><br />

END<br />

END<br />

END Kopiraj;<br />

PROCEDURE Stampaj(p: Polinom; d: CARDINAL);<br />

PROCEDURE StampajMonom(m : Polinom);<br />

BEGIN<br />

WITH m^ DO<br />

IF st 0 THEN<br />

IF ABS(k) 1.0 THEN<br />

WriteReal(ABS(k), d)<br />

END;<br />

Write('x');<br />

IF st 1 THEN<br />

Write('^');<br />

WriteCard(st, 1)<br />

END<br />

ELSE<br />

WriteReal(ABS(k), d)<br />

END<br />

END<br />

END StampajMonom;<br />

BEGIN<br />

IF p = NIL THEN<br />

WriteReal(0., d)<br />

ELSE<br />

IF p^.k < 0.0 THEN<br />

WriteString(' - ')<br />

END;<br />

StampajMonom(p);<br />

p := p^.ve<strong>za</strong>;<br />

WHILE p NIL DO<br />

6<br />

IF p^.k > 0.0 THEN<br />

WriteString(' + ')<br />

ELSE<br />

WriteString(' - ')<br />

END;<br />

StampajMonom(p);<br />

p := p^.ve<strong>za</strong><br />

END<br />

END<br />

END Stampaj;<br />

PROCEDURE UbaciMonom(VAR p, novi: Polinom);<br />

VAR<br />

stari, tekuci, kopija: Polinom;<br />

BEGIN<br />

IF novi # NIL THEN<br />

NEW(kopija);<br />

kopija^ := novi^;<br />

tekuci := p;<br />

WHILE (tekuci#NIL) AND (tekuci^.st > kopija^.st) DO<br />

stari := tekuci;<br />

tekuci := tekuci^.ve<strong>za</strong><br />

END;<br />

kopija^.ve<strong>za</strong> := tekuci;<br />

IF tekuci = p THEN<br />

p := kopija<br />

ELSE<br />

stari^.ve<strong>za</strong> := kopija<br />

END;<br />

IF (tekuci#NIL) AND (kopija^.st = tekuci^.st) THEN<br />

kopija^.k := kopija^.k + tekuci^.k;<br />

kopija^.ve<strong>za</strong> := tekuci^.ve<strong>za</strong>;<br />

DISPOSE(tekuci);<br />

IF kopija^.k = 0.0 THEN<br />

IF p = kopija THEN<br />

p := kopija^.ve<strong>za</strong><br />

ELSE<br />

stari^.ve<strong>za</strong> := kopija^.ve<strong>za</strong><br />

END;<br />

DISPOSE(kopija)<br />

END<br />

END<br />

END<br />

END UbaciMonom;<br />

PROCEDURE Unos(VAR p : Polinom);<br />

VAR<br />

i, n: CARDINAL;<br />

novi: Polinom;<br />

BEGIN<br />

Anuliraj(p);<br />

REPEAT<br />

WriteLn;<br />

WriteString('Unesite broj monoma n (n>=0) ');<br />

ReadCard(n);<br />

UNTIL Done;<br />

WriteLn;<br />

FOR i := 1 TO n DO<br />

NEW(novi);<br />

WITH novi^ DO<br />

REPEAT<br />

WriteString('Unesite koeficijent monoma br.');<br />

WriteCard(i, 1);<br />

WriteString(' 0 ');<br />

ReadReal(k);<br />

WriteLn<br />

UNTIL k 0.0;<br />

REPEAT<br />

WriteLn;<br />

WriteString('Unesite eksponent monoma br.');<br />

WriteCard(i, 1);<br />

WriteString('>= 0 ');<br />

ReadCard(st);<br />

UNTIL Done;<br />

WriteLn;<br />

END;<br />

UbaciMonom(p, novi)<br />

END<br />

END Unos;<br />

PROCEDURE Saberi(p1, p2: Polinom; VAR zbir: Polinom);<br />

BEGIN<br />

Kopiraj(zbir, p1);<br />

WHILE p2 NIL DO<br />

UbaciMonom(zbir, p2);<br />

p2 := p2^.ve<strong>za</strong><br />

END<br />

END Saberi;


PROCEDURE PromeniZnak(VAR p: Polinom);<br />

VAR<br />

t: Polinom;<br />

BEGIN<br />

t := p;<br />

WHILE t NIL DO<br />

t^.k := - t^.k;<br />

t := t^.ve<strong>za</strong><br />

END<br />

END PromeniZnak;<br />

PROCEDURE Oduzmi(p1,p2: Polinom; VAR razlika: Polinom);<br />

BEGIN<br />

Kopiraj(razlika, p2);<br />

PromeniZnak(razlika);<br />

WHILE p1 NIL DO<br />

UbaciMonom(razlika, p1);<br />

p1 := p1^.ve<strong>za</strong><br />

END<br />

END Oduzmi;<br />

PROCEDURE MonomPuta(p, m: Polinom; VAR mp: Polinom);<br />

VAR<br />

tekuci: Polinom;<br />

BEGIN<br />

Anuliraj(mp);<br />

IF (m NIL) AND (p NIL) THEN<br />

NEW(mp);<br />

mp^.k := p^.k * m^.k;<br />

mp^.st := p^.st + m^.st;<br />

p := p^.ve<strong>za</strong>;<br />

tekuci := mp;<br />

WHILE p NIL DO<br />

NEW(tekuci^.ve<strong>za</strong>);<br />

tekuci := tekuci^.ve<strong>za</strong>;<br />

tekuci^.k := p^.k * m^.k;<br />

tekuci^.st := p^.st + m^.st;<br />

p := p^.ve<strong>za</strong><br />

END;<br />

tekuci^.ve<strong>za</strong> := NIL<br />

END<br />

END MonomPuta;<br />

PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom);<br />

VAR<br />

pomocni: Polinom;<br />

BEGIN<br />

Anuliraj(pr);<br />

IF (p1 NIL) AND (p2 NIL) THEN<br />

MonomPuta(p1, p2, pr);<br />

p2 := p2^.ve<strong>za</strong>;<br />

WHILE p2 NIL DO<br />

MonomPuta(p1, p2, pomocni);<br />

REPEAT<br />

UbaciMonom(pr, pomocni);<br />

pomocni := pomocni^.ve<strong>za</strong><br />

UNTIL pomocni = NIL;<br />

p2 := p2^.ve<strong>za</strong><br />

END<br />

END<br />

END Puta;<br />

PROCEDURE Kolicnik(p1, p2: Polinom; VAR kol, ost:<br />

Polinom; VAR ok: BOOLEAN);<br />

PROCEDURE Deli(VAR kol, ost: Polinom);<br />

VAR<br />

novi, pomocni: Polinom;<br />

BEGIN<br />

IF ost NIL THEN<br />

IF ost^.st >= p2^.st THEN<br />

NEW(novi);<br />

novi^.k := - ost^.k / p2^.k;<br />

novi^.st := ost^.st - p2^.st;<br />

MonomPuta(p2, novi, pomocni);<br />

Saberi(ost, pomocni, ost);<br />

novi^.k := - novi^.k;<br />

UbaciMonom(kol, novi);<br />

Deli(kol, ost)<br />

END<br />

END<br />

END Deli;<br />

BEGIN (* Kolicnik *)<br />

ok := TRUE;<br />

Anuliraj(kol);<br />

IF p2 = NIL THEN<br />

7<br />

ok := FALSE<br />

ELSE<br />

Kopiraj(ost, p1);<br />

Deli(kol, ost)<br />

END<br />

END Kolicnik;<br />

END PolinomL.<br />

MODULE PolSuma;<br />

(* Napisati program koji ucitava broj k (1


Prvi := 0;<br />

Zadnji := 0<br />

END<br />

END MakeNull;<br />

PROCEDURE Empty(VAR q : Queue) : BOOLEAN;<br />

BEGIN<br />

RETURN q.Zadnji = 0<br />

END Empty;<br />

PROCEDURE First(VAR q : Queue;<br />

VAR x : InfoTip;<br />

VAR ok : BOOLEAN);<br />

BEGIN<br />

IF Empty(q) THEN<br />

ok := FALSE<br />

ELSE<br />

ok := TRUE;<br />

WITH q DO<br />

x := Element[Prvi]<br />

END<br />

END<br />

END First;<br />

PROCEDURE AddOne(i : CARDINAL) : CARDINAL;<br />

BEGIN<br />

IF i = Maxqueue THEN<br />

RETURN 1<br />

ELSE<br />

RETURN i+1<br />

END<br />

END AddOne;<br />

PROCEDURE PopFirst(VAR q : Queue;<br />

VAR ok : BOOLEAN);<br />

BEGIN<br />

IF Empty(q) THEN<br />

ok := FALSE<br />

ELSE<br />

ok := TRUE;<br />

WITH q DO<br />

IF Prvi = Zadnji THEN<br />

MakeNull(q)<br />

ELSE<br />

Prvi := AddOne(Prvi)<br />

END<br />

END<br />

END<br />

END PopFirst;<br />

PROCEDURE AddRear(VAR q : Queue;<br />

x : InfoTip;<br />

VAR ok : BOOLEAN);<br />

BEGIN<br />

WITH q DO<br />

IF AddOne(Zadnji) = Prvi THEN<br />

ok := FALSE<br />

ELSE<br />

ok := TRUE;<br />

IF Empty(q) THEN<br />

Prvi := 1;<br />

Zadnji := 1<br />

ELSE<br />

Zadnji := AddOne(Zadnji)<br />

END;<br />

Element[Zadnji] := x<br />

END<br />

END<br />

END AddRear;<br />

END RedOpsl1.<br />

ZADATAK: Ispitivanje da li reč pripada gramatici wcw + . Reč<br />

pripada ovoj gramatici ako joj se prvi deo (w) sastoji samo od<br />

slova 'a' i 'b', sledi slovo 'c' a nakon njega obrnuta reč reči w.<br />

DEFINITION MODULE Stek;<br />

CONST<br />

Maxstack = 100;<br />

TYPE<br />

N<strong>iz</strong> = ARRAY [1..Maxstack] OF CHAR;<br />

Stack = RECORD<br />

Top : CARDINAL;<br />

Element : N<strong>iz</strong><br />

END;<br />

PROCEDURE MakeNull(VAR s : Stack);<br />

PROCEDURE Empty(VAR s : Stack) : BOOLEAN;<br />

8<br />

PROCEDURE Top(VAR s : Stack;<br />

VAR x : CHAR;<br />

VAR ok : BOOLEAN);<br />

PROCEDURE Pop(VAR s : Stack;<br />

VAR ok : BOOLEAN);<br />

PROCEDURE Push(VAR s : Stack;<br />

x : CHAR;<br />

VAR ok : BOOLEAN);<br />

END Stek.<br />

IMPLEMENTATION MODULE Stek;<br />

PROCEDURE MakeNull(VAR s : Stack);<br />

BEGIN<br />

s.Top := 0<br />

END MakeNull;<br />

PROCEDURE Empty(VAR s : Stack) : BOOLEAN;<br />

BEGIN<br />

RETURN s.Top = 0<br />

END Empty;<br />

PROCEDURE Top(VAR s : Stack;<br />

VAR x : CHAR;<br />

VAR ok : BOOLEAN);<br />

BEGIN<br />

IF Empty(s) THEN<br />

ok := FALSE<br />

ELSE<br />

ok := TRUE;<br />

WITH s DO<br />

x := Element[Top]<br />

END<br />

END<br />

END Top;<br />

PROCEDURE Pop(VAR s : Stack;<br />

VAR ok : BOOLEAN);<br />

BEGIN<br />

IF Empty(s) THEN<br />

ok := FALSE<br />

ELSE<br />

ok := TRUE;<br />

DEC(s.Top)<br />

END<br />

END Pop;<br />

PROCEDURE Push(VAR s : Stack;<br />

x : CHAR;<br />

VAR ok : BOOLEAN);<br />

BEGIN<br />

WITH s DO<br />

IF Top = Maxstack THEN<br />

ok := FALSE<br />

ELSE<br />

ok := TRUE;<br />

INC(Top);<br />

Element[Top] := x<br />

END<br />

END<br />

END Push;<br />

END Stek.<br />

MODULE wcw;<br />

(* Da li rec pripada gramatici wcw+. *)<br />

FROM Stek IMPORT Stack, MakeNull, Empty, Top, Pop,<br />

Push;<br />

FROM InOut IMPORT Read, Write, WriteString, EOL;<br />

TYPE<br />

slova = SET OF CHAR;<br />

VAR<br />

S : Stack;<br />

Ch, C : CHAR;<br />

ok : BOOLEAN;<br />

BEGIN<br />

MakeNull(S);<br />

Read(Ch);<br />

Write(Ch);<br />

ok := TRUE;<br />

WHILE ok AND (Ch IN slova{'a', 'b'}) DO<br />

Push(S, Ch, ok);<br />

Read(Ch);<br />

Write(Ch)<br />

END;<br />

IF NOT ok THEN<br />

WriteString('Greska - mali stek')<br />

ELSIF Ch # 'c' THEN<br />

WriteString('Pogresan string')


ELSE<br />

Read(Ch);<br />

Write(Ch);<br />

WHILE ok AND (Ch # EOL) DO<br />

Top(S, C, ok);<br />

ok := ok AND (C = Ch);<br />

IF ok THEN<br />

Pop(S, ok);<br />

Read(Ch);<br />

Write(Ch)<br />

END<br />

END;<br />

IF NOT (ok AND Empty(S)) THEN<br />

WriteString('Pogresan string')<br />

ELSE<br />

WriteString('String pripada jeziku L')<br />

END<br />

END<br />

END wcw.<br />

ZADATAK: Kalkulator <strong>za</strong> <strong>iz</strong>računavanje postfiksnih <strong>iz</strong>ra<strong>za</strong>. Svi<br />

brojevi koji figurišu u <strong>iz</strong>razu su jednocifreni.<br />

MODULE PostFix;<br />

(* Kalkulator <strong>za</strong> <strong>iz</strong>racunavanje postfiksnih <strong>iz</strong>ra<strong>za</strong>. *)<br />

FROM StekI IMPORT Stack, MakeNull, Empty, Top, Pop,<br />

Push;<br />

FROM InOut IMPORT Read, Write, WriteInt, EOL;<br />

TYPE<br />

slova = SET OF CHAR;<br />

VAR<br />

S : Stack;<br />

Ch : CHAR;<br />

Op1, Op2 : INTEGER;<br />

ok : BOOLEAN;<br />

PROCEDURE Conv(Ch : CHAR) : INTEGER;<br />

BEGIN<br />

RETURN INTEGER( ORD(Ch) - ORD('0') )<br />

END Conv;<br />

BEGIN<br />

MakeNull(S);<br />

Read(Ch);<br />

Write(Ch);<br />

WHILE Ch # EOL DO<br />

IF Ch IN slova{'+', '-', '/', '*', '%'} THEN<br />

Top(S, Op2, ok);<br />

Pop(S, ok);<br />

Top(S, Op1, ok);<br />

Pop(S, ok);<br />

CASE Ch OF<br />

'+' : Op1 := Op1 + Op2 |<br />

'-' : Op1 := Op1 - Op2 |<br />

'*' : Op1 := Op1 * Op2 |<br />

'/' : Op1 := Op1 DIV Op2 |<br />

'%' : Op1 := Op1 MOD Op2<br />

END;<br />

Push(S, Op1, ok)<br />

ELSE<br />

Push(S, Conv(Ch), ok)<br />

END;<br />

Read(Ch);<br />

Write(Ch)<br />

END;<br />

Top(S, Op1, ok);<br />

Write('=');<br />

WriteInt(Op1,5)<br />

END PostFix.<br />

Simulacija rekurzije<br />

Pravila:<br />

Rekurzivni poziv<br />

• Sačuvati tekuće argumente, lokalne promenljive i adresu<br />

na steku<br />

• Izmeniti argumente kao u pozivu procedure<br />

• Prebaciti kontrolu na početak procedure<br />

Posle rekurzivnog poziva:<br />

• Izvaditi elemenat sa steka<br />

• Vratiti stare vrednosti lokalnim promenljivima i<br />

argumentima<br />

• Prebaciti kontrolu na adresu<br />

Kako se to praktično <strong>iz</strong>vodi:<br />

BEGIN<br />

MakeNull(s);<br />

REPEAT<br />

WHILE treba rekurzija DO<br />

(*prvi rek. poziv*)<br />

na stek<br />

menjanje vrednosti parametara<br />

END;<br />

Trivijalni slučaj<br />

Jos := TRUE;<br />

WHILE NOT Empty(s) & jos DO<br />

Top(s,el,ok);<br />

Pop(s,ok);<br />

Restauriramo stare vrednosti<br />

IF adr=... THEN<br />

...<br />

jos:=FALSE;<br />

ELSIF adr=... THEN<br />

.....<br />

ELSE<br />

jos:=TRUE<br />

END<br />

END<br />

UNTIL Empty(s);<br />

(*RETURN rez*)<br />

END...<br />

ZADACI:<br />

Simulirati ponašanje sledećih rekurzivnih procedura (funkcija)<br />

upotrebom steka:<br />

1.<br />

MODULE Fakto;<br />

FROM IO IMPORT WrStr, WrLn, WrLngCard, RdCard, OK;<br />

FROM StekC IMPORT Stack,MakeNull,Empty, Top, Pop, Push;<br />

VAR<br />

n : CARDINAL;<br />

PROCEDURE RFakto(n : CARDINAL) : LONGCARD;<br />

BEGIN<br />

IF n 1 DO<br />

Push(s,n,OK);<br />

DEC(n)<br />

END;<br />

rez := 1;<br />

WHILE NOT Empty(s) DO<br />

Top(s, n, OK);<br />

Pop(s, OK);<br />

rez := LONGCARD(n) * rez<br />

END;<br />

RETURN rez<br />

END SFakto;<br />

BEGIN<br />

REPEAT<br />

WrStr('n = ');<br />

n := RdCard();<br />

WrLn<br />

UNTIL OK;<br />

WrStr('n! = ');<br />

WrLngCard(RFakto(n), 1);<br />

WrStr(' = ');<br />

WrLngCard(SFakto(n), 1)<br />

END Fakto.<br />

2.<br />

MODULE Step;<br />

FROM IO IMPORT WrStr, WrLn, WrReal, RdReal, RdCard, OK;<br />

FROM StekStep IMPORT Stack, MakeNull, Empty, Top, Pop,<br />

Push, InfoTip, AdrTip;<br />

9


VAR<br />

n : CARDINAL;<br />

x : REAL;<br />

PROCEDURE Sqr( y : REAL) : REAL;<br />

BEGIN<br />

RETURN y * y<br />

END Sqr;<br />

PROCEDURE RStep(x : REAL;<br />

n : CARDINAL) : REAL;<br />

BEGIN<br />

IF n = 0 THEN<br />

RETURN 1.<br />

ELSIF ODD(n) THEN<br />

RETURN x * Sqr( RStep(x, n DIV 2) )<br />

ELSE<br />

RETURN Sqr( RStep(x, n DIV 2) )<br />

END<br />

END RStep;<br />

PROCEDURE SStep(x : REAL;<br />

n : CARDINAL ) : REAL;<br />

VAR<br />

s : Stack;<br />

OK : BOOLEAN;<br />

rez : REAL;<br />

el : InfoTip;<br />

BEGIN<br />

MakeNull(s);<br />

WHILE n > 0 DO<br />

el.x := x;<br />

el.n := n;<br />

IF ODD(n) THEN<br />

el.adr := nepar;<br />

ELSE<br />

el.adr := par<br />

END;<br />

Push(s,el,OK);<br />

n := n DIV 2<br />

END;<br />

rez := 1.;<br />

WHILE NOT Empty(s) DO<br />

Top(s, el, OK);<br />

Pop(s, OK);<br />

x := el.x;<br />

n := el.n;<br />

IF el.adr = nepar THEN<br />

rez := x * Sqr(rez)<br />

ELSE<br />

rez := Sqr(rez)<br />

END<br />

END;<br />

RETURN rez<br />

END SStep;<br />

BEGIN<br />

REPEAT<br />

WrStr('x = ');<br />

x := RdReal();<br />

WrLn<br />

UNTIL OK;<br />

REPEAT<br />

WrStr('n = ');<br />

n := RdCard();<br />

UNTIL OK;<br />

WrStr('x^n = ');<br />

WrReal(RStep(x, n), 10, 1);<br />

WrStr(' = ');<br />

WrReal(SStep(x, n), 10, 1)<br />

END Step.<br />

3.<br />

MODULE Fib;<br />

FROM IO IMPORT WrStr, WrLn, RdCard, WrLngCard, OK;<br />

FROM StekFib IMPORT Stack, MakeNull, Empty, Top, Pop,<br />

Push, InfoTip, AdrTip;<br />

VAR<br />

n : CARDINAL;<br />

PROCEDURE RFib(n : CARDINAL) : LONGCARD;<br />

BEGIN<br />

IF n 1 DO<br />

el.n := n;<br />

el.adr := prvi;<br />

Push(s,el,OK);<br />

DEC(n)<br />

END;<br />

rez := LONGCARD(n);<br />

jos := TRUE;<br />

WHILE (NOT Empty(s)) AND jos DO<br />

Top(s, el, OK);<br />

Pop(s, OK);<br />

n := el.n;<br />

IF el.adr = prvi THEN<br />

PrviSab := rez;<br />

el.n := n;<br />

el.adr := drugi;<br />

el.PrviSab := PrviSab;<br />

Push(s, el, OK);<br />

DEC(n, 2);<br />

jos := FALSE<br />

ELSE<br />

PrviSab := el.PrviSab;<br />

rez := PrviSab + rez<br />

END<br />

END<br />

UNTIL Empty(s);<br />

RETURN rez<br />

END SFib;<br />

BEGIN<br />

REPEAT<br />

WrStr('n = ');<br />

n := RdCard();<br />

UNTIL OK;<br />

WrStr('F(n) = ');<br />

WrLngCard(RFib(n), 1);<br />

WrStr(' = ');<br />

WrLngCard(SFib(n), 1)<br />

END Fib.<br />

4.<br />

MODULE Faktor;<br />

FROM IO IMPORT WrStr, WrLn, WrLngCard, RdCard, OK;<br />

FROM StekC IMPORT Stack, MakeNull, Empty, Top, Pop,<br />

Push;<br />

VAR<br />

n : CARDINAL;<br />

rez : LONGCARD;<br />

PROCEDURE RFakto(n : CARDINAL;<br />

VAR rez : LONGCARD);<br />

BEGIN<br />

IF n = 0 THEN<br />

rez := 1<br />

ELSE<br />

RFakto(n-1, rez);<br />

rez := LONGCARD(n) * rez<br />

END<br />

END RFakto;<br />

PROCEDURE SFakto(n : CARDINAL;<br />

VAR rez : LONGCARD);<br />

VAR<br />

s : Stack;<br />

OK : BOOLEAN;<br />

BEGIN<br />

MakeNull(s);<br />

WHILE n > 0 DO<br />

Push(s,n,OK);<br />

DEC(n)<br />

END;<br />

rez := 1;<br />

WHILE NOT Empty(s) DO<br />

Top(s, n, OK);<br />

Pop(s, OK);<br />

rez := LONGCARD(n) * rez<br />

END<br />

END SFakto;


BEGIN<br />

REPEAT<br />

WrStr('n = ');<br />

n := RdCard();<br />

WrLn<br />

UNTIL OK;<br />

WrStr('n! = ');<br />

RFakto(n, rez);<br />

WrLngCard(rez, 1);<br />

WrStr(' = ');<br />

SFakto(n, rez);<br />

WrLngCard(rez, 1)<br />

END Faktor.<br />

5. (ispitni)<br />

MODULE Rek1;<br />

FROM Stek1 IMPORT Stack, adresa, InfoTip, MakeNull,<br />

Empty, Top, Pop, Push;<br />

IMPORT IO;<br />

VAR<br />

X : ARRAY [1..20] OF INTEGER;<br />

PROCEDURE Max(d, g: INTEGER) : INTEGER;<br />

VAR<br />

m1, m2 : INTEGER;<br />

BEGIN<br />

IF d>g THEN<br />

RETURN MIN(INTEGER)<br />

ELSIF d=g THEN<br />

RETURN X[d]<br />

ELSE<br />

m1 := Max(d, (d+g) DIV 2);<br />

m2 := Max((d+g) DIV 2 +1, g);<br />

IF m1 > m2 THEN<br />

RETURN m1<br />

ELSE<br />

RETURN m2<br />

END<br />

END<br />

END Max;<br />

PROCEDURE SMax(d, g: INTEGER) : INTEGER;<br />

VAR<br />

S : Stack;<br />

el : InfoTip;<br />

ok, jos : BOOLEAN;<br />

m1, m2, rez : INTEGER;<br />

BEGIN<br />

MakeNull(S);<br />

REPEAT<br />

WHILE dg THEN<br />

rez := MIN(INTEGER)<br />

ELSE (* d=g *)<br />

rez := X[d]<br />

END;<br />

jos := TRUE;<br />

WHILE jos AND NOT Empty(S) DO<br />

Top(S, el, ok);<br />

Pop(S, ok);<br />

d := el.d;<br />

g := el.g;<br />

m1 := el.m1;<br />

IF el.adr = prvi THEN<br />

m1 := rez;<br />

el.m1 := m1;<br />

el.adr := drugi;<br />

Push(S, el, ok);<br />

d := (d+g) DIV 2 + 1;<br />

jos := FALSE<br />

ELSE (*el.adr = drugi*)<br />

m2 := rez;<br />

IF m1 > m2 THEN<br />

rez := m1<br />

ELSE<br />

rez := m2<br />

END<br />

END<br />

END<br />

UNTIL Empty(S);<br />

RETURN rez<br />

END SMax;<br />

11<br />

BEGIN (* glavni program *)<br />

X[1] := 3;<br />

X[2] := 2;<br />

X[3] := 5;<br />

X[4] := -7;<br />

X[5] := 0;<br />

IO.WrCard(Max(1, 5), 3);<br />

IO.WrLn;<br />

IO.WrCard(SMax(1, 5), 3);<br />

IO.WrLn<br />

END Rek1.<br />

6. (ispitni)<br />

MODULE Rek2;<br />

FROM Stek2 IMPORT Stack, adresa, InfoTip, MakeNull,<br />

Empty, Top, Pop, Push;<br />

IMPORT IO;<br />

PROCEDURE g(x : CARDINAL; y : CARDINAL; n : CARDINAL) :<br />

CARDINAL;<br />

BEGIN<br />

IF n < 3 THEN<br />

RETURN x + y<br />

ELSIF ODD(n) THEN<br />

RETURN g(g(x+1, y, n-2), y, n-3)<br />

ELSE<br />

RETURN g(x, g(x, y+1, n-2), n-3)<br />

END<br />

END g;<br />

PROCEDURE Sg(x : CARDINAL; y : CARDINAL; n : CARDINAL)<br />

: CARDINAL;<br />

VAR<br />

S : Stack;<br />

el : InfoTip;<br />

ok, jos : BOOLEAN;<br />

rez : CARDINAL;<br />

BEGIN<br />

MakeNull(S);<br />

REPEAT<br />

WHILE n >= 3 DO<br />

IF ODD(n) THEN<br />

el.x := x;<br />

el.y := y;<br />

el.n := n;<br />

el.adr := prvi;<br />

Push(S, el, ok);<br />

INC(x);<br />

DEC(n, 2)<br />

ELSE<br />

el.x := x;<br />

el.y := y;<br />

el.n := n;<br />

el.adr := treci;<br />

Push(S, el, ok);<br />

INC(y);<br />

DEC(n, 2)<br />

END<br />

END;<br />

rez := x+y;<br />

jos := TRUE;<br />

WHILE jos AND NOT Empty(S) DO<br />

Top(S, el, ok);<br />

Pop(S, ok);<br />

x := el.x;<br />

y := el.y;<br />

n := el.n;<br />

IF el.adr = prvi THEN<br />

el.adr := drugi;<br />

Push(S, el, ok);<br />

x := rez;<br />

DEC(n, 3);<br />

jos := FALSE<br />

ELSIF el.adr = treci THEN<br />

el.adr := cetvrti;<br />

Push(S, el, ok);<br />

y := rez;<br />

DEC(n, 3);<br />

jos := FALSE<br />

END<br />

END<br />

UNTIL Empty(S);<br />

RETURN rez<br />

END Sg;<br />

BEGIN (* glavni program *)<br />

IO.WrCard(g(2, 3, 10), 3);<br />

IO.WrCard(Sg(2, 3, 10), 3);<br />

END Rek2.


Пример другог испитног задатка:<br />

Датим типовима података се представљају спортски клубови у једном граду. Тип PokKlub служи за представљање листе<br />

клубова. Ова листа је уређена растуће по именима клубова. Клуб је представљен слогом типа SlogKlub који између осталог<br />

садржи име клуба и двоструко повезану листу чланова клуба. Ова листа је уређена неопадајуће по висини члана и<br />

неопадајуће по тежини члана, тако да clanoviVis показује на најнижег члана у клубу, а clanoviTez на најлакшег. Члан клуба<br />

је представљен слогом типа SlogClan у којем се чувају име члана, његова висина и тежина. Написати следеће процедуре:<br />

String = ARRAY [1..50] OF CHAR;<br />

PokKlub = POINTER TO SlogKlub;<br />

PokClan = POINTER TO SlogClan;<br />

SlogKlub = RECORD<br />

imeK: String;<br />

clanoviVis,<br />

clanoviTez: PokClan;<br />

ve<strong>za</strong>: PokKlub<br />

END;<br />

SlogClan = RECORD<br />

imeC: String;<br />

tezina,<br />

visina: CARDINAL;<br />

ve<strong>za</strong>Vis,<br />

ve<strong>za</strong>Tez: PokClan<br />

END;<br />

• Ucitaj(imeFajla: ARRAY OF CHAR; VAR k: PokKlub) –<br />

која из фајла imeFajla учитава податке о клубовима у параметар k.<br />

Сваки ред фајла се односи на један клуб. Ред почиње јединственим<br />

именом клуба, а у наставку се за сваког члана наводе његово име,<br />

висина и тежина. Сви подаци су међусобно раздвојени по једним<br />

бланко знаком. Претпоставити да се у именима клубова и чланова не<br />

појављују бланко знаци.<br />

• Ujedini(VAR k: PokKlub; ime1, ime2, imeNovog:<br />

String) – којом се ажурира структура када се клуб ime1 и ime2<br />

уједине у нови клуб imeNovog (након уједињења клубови ime1 и<br />

ime2 више не постоје). Водити рачуна о томе да једна особа може<br />

бити члан више спортских клубова.<br />

MODULE Klubovi;<br />

FROM FIO IMPORT File, EOF, RdCard, RdItem, Seek, GetPos,<br />

RdChar, Open, Close, Exists, Separators;<br />

FROM Storage IMPORT ALLOCATE, DEALLOCATE;<br />

FROM SYSTEM IMPORT TSIZE;<br />

FROM Str IMPORT Compare;<br />

FROM InOut IMPORT WriteString, WriteCard, WriteLn,<br />

Write;<br />

TYPE<br />

String = ARRAY [1..50] OF CHAR;<br />

PokKlub = POINTER TO SlogKlub;<br />

PokClan = POINTER TO SlogClan;<br />

SlogKlub = RECORD<br />

imeK: String;<br />

clanoviVis, clanoviTez: PokClan;<br />

ve<strong>za</strong>: PokKlub<br />

END;<br />

SlogClan = RECORD<br />

imeC: String;<br />

tezina, visina: CARDINAL;<br />

ve<strong>za</strong>Vis, ve<strong>za</strong>Tez: PokClan<br />

END;<br />

PROCEDURE UbaciK(VAR glavni: PokKlub; pomocni:<br />

PokKlub);<br />

VAR<br />

temp: PokKlub;<br />

BEGIN<br />

IF (glavni = NIL) OR (Compare(glavni^.imeK,<br />

pomocni^.imeK) >= 0) THEN<br />

pomocni^.ve<strong>za</strong> := glavni;<br />

glavni := pomocni<br />

ELSE<br />

temp := glavni;<br />

WHILE (temp^.ve<strong>za</strong> # NIL) AND<br />

(Compare(temp^.ve<strong>za</strong>^.imeK, pomocni^.imeK) < 0) DO<br />

temp := temp^.ve<strong>za</strong><br />

END;<br />

pomocni^.ve<strong>za</strong> := temp^.ve<strong>za</strong>;<br />

temp^.ve<strong>za</strong> := pomocni<br />

END<br />

END UbaciK;<br />

PROCEDURE UbaciC(VAR glavniVis, glavniTez: PokClan;<br />

pomocni: PokClan);<br />

VAR<br />

temp: PokClan;<br />

BEGIN<br />

IF (glavniVis = NIL) OR (glavniVis^.visina >=<br />

pomocni^.visina) THEN<br />

pomocni^.ve<strong>za</strong>Vis := glavniVis;<br />

glavniVis := pomocni<br />

ELSE<br />

temp := glavniVis;<br />

12<br />

WHILE (temp^.ve<strong>za</strong>Vis # NIL) AND<br />

(temp^.ve<strong>za</strong>Vis^.visina < pomocni^.visina) DO<br />

temp := temp^.ve<strong>za</strong>Vis<br />

END;<br />

pomocni^.ve<strong>za</strong>Vis := temp^.ve<strong>za</strong>Vis;<br />

temp^.ve<strong>za</strong>Vis := pomocni<br />

END;<br />

IF (glavniTez = NIL) OR (glavniTez^.tezina >=<br />

pomocni^.tezina) THEN<br />

pomocni^.ve<strong>za</strong>Tez := glavniTez;<br />

glavniTez := pomocni<br />

ELSE<br />

temp := glavniTez;<br />

WHILE (temp^.ve<strong>za</strong>Tez # NIL) AND<br />

(temp^.ve<strong>za</strong>Tez^.tezina < pomocni^.tezina) DO<br />

temp := temp^.ve<strong>za</strong>Tez<br />

END;<br />

pomocni^.ve<strong>za</strong>Tez := temp^.ve<strong>za</strong>Tez;<br />

temp^.ve<strong>za</strong>Tez := pomocni<br />

END<br />

END UbaciC;<br />

PROCEDURE Ucitaj(imeFajla: ARRAY OF CHAR; VAR k:<br />

PokKlub);<br />

PROCEDURE CitajDalje(file: File; VAR char: CHAR);<br />

BEGIN<br />

Seek(file, GetPos(file)-1);<br />

REPEAT<br />

char := RdChar(file)<br />

UNTIL EOF OR NOT (char IN Separators) OR (char<br />

= CHR(13));<br />

IF NOT EOF AND (char # CHR(13)) THEN<br />

Seek(file, GetPos(file)-1)<br />

END<br />

END CitajDalje;<br />

VAR<br />

f: File;<br />

ch: CHAR;<br />

pomK: PokKlub;<br />

pomC: PokClan;<br />

str: String;<br />

card: CARDINAL;<br />

BEGIN<br />

k := NIL;<br />

IF Exists(imeFajla) THEN<br />

f := Open(imeFajla);<br />

RdItem(f, str);<br />

WHILE NOT EOF DO<br />

NEW(pomK);


pomK^.imeK := str;<br />

pomK^.clanoviVis := NIL;<br />

pomK^.clanoviTez := NIL;<br />

UbaciK(k, pomK);<br />

CitajDalje(f, ch);<br />

WHILE NOT EOF AND (ch # CHR(13)) DO<br />

NEW(pomC);<br />

RdItem(f, str);<br />

pomC^.imeC := str;<br />

card := RdCard(f);<br />

pomC^.visina := card;<br />

card := RdCard(f);<br />

pomC^.tezina := card;<br />

UbaciC(pomK^.clanoviVis, pomK^.clanoviTez,<br />

pomC);<br />

CitajDalje(f, ch)<br />

END;<br />

RdItem(f, str)<br />

END;<br />

Close(f)<br />

END<br />

END Ucitaj;<br />

PROCEDURE Ujedini(VAR k: PokKlub; ime1, ime2,<br />

imeNovog: String);<br />

PROCEDURE PronadjiK(ime: String; VAR pok:<br />

PokKlub);<br />

VAR<br />

stari: PokKlub;<br />

BEGIN<br />

pok := k;<br />

stari := NIL;<br />

WHILE (pok # NIL) AND (Compare(ime, pok^.imeK)<br />

# 0) DO<br />

stari := pok;<br />

pok := pok^.ve<strong>za</strong><br />

END;<br />

IF pok # NIL THEN<br />

IF stari # NIL THEN<br />

stari^.ve<strong>za</strong> := pok^.ve<strong>za</strong>;<br />

ELSE<br />

k := pok^.ve<strong>za</strong><br />

END<br />

END<br />

END PronadjiK;<br />

PROCEDURE NadjenC(ime: String; lista: PokClan):<br />

BOOLEAN;<br />

BEGIN<br />

WHILE (lista # NIL) AND<br />

(Compare(ime, lista^.imeC) # 0) DO<br />

lista := lista^.ve<strong>za</strong>Vis<br />

END;<br />

RETURN lista # NIL<br />

END NadjenC;<br />

ELSE<br />

UbaciC(temp3^.clanoviVis,<br />

temp3^.clanoviTez, pok2)<br />

END<br />

END;<br />

DISPOSE(temp1);<br />

UbaciK(k, temp3);<br />

END<br />

END<br />

END Ujedini;<br />

PROCEDURE IspisiVis(k: PokKlub);<br />

VAR<br />

pomk: PokKlub;<br />

pomc: PokClan;<br />

BEGIN<br />

pomk := k;<br />

WHILE pomk # NIL DO<br />

WriteString(pomk^.imeK);<br />

Write(' ');<br />

pomc := pomk^.clanoviVis;<br />

WHILE pomc # NIL DO<br />

WriteString(pomc^.imeC);<br />

Write(' ');<br />

WriteCard(pomc^.visina, 0);<br />

Write(' ');<br />

WriteCard(pomc^.tezina, 0);<br />

Write(' ');<br />

pomc := pomc^.ve<strong>za</strong>Vis<br />

END;<br />

pomk := pomk^.ve<strong>za</strong>;<br />

WriteLn;<br />

END<br />

END IspisiVis;<br />

VAR<br />

lista: PokKlub;<br />

BEGIN<br />

Ucitaj('podaci.txt', lista);<br />

WriteLn;<br />

WriteString('Ucitani podaci !'); WriteLn;<br />

WriteLn;<br />

IspisiVis(lista);<br />

Ujedini(lista, 'kajak', 'kanu', 'veslacki');<br />

WriteLn;<br />

WriteString('Nakon ujedinjenja !'); WriteLn;<br />

WriteLn;<br />

IspisiVis(lista)<br />

END Klubovi.<br />

VAR<br />

temp1, temp2, temp3: PokKlub;<br />

pok1, pok2: PokClan;<br />

BEGIN<br />

PronadjiK(ime1, temp1);<br />

IF temp1 # NIL THEN<br />

PronadjiK(ime2, temp2);<br />

IF temp2 # NIL THEN<br />

NEW(temp3);<br />

temp3^.imeK := imeNovog;<br />

temp3^.clanoviVis := temp2^.clanoviVis;<br />

temp3^.clanoviTez := temp2^.clanoviTez;<br />

DISPOSE(temp2);<br />

pok1 := temp1^.clanoviVis;<br />

WHILE (pok1 # NIL) DO<br />

pok2 := pok1;<br />

pok1 := pok1^.ve<strong>za</strong>Vis;<br />

IF NadjenC(pok2^.imeC, temp3^.clanoviVis)<br />

THEN<br />

DISPOSE(pok2)<br />

13

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!