Pagini recente » Cod sursa (job #1230939) | Cod sursa (job #2836755) | Profil UCV_Barbulescu_Dobre_Feraru | Cod sursa (job #2387838) | Cod sursa (job #294972)
Cod sursa(job #294972)
program evaluarea_unei_expresii;
type caracter=record
info:longint;
car:boolean;
end;
var e:array[0..12000]of caracter;
{in e salvam expresia; un element are in campul car valoarea false daca
pe aceasta pozitie este in expresie un semn, iar in campul info va avea
codul ascii al acestuia; un element are in campul car valoarea true
daca pe aceasta pozitie este in expresie un numar, in campul info se
va memora acest numar}
function cifra(c:char):boolean;
begin
if(c>='0')and(c<='9')then cifra:=true
else cifra:=false;
end;
function operator(c:char):boolean;
begin
if c in ['+','-','*','/'] then operator:=true
else operator:=false;
end;
procedure evaluare;
var c:char;
poz:longint;
procedure calcule;
var pd,i,j:longint;
begin
pd:=poz-1;
while (e[pd].info<>40)or(e[pd].car=false) do dec(pd);
{evaluam expresia dintre cele doua paranteze}
i:=pd+1;
while i<poz do
begin
if e[i].car=false then begin
i:=i+1;
continue;
end;
if e[i].info=42 then begin
e[i-1].info:=e[i-1].info*e[i+1].info;
poz:=poz-2;
for j:=i to poz do e[j]:=e[j+2];
continue;
end;
if e[i].info=47 then begin
e[i-1].info:=e[i-1].info div e[i+1].info;
poz:=poz-2;
for j:=i to poz do e[j]:=e[j+2];
continue;
end;
i:=i+1;
end;
i:=pd+1;
while i<poz do
begin
if e[i].car=false then begin
i:=i+1;
continue;
end;
if e[i].info=43 then begin
e[i-1].info:=e[i-1].info+e[i+1].info;
poz:=poz-2;
for j:=i to poz do e[j]:=e[j+2];
continue;
end;
if e[i].info=45 then begin
e[i-1].info:=e[i-1].info-e[i+1].info;
poz:=poz-2;
for j:=i to poz do e[j]:=e[j+2];
continue;
end;
i:=i+1;
end;
e[pd]:=e[pd+1];
poz:=poz-2;
end;
begin
poz:=0;
with e[0] do
begin
car:=true;
info:=40;
end;
while not eoln do
begin
read(c);
if cifra(c) then
if e[poz].car=true then
begin
inc(poz);
with e[poz] do
begin
info:=ord(c)-48;
car:=false;
end;
end
else
e[poz].info:=e[poz].info*10+ord(c)-48
else
if(operator(c))or(c='(')then
begin
inc(poz);
with e[poz] do
begin
car:=true;
info:=ord(c);
end;
end
else
if c=')' then
begin
inc(poz);
with e[poz] do
begin
car:=true;
info:=41;
end;
calcule;
end;
end;
poz:=poz+1;
with e[poz]do
begin
car:=true;
info:=41;
end;
calcule;
writeln(e[0].info);
end;
begin
assign(input,'evaluare.in');
reset(input);
assign(output,'evaluare.out');
rewrite(output);
evaluare;
close(input);
close(output);
end.