基于敏捷开发的数据结构研究
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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]