Cod sursa(job #726080)

Utilizator elffikkVasile Ermicioi elffikk Data 26 martie 2012 23:45:24
Problema Evaluarea unei expresii Scor 80
Compilator fpc Status done
Runda Arhiva educationala Marime 1.24 kb
var s:array[1..100000] of char;
f1,f2:text;
n:longint;

function f(s:string):longint;
var r:longint; c:integer;
begin
  val(s,r,c);
  f:=r;
end;

function eval(left,right:longint):longint;
var pp,p1,p2,p3,p4,i:longint; s2:string; b:boolean;
begin
  pp:=0; p1:=0; p2:=0; p3:=0; p4:=0;
  b:=true; i:=left;
  while b and (i<=right) do
  begin
    if s[i]='(' then pp:=pp+1
    else if s[i]=')' then pp:=pp-1
    else if pp=0 then begin
      if s[i]='+' then p1:=i;
      if s[i]='-' then p2:=i;
      if s[i]='*' then p3:=i;
      if s[i]='/' then p4:=i;
    end;
    i:=i+1;
  end;
  if p1>p2 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>p4 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 s[left]='(' then eval:=eval(left+1, right-1)
  else
  begin
    s2:='';
    for i:=left to right do
        s2:=s2+s[i];
    eval:=f(s2);
  end;
end;

begin
  assign(f1, 'evaluare.in');
  reset(f1);
  n:=0;
  while not eoln(f1) do
  begin
    inc(n);
    read(f1,s[n]);
  end;
  close(f1);
  assign(f2, 'evaluare.out');
  rewrite(f2);
  write(f2, eval(1,n));
  close(f2);
end.