Pagini recente » Cod sursa (job #2887699) | Cod sursa (job #2607162) | Cod sursa (job #820508) | Cod sursa (job #1786133) | Cod sursa (job #393275)
Cod sursa(job #393275)
program evaluare;
type rec = record
s:string[10];
v:longint;
end;
Type REF = ^NOD;
NOD = record
left,right:REF;
index:longint;
//s:string;
end;
var fin,fout:text;
nr1,nr2,i,j,n,m,vn,xn,paranteza:longint;
f:integer;
c:char;
root:REF;
x:array [1..1000000] of rec;
v:array [1..1000000] of string[10];
s:string;
{*-----------------------------------------*}
procedure introdu;
begin
inc(xn);
x[xn].s:=s;
x[xn].v:=paranteza+10000;
s:='';
end;
{*-----------------------------------------*}
procedure cauta(left,right:longint; var nod:ref);
var i,min,mini:longint;
begin
min:=maxint;
for i:=left to right do
if min >= x[i].v then
begin
min:=x[i].v;
mini:=i;
end;
if min = maxint then
begin
nod:=nil;
exit;
end;
new(NOD);
NOD^.index:=mini;
//NOD.s:=x[mini].s;
cauta(left,mini-1,NOD^.left);
cauta(mini+1,right,NOD^.Right);
end;
{*-----------------------------------------*}
procedure getNr(i:longint);
begin
dec(i);
while v[i] = '$' do dec(i);
val(v[i],nr2,f);
v[i]:='$';
dec(i);
while v[i] = '$' do dec(i);
val(v[i],nr1,f);
v[i]:='$';
end;
{*-----------------------------------------*}
procedure solutie(nod:ref);
begin
if nod^.left <> nil then solutie(nod^.left);
if nod^.right <> nil then solutie(nod^.right);
inc(vn);
v[vn]:=x[NOD^.index].s;
// write(fout,,' ');
end;
{*-----------------------------------------*}
begin
assign(fin,'evaluare.in'); reset(fin); assign(fout,'evaluare.out'); rewrite(fout);
vn:=0;
while not eoln(fin) do
begin
read(fin,c);
case c of
'+':begin
if s <> '' then introdu;
inc(xn);
x[xn].s:=c;
x[xn].v:=paranteza+1;
end;
'-':begin
if s <> '' then introdu
else
begin
s:='0';
introdu;
end;
inc(xn);
x[xn].s:=c;
x[xn].v:=paranteza+1;
end;
'*':begin
if s <> '' then introdu;
inc(xn);
x[xn].s:=c;
x[xn].v:=paranteza+10;
end;
'/':begin
if s <> '' then introdu;
inc(xn);
x[xn].s:=c;
x[xn].v:=paranteza+10;
end;
'(':begin
paranteza:=paranteza+100;
if s <> '' then introdu;
end;
')':begin
paranteza:=paranteza-100;
if s <> '' then introdu;
end;
else
begin
s:=s+c;
end;
end;
end;
if s <> '' then introdu;
cauta(1,xn,root);
vn:=0;
solutie(root);
for i:=1 to vn do
begin
if v[i] = '+' then
begin
getnr(i);
str(nr1+nr2,v[i]);
end;
if v[i] = '-' then
begin
getnr(i);
str(nr1-nr2,v[i]);
end;
if v[i] = '*' then
begin
getnr(i);
str(nr1*nr2,v[i]);
end;
if v[i] = '/' then
begin
getnr(i);
str(nr1 div nr2,v[i]);
end;
end;
writeln(fout,v[vn]);
close(fin); Close(fout);
end.