Cod sursa(job #720315)

Utilizator vivokVictor Vasiloi vivok Data 22 martie 2012 15:54:56
Problema Evaluarea unei expresii Scor 70
Compilator fpc Status done
Runda Arhiva educationala Marime 1.33 kb
var a:array[1..100000] of char; i,n,r:longint; fin,fout:text; c:char;

function myeval(s1:string):longint;
var cod:longint; r:real;
begin
  val(s1, r, cod);
  myeval:=trunc(r);
end;

{procedure afis(n:longint);
var i:integer;
begin
for i:=1 to n do write(a[i]);
writeln;
end;}

function eval(left, right:longint):longint;
var i,j,p,p1,p2,p3,p4:longint; s:string;
begin
  p1:=0; p2:=0; p3:=0; p4:=0;
  p:=0;
  for i:=left to right do
  if a[i]='(' then inc(p)
  else if a[i]=')' then dec(p)
  else if p=0 then
  begin
    if a[i]='+' then p1:=i;
    if a[i]='-' then p2:=i;
    if a[i]='*' then p3:=i;
    if a[i]='/' then p4:=i;
  end;
  if p1>0 then eval:=eval(left, p1-1)+eval(p1+1, right)
  else if p2>0 then eval:=eval(left, p2-1)-eval(p2+1, right)
  else if p3>0 then eval:=eval(left, p3-1)*eval(p3+1, right)
  else if p4>0 then eval:=eval(left, p4-1) div eval(p4+1, right)
  else if a[left]='(' then eval:=eval(left+1, right-1)
  else
   begin
    s:='';
    for j:=left to right do
    s:=s+a[j];
    eval:=myeval(s);
   end;
end;

begin
  assign(fin,'evaluare.in');
  assign(fout,'evaluare.out');
  rewrite(fout);
  reset(fin); i:=0;
  while not eoln(fin) do
   begin
    inc(i); read(fin,c);
    a[i]:=c;
   end;
  close(fin);
  n:=i;
  r:=eval(1, i);
  writeln(fout,r);
  close(fout);
end.