Listing EXCEL.PAS
Program Excel;
constNrMaxLin=10;
LgMax=100;
typeLinie=0..NrMaxLin;
Coloana='A'..'Z';
Expresie=string[LgMax];
Celula=record
data:Expresie;
x:Byte;
v:Longint
end;
Foaie=array[Linie,Coloana] of Celula;
varF:Foaie;
n,l:Linie;
m,i:Byte; cm,c:Char;
fout:Text; numeout:string;
procedureCitire;
varfin:Text; nume:string;
l:Linie; c:Char;
begin
Assign(fin,'EXCEL.IN'); Reset(fin);
Readln(fin,n,m); cm:=Chr(ord('A')+m-1);
forl:=0 to n-1 do
for c:='A' to cm do Readln(fin,F[l,c].data);
Close(fin)
end;
procedureAfisare;
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;
functionEvaluareExpresie(var e:Expresie;
vari:Byte):Longint; forward;
varll:Linie; cc:Char; cod:Integer ; v:Longint;
procedureop(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='+'
thent:=t+EvaluareTermen(e,i)
else t:=t-EvaluareTermen(e,i)
end;
EvaluareExpresie:=t
end;
Begin{ program principal }
Citire;
Assign(fout,'EXCEL.OUT'); Rewrite(fout);
forl:=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.