2001年3月2日 参考書へのリンクを追加 関谷のWebサイトトップページへ 関谷(KPC情報技術科)トップページへ 関谷へのメッセージ
(職業能力開発報文誌 第5巻第2号pp.43-50 1993年9月)
情報システム系の1年生(平成4年度 48 名) への「アルゴリズム」と「構造化プログラミング実習」教科( 以下では, アルゴリズムの授業という。) の目的は, アルゴリズムの理解と表現,評価ができることである。具体的には,アルゴリズムの表現物である流れ図や日本語での文章(処理手順)を読み,構成し,書くことと,計算量とアルゴリズムの特徴の評価ができることをめざす。さらに, このアルゴリズムを実行可能なプログラムとして計算機を使って作成・テストし,実行時間の測定などができ,評価できることである。
この前に学習していること(既習事項)について説明する。図1のシラバス(授業計画表)を参照のこと。入学後すぐに,コンピュータ入門としてキー操作,エディタ,MS−DOS,日本語ワープロについての実習を,「計算機命令実習」などの4教科合わせて12時間ほど行っている。次にC言語でのプログラミングの基礎的な学習は,「ソフトウェア工学」との3教科一緒でこの入門に引き続き既に12回ほど行っている。
この授業で使用するテキストは「C−データ構造とプログラム」(1) であり,アルゴリズムはC言語での例題によっている。その説明には説明が丁寧に付いている。例題のCソース・プログラムは,予め著者がハードディスクに入力しており,学生は各自のフロッピーにコピーして使うのを原則とした。(演習で作るプログラムは除く。)
授業の進め方は,始めに,概要を説明し,その後は例のプログラムの機能と使い方の説明をして,実際のデータを使っての操作を行い,データの動きを確認していく方法をとった。そして,レポートとしての提出物をプログラム仕様(入力,処理,出力),関数毎の処理手順,考察をエディタで入力したもの,実行結果のリスト,流れ図(手書き)とした。
この講義と実習を組み合わせたやり方によって,実習のないクラスでの授業での単なる文章やプログラムリストでの想像のみでなく,テストデータでのコンピュータ実験ができた。そしてVで述べるが,コンピュータによりデータ処理の確認が出来るような例題プログラムを用意していた。時間的にはコンピュータの操作実習が伴うために,予定よりも時間が掛かる面があった。しかし,それ以上に,自分からの能動的な働きによってしか,テスト・実行ができないこと,データ処理の確認が容易にできたこと,日本語での処理手順の作成などにより,アルゴリズムとプログラムの理解が良くできたと思うので,報告する。
職業訓練短期大学校におけるカリキュラムについては, 「あり方検討委員会」の標準カリキュラム作成専門部会で検討され, それに従って当系・科でも見直しを行った。情報処理科での変更の主なものは, 次の2点である。
1) 「計算機命令実習」が追加された。
2) 「ディジタル工学」「同実習」が追加された。
情報システム系でのカリキュラムの検討をして,図2の教科目の系統図(2) を作り,分担してシラバスの作成と検討会を持ち、授業の計画と実施をした。
なお,「アルゴリズム」教科(C言語によるもので10月まで)については,それまでの「データ構造」(II,III期で4単位で実習は付いていなかったもの) が,これに引き継いだことになった。開講時期がI期からに変わったことにより,導入教育や,C言語の教育を始めに追加している。
これらの検討での参考資料としては,次のものも参照したので紹介する。
1)情報処理学会での「大学等における情報処理教育検討委員会」の調査研究(3),(4),(5)
これによると,アメリカのでのACMカリキュラム'78 等を参考にして, 日本の大学での情報処理教育の検討がなされている。
2)文部省と回り持ちの幹事大学による情報処理教育研究集会報告書(6),(7),(8)
第1回を九州工業大学で昭和63年の10月に開催して以来第5 回を1992年北海道大学で行っている。いろんな大学や短大,高専での事例が紹介されている。
3)初級情報処理技術者育成指針(9)
情報処理技術者試験を対象とする技術者養成のための標準のカリキュラムとして,初級のほかに中級,上級もある。主として,専修学校のカリキュラム等に使われている。
4)幾つかの大学での情報処理教育の事例の紹介が,情報処理学会誌にある。(10),(11),(12)
学習時間や時期によるわけで,教科書によっても違うし,標準的なものが有るわけではない。「あり方」での範囲を参考にして,使用するテキストは以前からのもの(1) を使うことにして,図1のシラバスとした。なお,II期のはじめに,続きを行っている。(線形リスト,2分木,B−木,トライ,グラフ,インタプリタとコンパイラの基礎)。その後は、COBOLでのプログラミングに切り替わっている。
なお,アルゴリズムの授業の始め(第9回)だけでなく,その都度,それぞれのアルゴリズムの比較・評価を行っている。
アルゴリズム(処理手順)の図による表現法は,流れ図のほかに幾つかの方法がJISには参考表としてある。また,教科書などでは,日本語での表現,PASCALやC言語などのプログラミング言語での表現などがある。それらの表現法について概要を説明する。
図記号が分かりやすく,現在の「JIS X0121 情報処理用流れ図等記号」(13)はループ端の記号を持ち構造化プログラミングに対応している。情報処理技術者試験の2種では,流れ図の問題が出題されている。
しかし,流れ図では記号の大きさに制限されて,枠内では短い表現となり,説明は右側にコメントとして分けて書くことが必要となる。
また,一般のテキスト・エディタでは流れ図の記号を書くことができない。
「JIS X0128 プログラム構成要素及びその表記法」(14)の参考表で紹介してあるように,欧米各国や日本でも企業により,幾つかが使用されている。
当科でも,今までにPAD,YACIIなどが一部の教科で使用されてきた。
これらの表現をコンピュータ上で(編集ソフトを使って)行えば,目的言語のソース・プログラムを生成するソフトがある。(PADETやYPSコンパイラ)
図を使わない表現として,制御範囲を明確にするために,見出し記号の付け方を次のように規定すると,処理の意味を説明して日本語で詳しく表現できる。この見出し記号の付け方は技術関係で多用される分類体系(15)である。
1. −−−−−−−−− 2. −−−−−−−−+ 2.1 −−−−−+ | 2.1.1 −−−−−| |2 2.1.2 −−−+| | 2.1.2.1 −−|| | 2.1.2.2 −−|| | −−−−++ | 2.2 −−−−−− | −−−−−−−−+ 3. −−−−−−−−− 4. −−−−−−−−−
この処理手順での要素は英数字であり,テキスト・エディタで編集できる。なお,テキストエディタは2つ以上の窓を上下に分けるなどして開けることにより,ソース・プログラムと対比しながら,これらの処理手順をコピー・入力・編集することができる。
処理手順の図を使わない表現としては,日本語と記号をもとにした簡潔な記法(16)やPASCAL(17),C(1),(18)などのプログラミング言語での表現が使われている。プログラミング言語で表現の場合,データの入出力などを行うメイン関数とそこでのモジュールの呼び出し等を追加して処理系に通せば,計算機でテストできる。実際にテストを行うには,テストデータの準備や結果の確認などが必要になるが。そして,それらのモジュールを実用にすることも可能である。
プログラミング言語での表現の場合,その言語についての文法の理解が必要となる。文法が分かれば,文章に較べて簡略した表現ができるので,見やすいとも言える。
情報システム系の1年生については系でのカリキュラム検討会で, 図表現では一番基本的な流れ図を使うことに話し合って決めた。始めからいろいろな記号を使った表現図に戸惑うことをさけるためである。また,情報処理技術者試験の受験者のことも考えた。
この授業の中では,図記号での流れ図の他に上記の3処理手順書と,4のC言語での表現を組み合わせて使うことにした。(19)
プログラムで使用するデータの表現の仕方として,変数表,データ構造図,領域図, レコードレイアウトや,プログラム言語での定義などがある。
単純なデータであれば,変数表や領域図やプログラム言語での定義で十分である。しかしポインタなどによる構造をもったデータの場合は,データ構造図により(動的な変化を含めて)2次元的にデータの関係を表現することが必要になる。
実際,アルゴリズムの教科書や参考書では,データの例をつけて,操作ごとに,どのようにデータ(の構造)が変化していくかを,図示している。図3は,2次のB木での追加の例である。
授業での説明も,これらの図を白板に書いたり, テキストやプリントを参照したりして行っている。レポートでもそれらの手書きを要求していた。(実習の時間がなかった前のクラスの場合。) しかしながら,実習でせっかくコンピュータを使うのだから,コンピュータでこれらを表示してやれば,プログラムでどんなことをしているのかを,わかりやすく見れるはずである。これを,次にのべる。
処理手順を実際にプログラム化して,その動作をテストデータを順番に処理していく中で見るには,主なデータの変更(代入)ごとに,データ群をプログラムで構造的に表示してやれば,コンピュータでの動作が追跡できることになる。
これを普通デバッグ用のチェックプリントと呼んでいるが,それをもっと積極的な意味で分かりやすく使うことにする。つまり,主要なデータやその構造( 関係) を表示するモジュール(関数)を追加し,そのモジュール呼び出しを,主要な処理毎に行うことで, データの変化−つまりプログラムの一連の処理結果−の表示が実現できる。
データ型には,数値や文字とそれらのグループ(構造体)とそれぞれへのポインタ型がある。この表示では,それぞれの変数名とその値をグループごとに表示している。出力した画面( リスト) でポインタ変数の値をたどって実際に指し示す先とを学習者が結べは,データ構造図として完成することになる。( ポインタの線を引く作業をコンピュータでは行っていないので, 半製品といえる。) なお,レポート用のプリンタ出力は, コントロールP で行う方が, リダイレクションで行うよりもよい。理由は, 入力データが同時に分かるからである。
図4は,2次のB木の追加処理での実行例である。このデータは図3と対応しており,各ノードが1行となっている。図5はこのB木を表示する関数リストである。
<B木を作る幾つかの整数を入力してください。終わりは,/ 60 20 80 10 / 次数2のB木の{削除(D),挿入(I),探索(S)}整数,終了(Q),表示(P):p --- B-木のプリント root:760ec0 p:760ec0, p->key: 10 20 60 80, p->ptr: 0 0 0 0 0 --- 次数2のB木の{削除(D),挿入(I),探索(S)}整数,終了(Q),表示(P):i15 次数2のB木の{削除(D),挿入(I),探索(S)}整数,終了(Q),表示(P):p --- B-木のプリント root:760e60 p:760e90, p->key: 60 80, p->ptr: 0 0 0 p:760ec0, p->key: 10 15, p->ptr: 0 0 0 p:760e60, p->key: 20, p->ptr: 760ec0 760e90 --- 図4 B木の作成と挿入の実行例(データ構造の表示)
printbt(NODE *p)/* B木のプリント関数(再帰) 90度 反時計方向に回転したもの*/ { int i; static indent =0; if(indent == 0) printf("\n--- B-木のプリント root:%4x\n", p); if (p != NULL) { indent += 6; for (i = p->cnt; i >= 0; i--) printbt(p->ptr[i]);/*子ノードのプリント*/ /* 再帰による*/ for (i=6; i< indent; i++) printf(" "); /* 字下げ*/ printf("p:%4x, p->key:", p); /* p:ノードの番地, データの見出し */ for (i=1; i<= p->cnt; i++) printf(" %3d", p->key[i-1]); /* データ表示*/ printf(", p->ptr:"); /* 子の番地の見出し */ for (i=0; i<= p->cnt; i++) printf(" %4x", p->ptr[i]); /* ptr表示*/ printf("\n"); indent -= 6; if(indent == 0) printf("---\n"); /* B-木の構造図の終わり */ } } 図5 B木のプリント関数のソース・プログラムリスト
図6は,整数値の算術演算を行うインタプリタの処理例である。関数が再帰的に呼ばれているのが分かる。木を反時計回りに90度回転して、上下対称となっている。
このVSLインタプリタは,入力ファイル(VSLプログラム(例{3-2*5})) を読み込み,計算をして,出力します。 入力ファイル名は: d239.dat VSLプログラムは、ファイルから{ }を読み込みます。 {9 | 因子 9 - | 式 - 3 | 因子 3 + | 式 + 1 | 因子 1 } 計算結果は: 7 {9 | 因子 9 - | 式 - ( | 因子 ( 3 | 因子 3 + | 式 + 1 | 因子 1 )} 計算結果は: 5 {2 | 因子 2 * | 項 * 3 | 因子 3 - | 式 - 4 | 因子 4 * | 項 * 5 | 因子 5 } 計算結果は: -14 図6 整数演算インタープリタの実行例
1)北九州職業訓練短期大学校の情報システム系での「アルゴリズム」教科(C言語による10月までの分)の平成4年度の概要を紹介した。
2)U期の11月から行ったCOBOLでのプログラミング作成との比較では、「C言語によるものが分かりにくかった。」との学生が多かった。じっくり考える時間が少なくて、消化不良を起こしたと考えられる。学習内容の絞りこみが必要であると思う。 3)教材用プログラムにデータ表示の関数を追加し, それを処理ごとに呼び出してデータ構造の変化をプリントした。これにより,処理途中での一連のデータ処理結果の確認ができ,計算機によるテスト状況把握を容易に行うことが出来た。
4)今後の課題として,もっと分かりやすい標準的なデータの表示を工夫したい。
学生が興味を持って学習できるような授業とその中でひとりでに知識や技能が身に付いていくやり方を作っていきたいと思う。
最後に、指導・協力をして頂いている当系および当短大の職員の皆様に感謝します。
1) Leendert Ammeraal著: 小山裕徳訳:C−データ構造とプログラム,オーム社,1991 Cで学ぶデータ構造とプログラム(原著の改訂版)(1995/11/01) 2) 北九州職業訓練短期大学校: 「平成4年度履修案内及び授業要目」平成4年,pp.38 3) 野口正一・中森真理雄: 大学等における情報処理教育の諸問題, 情報処理,Vol.31,No.10,pp.1373-1389 4) 野口正一他: 大学等における情報系専門教育の改善への提言, 情報処理,Vol.32,No.10,pp.1079-1092 5) 情報処理学会大学等における情報処理教育検討委員会: 大学等における情報処理教育のための調査研究報告書, 情報処理学会,1992 年3 月 6) 九州工業大学情報工学部編: 昭和63年度情報処理教育研究集会報告書,1989 年3 月 7) 東北大学情報処理教育センター編: 平成元年度情報処理教育研究集会報告書,1990 年3 月 8) 京都大学情報処理教育センター編: 平成2年度情報処理教育研究集会報告書,1991 年 9) 情報処理技術者育成指針作成委員会: 初級情報処理技術者育成指針, 日本情報処理開発協会情報処理研修センター,1986 年3 月 10) 安村通晃・有澤誠・斎藤信男: コンピュータリテラシー教育の一事例,情報処理,Vol.32,No.12,pp.1310-1316 11) 小谷善行・高橋延匡: 情報処理専門教育の一事例, 情報処理,Vol.33,No.2,pp.161-168 12) 村岡洋一: 情報学科カリキュラムの一例, 情報処理,Vol.33,No.2,pp.169-175 13) 日本工業規格 JIS X 0121-1986 情報処理用流れ図・プログラム網図・システム資源図記号, 日本規格協会,1986 14) 日本工業規格 JIS X 0128-1988 プログラム構成要素及びその表記法, 日本規格協会,1988 15) 土居範久・筧捷彦: プログラミングの考え方, 岩波書店,1987 16) 篠田義明: コミュニケーション技術−実用的文章の書き方−中公新書807,中央公論社,1986,pp.170 17) 石畑清: アルゴリズムとデータ構造, 岩波書店,1989 18) 近藤嘉雪: Cプログラマのためのアルゴリズムとデータ構造, ソフトバンク,1992 (定本←1998に1,2を合冊) 19) 関谷順太:スクリーン・エディタによるプログラム資料作成,職業能力開発報文誌,第5巻,第1号,pp.129-133