Cod sursa(job #543801)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 28 februarie 2011 16:53:19
Problema Evaluarea unei expresii Scor 80
Compilator fpc Status done
Runda Arhiva educationala Marime 1.26 kb
var     a:array[1..1000000] of char;
        n:longint;
        f:text;
        buf:array[1..1000] of char;

procedure citire;
var     f:text;
begin
  assign(f,'evaluare.in');
  reset(f);
  n:=0;
  settextbuf(f,buf);
    while not eoln(f) do
      begin
        inc(n);
        read(f,a[n]);
      end;
  close(f);
end;

function a2r(left,right:longint):longint;
var     i,j:longint;
begin
  a2r:=0;
  for i:=left to right do
    a2r:=a2r*10 + ord(a[i])-ord('0');
end;

function eval(left,right:longint):longint;
var i,p1,p2,p3,p4,pp:longint;
begin
  p1:=0;
  p2:=0;
  p3:=0;
  p4:=0;
  pp:=0;
  for i:=left to right do
  if a[i]='('then inc(pp)
  else if a[i]=')'then dec(pp)
  else if pp=0 then
  case a[i] of
    '+':p1:=i;
    '-':p2:=i;
    '*':p3:=i;
    '/':p4:=i;
  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 a[left]='(' then eval:=eval(left+1,right-1)
  else eval:=a2r(left,right);
end;

begin
  citire;
  assign(f,'evaluare.out');
  rewrite(f);
  settextbuf(f,Buf);
  write(f,eval(1,n));
  close(f);
end.