Cod sursa(job #445915)

Utilizator ionicaion ionica Data 24 aprilie 2010 14:44:12
Problema Evaluarea unei expresii Scor 80
Compilator fpc Status done
Runda Arhiva educationala Marime 2.23 kb
{
 * Se va folosi recursivitatea indirecta in rezolvarea problemei.
 * Vom observa ca orice expresie este "impartita" in urmatoarele componente:
 * 1) termeni ai unei adunari, separati de '+' sau '-'
 * 2) factori ai unui produs, separati de '*' sau '/'
 * 3) subexpresii, incadrate intre paranteze '(' si ')' sau numere formate numai din cifre.
 * Prezenta subexpresiilor ne indica faptul ca la un moment dat va fi necesara intoarcerea in cazul (1)
 * si implicit a necesitatii recursivitatii indirecte.
 }
program p;
const  MAX = 10001;
var s:array[1..MAX] of char;
    i:longint;
    f,g:text;
function termen:longint;forward;
function factor:longint;forward;

{
 * Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
 }
function eval:longint;
var r:longint;
begin
 r:= termen;
 while (s[i]='+')or(s[i]='-')do
    case s[i] of
    '+':begin
         i:=i+1;
	 r:=r+termen;
         end;
    '-':begin
        i:=i+1;
        r:=r-termen;
        end;
   end;
   eval:=r;
   end;

{
 * Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul
 * lui din factori inmultiti.
 }
function termen:longint;
var r:longint;
begin
 r:=factor;
 while (s[i]='*')or(s[i]='/') do
    case s[i] of
      '*': begin
           i:=i+1;
           r:=r*factor;
           end;
       '/': begin
            i:=i+1;
            r:=r div factor;
            end;
       end;
 termen:=r;
 end;

{
 * Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie
 * sau un numar natural
 }
function factor:longint;
var r:longint;
begin
 r:=0;
 if s[i]='(' then begin      {avem o subexpresie}
                  i:=i+1;
                  r:=eval;   {trecem peste '('}
                  i:=i+1;
                  end

 else  begin
       while (s[i]>='0')and(s[i]<='9') do  {avem un numar}
                     begin
                     r:=r*10 +ord(s[i])-ord('0');
                     i:=i+1;
                     end;
       end;
 factor:=r;
end;
begin
assign(f,'evaluare.in');reset(f);
assign(g,'evaluare.out');rewrite(g);
i:=0;
while not eoln(f) do
   begin
   i:=i+1;
   read(f,s[i]);
   end;

i:=1;
writeln(g,eval);
close(g);
end.