2.6 演示算法的开发过程及方法
在数据结构课程中,存储结构及逻辑结构(特别是动态数据结构及递归算法的执行过程)是教学的重点和难点。只有了解了静态存储结构和动态存储结构的原理,才能设计出更合理的数据结构和高效的算法。本系统通过代码对照、图形演示、变量的动态变化来形象、清晰地展示以上原理。本节主要介绍演示算法的开发过程及系统的使用。
2.6.1 开发过程
在delphi中单独建立一个单元,首先建立一个模板类ex,直接继承类demo,主要方法是输入检查、算法代码输出、执行算法,在三个方法中都以整数no为参数,相当于选择目录中的三级标题对应的算法。设计好模板后,再编写新类时,都可以复制这些代码,在它们的基础上添加代码即可。模板类ex的说明及方法框架如下:
ex = class(demo)//说明部分 private f: text; public function inputok(no:integer): Boolean; override; procedure outprogram(no:integer); function runprogram(no:integer): Boolean; override; end; //实现部分 function ex.inputok(no:integer): Boolean; var s: string; begin result:=true; case no of 1: begin end; end; end; procedure ex.outprogram(no:integer); var f: text; begin assignfile(f,'pdemo.txt'); rewrite(f); case no of 1:begin writeln(f,'procedure print;'); end; end; closefile(f); end; function ex.runprogram(no:integer): Boolean; var x: Integer; s: string; begin inherited; if inputok(no) then begin outprogram(no); assignfile(f,'demo.txt'); rewrite(f); case no of 1:; end; closefile(f); result:=true; end else result:=false; end;
2.6.2 输入检查
本系统只允许在输入框中进行输入,对输入结果要进行检查,看是否符合算法要求。在执行算法时,先检查是否有数据输入,如不合法或未输入,就把输入框中的内容设为默认值。下面的代码用来检查输入框中的内容是否为3到9之间的数值:
function ex01.inputok(no:integer): Boolean; var s: string; begin result:=true; case no of 2: begin s:=getinput; if pos(s,'3,4,5,6,7,8,9')=0 then begin sethelp('请输入一个在3-9 中的数字!'); setinput('3'); result:=false; end ; end; end; end;
2.6.3 算法代码输出
执行相应算法时,在算法演示窗口输出并显示代码,实际上就是把执行算法的过程输出到pdemo.txt文件中,代码如下:
procedure ex01.outprogram(no:integer); var f: text; begin assignfile(f,'pdemo.txt'); rewrite(f); case no of 1:begin //简单程序及静态简单变量演示 writeln(f,'procedure print;'); writeln(f,'var i,j:integer;'); writeln(f,'begin'); writeln(f,' i:=1;j:=2;'); writeln(f,' i:=i+j;'); writeln(f,'end;'); end; 2:begin writeln(f,'function fac(n: integer):integer;'); writeln(f,'var y:integer;'); writeln(f,'begin '); writeln(f,' if n=1 '); writeln(f,' then result:=1'); writeln(f,' else begin '); writeln(f,' y:=fac(n-1); '); writeln(f,' result:=n*y; '); writeln(f,' end; '); writeln(f,'end; '); end; 3:begin writeln(f,'procedure ex01.print99; '); writeln(f,'var i,j:integer; '); writeln(f,' r99:array[1..9,1..9] of integer; '); writeln(f,'begin '); writeln(f,' for i:=1 to 9 do '); writeln(f,' for j:=1 to i do '); writeln(f,' r99[i,j]:=i*j; '); writeln(f,'end; '); end; 4:begin writeln(f,'procedure ex01.pointdemo;'); writeln(f,'var aa,bb,s:pointtp;i:integer; '); writeln(f,'begin '); writeln(f,' new(aa); '); writeln(f,' new(bb); '); writeln(f,' aa.next:=nil; '); writeln(f,' aa.data:=','''///''',';'); writeln(f,' bb.data:=','''123''',';'); writeln(f,' bb.next :=aa.next; '); writeln(f,' aa.next:=bb; '); writeln(f,' for i:=1 to 3 do '); writeln(f,' begin '); writeln(f,' new(s); '); writeln(f,' s.data :=inttostr(i);'); writeln(f,' s.next :=bb.next ; '); writeln(f,' bb.next:=s;'); writeln(f,' bb:=s;'); writeln(f,' end; '); writeln(f,'end;'); end; end; closefile(f); end;
2.6.4 算法的执行
在下述的runprogram(no:integer)方法中,先检查输入的内容是否正确,如果正确,输出演示用算法代码,调用真正的算法,在执行过程中产生相应的脚本文件。下面的代码分别调用四个算法,第一个算法为简单程序及静态简单变量演示,直接调用print方法;第二个算法是递归程序及系统工作栈演示,先读入输入值,再调用求阶乘的fac()算法;第三个算法是演示二维数组(包括一维记录数组)的使用,该数组中存放九九乘法口诀表;第四个算法是指针演示,建立先进先出的链表。
function ex01.runprogram(no:integer): Boolean; var x: Integer; s: string; begin inherited; if inputok(no) then begin outprogram(no); assignfile(f,'demo.txt'); rewrite(f); case no of 1:print; 2:begin s:=getinput; x:=fac(strtoint(s)); end; 3:print99; 4:pointdemo; end; closefile(f); result:=true; end else result:=false; end;
2.6.5 脚本的输出
输出脚本在算法执行的过程中逐步完成,这是编写代码的重点和难点。针对编写好的算法,以行为单位,执行了哪些功能,变量值有哪些变化,都要以前面脚本符号系统的规定进行编写。以第二个算法为例,在原递归求阶乘程序的基础上,增加输出脚本语句,形成递归程序及系统工作栈,演示算法的执行代码如下:
function ex01.fac(n:integer): Integer; var y: Integer; begin writeln(f,'1]/递归程序演示;'); writeln(f,'2]#n,y,result;','*n=',n,';'); writeln(f,'3]'); writeln(f,'4]'); if n=1 then begin result:=1 ; writeln(f,'5]*result=1 ;'); end else begin writeln(f,'6]'); writeln(f,'7]<n=',n,' ','8;','/当前局部变量及返回语句入栈;'); y:=fac(n-1); writeln(f,'8]>;*n=',n,';','*y=',y,';'); result:=n*y; writeln(f,'8]*result=',n*y,';'); writeln(f,'9]'); end; writeln(f,'10]'); end; 下面是输入为3时,执行上述代码生成的demo.txt的内容: 1]/递归程序演示; 2]#n,y,result;*n=3; 3] 4] 6] 7]<n=3 8;/当前局部变量及返回语句入栈; 1]/递归程序演示; 2]#n,y,result;*n=2; 3] 4] 6] 7]<n=2 8;/当前局部变量及返回语句入栈; 1]/递归程序演示; 2]#n,y,result;*n=1; 3] 4] 5]*result=1 ; 10] 8]>;*n=2;*y=1; 8]*result=2; 9] 10] 8]>;*n=3;*y=2; 8]*result=6; 9] 10]