Listing EXCEL.PAS

 

Program Excel;
const NrMaxLin=10;
LgMax=100;
type Linie=0..NrMaxLin;
Coloana='A'..'Z';
Expresie=string[LgMax];
Celula=record
data:Expresie;
x:Byte; 
v:Longint
end;
Foaie=array[Linie,Coloana] of Celula;
var F:Foaie;
n,l:Linie;
m,i:Byte; cm,c:Char;
fout:Text; numeout:string;

 

procedure Citire;
var fin:Text; nume:string;
l:Linie; c:Char;
begin
Assign(fin,'EXCEL.IN'); Reset(fin);
Readln(fin,n,m); cm:=Chr(ord('A')+m-1);
for l:=0 to n-1 do
for c:='A' to cm do Readln(fin,F[l,c].data);
Close(fin)
end;

 

procedure Afisare;
var l:Linie; c:Char;
begin
for l:=0 to n-1 do
begin
for c:='A' to cm do Write(fout,F[l,c].v:11);
Writeln(fout)
end;
Close(fout)
end;

 

function EvaluareExpresie(var e:Expresie; 
var i:Byte):Longint; forward;
var ll:Linie; cc:Char; cod:Integer ; v:Longint;

 

procedure op(var e:expresie; i:Byte; ii:Byte);
begin
Val(Copy(e,i,ii-i),v,cod)
end;

 

function EvaluareFactor(var e:Expresie; 
var i:Byte):Longint;
var ii:Byte;
begin
if e[i]='(' { se verifica daca factorul }
then { este o expresie intre paranteze }
begin
Inc(i); { se trece peste ')' }
{ se evalueza expresia dintre paranteze }
EvaluareFactor:=EvaluareExpresie(e,i); 
Inc(i) { se trece peste ')' }
end
else { factorul este un operand }
if(e[i]>='A') and (e[i]<='Z') 
then { factorul este o referinta de celula }
begin
ll:=Ord(e[i+1])-Ord('0'); cc:=e[i];
if F[ll,cc].x=2 
then EvaluareFactor:=F[ll,cc].v
else
if F[ll,cc].x=1 
then
begin
Writeln(fout,
'EVALUARE IMPOSIBILA');
Close(fout); Halt
end
else
begin
ii:=1;
EvaluareFactor:=
EvaluareExpresie(F[ll,cc].data,ii)
end;
Inc(i,2)
end
else { factorul este o valoare intreaga }
begin
ii:=i+1;
while(ii<=Length(e)) and (e[ii]>='0') 
and (e[ii]<='9') do Inc(ii);
op(e,i,ii);
EvaluareFactor:=v;
i:=ii
end
end;

 

function EvaluareTermen(var e:Expresie; 
var i:Byte):Longint;
var f:Longint; op:Char;
begin
f:=EvaluareFactor(e,i); 
{ se evalueza primul factor din care este }
{ constituit termenul 	}
while (i<=Length(e)) and ((e[i]='*') 
or (e[i]='/')) do 
{ mai urmeaza factori }
begin
op:=e[i];
i:=i+1; { se trece peste '*' }
if op='*' 
then f:=f * EvaluareFactor(e,i)
else f:=f div 
EvaluareFactor(e,i)
end;
EvaluareTermen:=f
end;

 

function EvaluareExpresie(var e:Expresie; 
var i:Byte):Longint;
var t:Longint; op:Char;
begin
t:=EvaluareTermen(e,i); 
{ se evalueza primul termen din expresie }
while (i<Length(e)) and ((e[i]='+') 
or (e[i]='-')) do 
{ mai urmeaza termeni 	}
begin
op:=e[i];
i:=i+1; { se trece peste operator }
if op='+' 
then t:=t+EvaluareTermen(e,i)
else t:=t-EvaluareTermen(e,i)
end;
EvaluareExpresie:=t
end;

 

Begin { program principal }
Citire;
Assign(fout,'EXCEL.OUT'); Rewrite(fout);
for l:=0 to n-1 do
for c:='A' to cm do
if F[l,c].x=0 
then
begin
F[l,c].x:=1; i:=1;
l,c].v:=EvaluareExpresie(F[l,c].data,i);
F[l,c].x:=2
end;
Afisare
End.