わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

構造体プログラミングの実例(1)〜概要

毎週火曜日の自主演習で,用意した課題,学生には難関に見えたかもしれません学生にとって敷居が高そうです
その理由として,「ある程度制約された課題a moderately restricted problem」に対するプログラミング方法を教わっていないからではないか,という仮説を立てるに至りました.すなわち,これまでは,制約が厳しすぎたり(ソースファイルの穴埋めなど),逆に自由すぎたり(「再帰を使ったプログラムを自由に作りなさい」など)していたのではないか,という疑念です.
といっても,この仮説が正しいかどうかを検証するのが本意ではありません.これから数回にわたって,この仮説が正しいとして,「ある程度制約された課題」がどのようなものか,そしてどんなプログラミング方法をとればいいか,実例を挙げて説明することにします.
実際にプログラムを作っていく課題は,以下の通りです.もちろん言語はCです*1

総当たり戦の対戦結果を表にして出力するプログラムを作りなさい.入出力は適当に定めること.

これだけの短い文章ですが,「総当たり戦だから,2次元配列があればいいんだよな…」と漫然と考えるのでは,書きやすく読みやすいプログラムは作りにくいものです.
課題では明示していませんが,ここは「構造体」を使うことを考えるべきです.一つの構造体の中に,対戦結果の2次元配列だけでなく,総当たり戦の対戦者に関する情報を持たせるわけです.
今日は概要ということで,上の課題について,私はどのようにプログラムを作っていったかを列挙します.一つの構造体を使って,200〜300行程度で書くプログラムに適用できると思います.

  1. 大まかな仕様を決める.
  2. 仕様に基づく入力データを2〜3種類,用意する.出力例も手作業で作る.仕様を修正・追加する.
  3. データ構造(構造体)を決める.
  4. プログラムに取りかかる.はじめに,main関数,構造体,構造体を初期化する関数を定義する.
  5. 構造体への操作として必要なものを考え,それぞれ関数として表現する.
  6. 構造体を直接アクセスしない「下請け関数」を定義していく.
  7. 呼び出し関係に注意して,プログラムを完成させる.(ただしこの時点では正しく動く保証はない.)
  8. コンパイルデバッグして,「動く」ようにする.入力データを与えて,手作業で作った出力結果と一致することを確認する.様々な入力を与えても,問題なく動くようにする.
  9. プログラムを整理する.
  10. 完成!

*1:現時点でプログラムは完成させています.