Cod sursa(job #295890)

Utilizator punkistBarbulescu Dan punkist Data 3 aprilie 2009 19:09:52
Problema Evaluarea unei expresii Scor 10
Compilator fpc Status done
Runda Arhiva educationala Marime 1.34 kb
const max=100010;
var s:array[1..max] of char;
    f,f2:text;
    m,p:int64;
    i:longint;

function termen:int64;forward;
function factor:int64;forward;

function eval:int64;
 var r:int64;
 begin
  r:=termen;
  while (s[p]='+') or (s[p]='-') do
   begin
    if s[p]='+' then
     begin
      p:=p+1;
      r:=r+termen;
      break;
     end;
    if s[p]='-' then
     begin
      p:=p+1;
      r:=r-termen;
      break;
     end;
   end;
  eval:=r;
 end;

function termen:int64;
 var r:int64;
 begin
  r:=factor;
  while (s[p]='*') or (s[p]='/') do
   begin
    if s[p]='*' then
     begin
      p:=p+1;
      r:=r*factor;
      break;
     end;
    if s[p]='/' then
     begin
      p:=p+1;
      r:=r div factor;
      break;
     end;
   end;
  termen:=r;
 end;

function factor:int64;
 var r:int64;
 begin
  r:=0;
  if s[p]='(' then
   begin
    p:=p+1;
    r:=eval;
    p:=p+1;
   end
  else
   begin
    while (s[p]>='0') and (s[p]<='9') do
     begin
      r:=r * 10 + (ord(s[p])- ord('0'));
      p:=p+1;
     end;
   end;
  factor:=r;
 end;

begin
assign(f,'evaluare.in');
assign(f2,'evaluare.out');
reset(f);
for i:=1 to max do s[i]:=' ';
m:=0;
while not eoln(f) do
 begin
  m:=m+1;
  read(f,s[m]);
 end;
close(f);
p:=1;
rewrite(f2);
writeln(f2,eval);
close(f2);
end.