//首先将所有的计算顺序初始化为0
//然后扫描公式表,产生一张变量依存关系表,为简单起见,用StringList存储,命名 VarList,
//内容如下所示:
a=m,n
m=
n=
b=x,y
x=
y=
c=a,b
....
//当然,m,n,x,y可以不在表中出现
//自己提供以下两个函数
procedure SetSerid(vName:string;
Serid:integer);
//为变量设置顺序号
function SeridOf(vName:string):integer;
//取变量当前顺序号
//用以下函数来计算并设置每个变量(公式)的顺序号
function CalcSerid(vName:string):integer;
function CutFirstName(var s:string):string;
var
P:integer;
begin
P:=Pos(',',s);
if P=0 then
Result:=s
else
begin
Result:=Copy(s,1,P-1);
Delete(s,1,P);
end;
end;
var
DependVarNames:string;
DependSerid:integer;
begin
Result:=SeridOf(vName);
if Result=-1 then
raise Exception.Create('循环引用');
DependVarNames:=DependList.Values[vName];
if (Result=0) and (DependVarNames<>'') then
begin
SetSerid(vName,-1);
//设置正在计算的标志
repeat
DependSerid:=CalcSerid(CutFirstName(DependVarNames));
if DependSerid>=Result then
Result:=DependSerid+1;
until DependVarNames='';
SetSerid(vName,Result);
end;
end;
procedure SetAllSerid;
//主
begin
for i:=0 to VarList.Count-1do
CalcSerid(copy(VarList,1,pos('=',VarList)-1);
end;
//徒手写的,请自己调试