計算機基礎論II,新年休みのレポート問題

12月25日を休講にする代わりに実践的プログラミングの 問題を出します.
問題 来年度(平成11年度)の授業時間割を作成したい.
    授業題目 履修開始回生 学期 曜日 時限 担当教官 教室
の順でならべたデータを用意し,HTMLファイルで出力する プログラムを作成せよ.
但し,データの例 (jugyo.dat) と,その出力例(table.html) があるのでこれを参考にすること.また, awk を使った Cシェルコマンド スクリプトも参考にしてよいが,プログラムは C, Pascal などのコンパイラー言語 を用いること.
但し,複数人で共同制作も可能.レポートを連名で提出すること. また,参考にした文献・人等を明記すること.
レポートは上記と,プログラムの解説,プログラムソースをつけて, メールで提出.期限は1999年1月29日(23時59分59秒).

講評

単に table.html を読み込んで、そのまま吐き出している人が何人かいた。 「何か考えていました」というアピールとしては認めるが、解答にはなっていない。

まともにプログラムを作成してくれた人は何人かいるが、 その中で一番早かった辰見君のプログラムを添削してみる。

辰見君も考察で書いてくれたが、sscanf() でなく fscanf() を使うと元のデータの フィールド数がバラバラなのでうまく読み込んでもらえない。 また、"月" などは文字列なので strcmp() を使わないと比較ができない。

ワークステーションの cc で動作を確認してから提出していると思うが、 パソコン(Win95)の gcc でコンパイルしたコードは segmentation violation で動作しなかった。そこで、宣言されている変数をすべて static にした ところ動いてくれた。他にも、#define N 500 で余裕ありすぎの配列を 取っているところとか、数字が入るに決まってるところは int にするとか、 変数の初期値設定をしてないところを直したのが、 このプログラムである。(static 宣言すると、初期値は 0 又は NULL になってくれるのか分からない、という意味では不完全ではあるが)

曜日を5つならべて同じ処理を書くのもなんだしなぁ、という場合は こんなふうにしてみてもよい。このように表を 作成しておくというのはプログラムを簡単にするための常套手段。 C シェルだと文字列をループの制御変数に入れられるのだが、 C言語ではそうはいかない。文字列へのポインタなら制御変数に できるので、試してみたい人は最後の例を参考にやってみよう。

配列をいくつも作って、添字が同じのは同じ授業のデータだよ、という方法も あるが、それよりはデータを構造化して「構造体」を使い、同じ授業のデータ はひとまとめにした方がよい。というのが教科書に書いてあるのでそうした のが、このプログラム。しかし、これでは変数を呼び出す時の 名前が長くなるだけで面白くない、というのであれば、「ポインタ」を使うことだ。 データの終わりの印を何か工夫しておく必要があることも注意して欲しい。

さらに、もっとデータが多くなった時のために、動的にデータ領域を割り当てるとか、 読み込んだデータを学期・時限・曜日の順で並べ替えておくと検索にヒットした 後は抜けられるのでいいとか、 工夫の余地は沢山あるが、計算機2年目の学生としてはこの程度にしておく。

(99/01/30)