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