Cod sursa(job #210238)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 27 septembrie 2008 00:00:48
Problema Evaluarea unei expresii Scor 20
Compilator fpc Status done
Runda Arhiva educationala Marime 1.43 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: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;

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);
        if (s[h]='*')or(s[h]='/')then
          begin
            while (s[h]<>'(')and(h>0)do
              begin
                dec(n);
                v[n]:=calc(s[h],v[n],v[n+1]);
                dec(h);
              end;
            if (h>0)then dec(h);
          end;
      end else
    if (a[i]<>')')then
      begin
        inc(h);
        s[h]:=a[i];
      end else
      begin
        while (s[h]<>'(')and(h>0)do
          begin
            dec(n);
            v[n]:=calc(s[h],v[n],v[n+1]);
            dec(h);
          end;
        if (h>0)then dec(h);
      end;
    inc(i);
  end;
write(g,v[1]);
close(f);
close(g);
end.