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.

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

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

Saved successfully!

Ooh no, something went wrong!