プログラミングU 第12回

線形リスト 2


リストを作る3つのプロシージャ

デモを見る

ループ版
前回紹介したもの.
Hyou[0] を便宜的に使うことと,Hyou[Hyou[P].Next].Ten の複雑な書き方が不満.
        procedure ListWoTsukuru;

          procedure ListNiTsuika(N : TSoeji);
            var
              P : TSoeji;
            begin
              P := 0;
              while (Hyou[P].Next > 0) and (Hyou[Hyou[P].Next].Ten > Hyou[N].Ten) do
                P := Hyou[P].Next;
              Hyou[N].Next := Hyou[P].Next;
              Hyou[P].Next := N;
            end; {ListNiTsuika}

          var
            K : TSoeji;
          begin
            Hyou[0].Next := 0;
            for K := 1 to Ninzuu do
              ListNiTsuika(K);
            First := Hyou[0].Next;
          end; {ListWoTsukuru}
       
再帰プロシージャ,値引数版
ループ版を再帰プロシージャに直訳したもの.
ループ版の不満は解消していず,再帰を使って複雑になっただけ.
再帰を理解するためのもので,今後使うことはない.
        procedure ListWoTsukuru;

          procedure ListNiTsuika(N : TSoeji; P : TSoeji);
            begin
              if (Hyou[P].Next > 0) and (Hyou[Hyou[P].Next].Ten > Hyou[N].Ten)
                then ListNiTsuika(N,Hyou[P].Next)            // 再帰呼び出し
                else begin
                       Hyou[N].Next := Hyou[P].Next;
                       Hyou[P].Next := N;
                     end;
            end; {ListNiTsuika}

          var
            K : TSoeji;
          begin
            Hyou[0].Next := 0;
            for K := 1 to Ninzuu do
              ListNiTsuika(K,0);
            First := Hyou[0].Next;
          end; {ListWoTsukuru}
       
再帰プロシージャ変数引数版
引数の P を値引数から変数引数に変更したもの.
ループ版の不満が解消される.
        procedure ListWoTsukuru;

          procedure ListNiTsuika(N : TSoeji; var P : TSoeji);
            begin
              if (P > 0) and (Hyou[P].Ten > Hyou[N].Ten)
                then ListNiTsuika(N,Hyou[P].Next)            // 再帰呼び出し
                else begin
                       Hyou[N].Next := P;
                       P := N;
                     end;
            end; {ListNiTsuika}

          var
            K : TSoeji;
          begin
            First := 0;
            for K := 1 to Ninzuu do
              ListNiTsuika(K,First);
          end; {ListWoTsukuru}
       

課題 成績管理プログラム SeisekiKanri3
SeisekiKanri2 を次のように修正する.
変数引数の再帰プロシージャを使う.
リストの順番で書き出す.
リストの逆順でも書き出す(再帰プロシージャ).

提出方法
プログラム名 SeisekiKanri3
       (Program SeisekiKanri3; //学生証番号 氏名)
フォルダー名 Seiseki3-学生証番号(例 Seiseki3-2ASS1111)
提出期限   6月2日18時15分