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