Cod sursa(job #294972)

Utilizator mimarcelMoldovan Marcel mimarcel Data 2 aprilie 2009 21:28:22
Problema Evaluarea unei expresii Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 2.77 kb
program evaluarea_unei_expresii;
type caracter=record
				  info:longint;
				  car:boolean;
				  end;
var e:array[0..12000]of caracter;
	 {in e salvam expresia; un element are in campul car valoarea false daca
	  pe aceasta pozitie este in expresie un semn, iar in campul info va avea
	  codul ascii al acestuia; un element are in campul car valoarea true
	  daca pe aceasta pozitie este in expresie un numar, in campul info se
	  va memora acest numar}

function cifra(c:char):boolean;
begin
if(c>='0')and(c<='9')then cifra:=true
							else cifra:=false;
end;

function operator(c:char):boolean;
begin
if c in ['+','-','*','/'] then operator:=true
								  else operator:=false;
end;

procedure evaluare;
var c:char;
	 poz:longint;

procedure calcule;
var pd,i,j:longint;
begin
pd:=poz-1;
while (e[pd].info<>40)or(e[pd].car=false) do dec(pd);
{evaluam expresia dintre cele doua paranteze}
i:=pd+1;
while i<poz do
  begin
  if e[i].car=false then begin
								 i:=i+1;
								 continue;
								 end;
  if e[i].info=42 then begin
							  e[i-1].info:=e[i-1].info*e[i+1].info;
							  poz:=poz-2;
							  for j:=i to poz do e[j]:=e[j+2];
							  continue;
							  end;
  if e[i].info=47 then begin
							  e[i-1].info:=e[i-1].info div e[i+1].info;
							  poz:=poz-2;
							  for j:=i to poz do e[j]:=e[j+2];
							  continue;
							  end;
  i:=i+1;
  end;
i:=pd+1;
while i<poz do
  begin
  if e[i].car=false then begin
								 i:=i+1;
								 continue;
								 end;
  if e[i].info=43 then begin
							  e[i-1].info:=e[i-1].info+e[i+1].info;
							  poz:=poz-2;
							  for j:=i to poz do e[j]:=e[j+2];
							  continue;
							  end;
  if e[i].info=45 then begin
							  e[i-1].info:=e[i-1].info-e[i+1].info;
							  poz:=poz-2;
							  for j:=i to poz do e[j]:=e[j+2];
							  continue;
							  end;
  i:=i+1;
  end;
e[pd]:=e[pd+1];
poz:=poz-2;
end;

begin
poz:=0;
with e[0] do
  begin
  car:=true;
  info:=40;
  end;
while not eoln do
  begin
  read(c);
  if cifra(c) then
	 if e[poz].car=true then
		begin
		inc(poz);
		with e[poz] do
		  begin
		  info:=ord(c)-48;
		  car:=false;
		  end;
		end
							  else
		e[poz].info:=e[poz].info*10+ord(c)-48
				  else
	 if(operator(c))or(c='(')then
		begin
		inc(poz);
		with e[poz] do
		  begin
		  car:=true;
		  info:=ord(c);
		  end;
		end
						 else
		if c=')' then
		begin
		inc(poz);
		with e[poz] do
		  begin
		  car:=true;
		  info:=41;
		  end;
		calcule;
		end;
  end;
poz:=poz+1;
with e[poz]do
  begin
  car:=true;
  info:=41;
  end;
calcule;
writeln(e[0].info);
end;

begin
assign(input,'evaluare.in');
reset(input);
assign(output,'evaluare.out');
rewrite(output);
evaluare;
close(input);
close(output);
end.