Cod sursa(job #210348)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 27 septembrie 2008 13:28:52
Problema Evaluarea unei expresii Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.72 kb
var f,g:text;
    a:array[0..100010]of char;
    v:array[0..50010]of longint;
    s:array[0..50010]of char;
    l,i,n,h,c,j,cn,ch,k,y:longint;
    x:string;

function calc(k:char;a,b:longint):longint;
begin
  if (k='+')then calc:=a+b else
  if (k='-')then calc:=a-b else
  if (k='*')then calc:=a*b else
  if (k='/')then calc:=a div b;
end;

function verif(a,b:char):boolean;
begin
  verif:=false;
  if (a<>'*')and(a<>'/')then
    if (b='*')or(b='/')then verif:=true;
end;

begin
assign(f,'evaluare.in');
assign(G,'evaluare.out');
reset(f);
rewrite(g);
while not eoln(f) do
  begin
    inc(l);
    read(f,a[l]);
  end;
inc(l);
a[l]:=')';
i:=1;
while (i<=l)do
  begin
    if (a[i]>='0')and(a[i]<='9')then
      begin
        x:='';
        while (a[i]>='0')and(a[i]<='9')do
          begin
            x:=x+a[i];
            inc(i);
          end;
        inc(n);
        val(x,v[n],c);
        dec(i);
      end else
    if (a[i]<>')')then
      begin
        inc(h);
        s[h]:=a[i];
      end else
      begin
        ch:=h;
        cn:=n;
        while (s[ch]<>'(')and(ch>0)do
          begin
            dec(ch);
            dec(cn);
          end;
        k:=v[cn];
        y:=ch+1;
        if (ch<h)then
          begin
            for j:=cn+1 to n do
              begin
                k:=calc(s[y],k,v[j]);
                inc(Y);
              end;
            n:=cn;
            if (k<>v[n])then v[n]:=k;
            h:=ch;
          end;
        if (h>0)then dec(h);
      end;
    while verif(a[i],s[h]) do
      begin
        dec(n);
        v[n]:=calc(s[h],v[n],v[n+1]);
        dec(h);
      end;
    inc(i);
  end;
write(g,v[1]);
close(f);
close(g);
end.