Pagini recente » Cod sursa (job #565110) | Cod sursa (job #1604873) | Cod sursa (job #2940512) | Cod sursa (job #901293) | Cod sursa (job #445915)
Cod sursa(job #445915)
{
* Se va folosi recursivitatea indirecta in rezolvarea problemei.
* Vom observa ca orice expresie este "impartita" in urmatoarele componente:
* 1) termeni ai unei adunari, separati de '+' sau '-'
* 2) factori ai unui produs, separati de '*' sau '/'
* 3) subexpresii, incadrate intre paranteze '(' si ')' sau numere formate numai din cifre.
* Prezenta subexpresiilor ne indica faptul ca la un moment dat va fi necesara intoarcerea in cazul (1)
* si implicit a necesitatii recursivitatii indirecte.
}
program p;
const MAX = 10001;
var s:array[1..MAX] of char;
i:longint;
f,g:text;
function termen:longint;forward;
function factor:longint;forward;
{
* Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
}
function eval:longint;
var r:longint;
begin
r:= termen;
while (s[i]='+')or(s[i]='-')do
case s[i] of
'+':begin
i:=i+1;
r:=r+termen;
end;
'-':begin
i:=i+1;
r:=r-termen;
end;
end;
eval:=r;
end;
{
* Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul
* lui din factori inmultiti.
}
function termen:longint;
var r:longint;
begin
r:=factor;
while (s[i]='*')or(s[i]='/') do
case s[i] of
'*': begin
i:=i+1;
r:=r*factor;
end;
'/': begin
i:=i+1;
r:=r div factor;
end;
end;
termen:=r;
end;
{
* Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie
* sau un numar natural
}
function factor:longint;
var r:longint;
begin
r:=0;
if s[i]='(' then begin {avem o subexpresie}
i:=i+1;
r:=eval; {trecem peste '('}
i:=i+1;
end
else begin
while (s[i]>='0')and(s[i]<='9') do {avem un numar}
begin
r:=r*10 +ord(s[i])-ord('0');
i:=i+1;
end;
end;
factor:=r;
end;
begin
assign(f,'evaluare.in');reset(f);
assign(g,'evaluare.out');rewrite(g);
i:=0;
while not eoln(f) do
begin
i:=i+1;
read(f,s[i]);
end;
i:=1;
writeln(g,eval);
close(g);
end.