官术网_书友最值得收藏!

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]
主站蜘蛛池模板: 大安市| 扬中市| 龙陵县| 井冈山市| SHOW| 盘锦市| 平原县| 平昌县| 漳浦县| 浦北县| 四会市| 保康县| 饶平县| 文登市| 章丘市| 大城县| 新河县| 嘉峪关市| 通榆县| 呼图壁县| 云林县| 怀化市| 卫辉市| 陈巴尔虎旗| 昆山市| 修水县| 梅河口市| 海宁市| 涿州市| 德兴市| 延安市| 江津市| 乌海市| 滦南县| 鹰潭市| 田东县| 涞源县| 龙江县| 应城市| 中牟县| 丽江市|