わさっきhb

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

C言語のキーワード関連図(2008年度版)

少し前のことですが,http://f.hatena.ne.jp/takehikom/20070121063702にスターをいただきました.
図ですが…少々古いです.昨年度の授業では,こうなっています.

ただ,線が入り組んでいますので,PowerPointで表示するという制約を超えて,描き直したいものです….Graphvizを使いましょう.
http://homepage3.nifty.com/kaku-chan/graphviz/index.htmlをもとに,dotファイルを書きました.

/* 2008.dot (途中版) */
digraph ckeyword2008 {
	識別子         [style = filled, fillcolor = "#FF99CC"];
	算術型         [style = filled, fillcolor = "#FF99CC"];
	制御文         [style = filled, fillcolor = "#FF99CC"];
	演算子         [style = filled, fillcolor = "#FF99CC"];
	配列・文字列   [style = filled, fillcolor = "#33CCCC"];
	ポインタ       [style = filled, fillcolor = "#33CCCC"];
	関数           [style = filled, fillcolor = "#33CCCC"];
	変数の有効範囲 [style = filled, fillcolor = "#33CCCC"];
	再帰呼び出し   [style = filled, fillcolor = "#33CCCC"];
	ライブラリ関数 [style = filled, fillcolor = "#99CC00"];
	その他の型     [style = filled, fillcolor = "#99CC00"];
	構造体         [style = filled, fillcolor = "#99CC00"];
	前処理指令     [style = filled, fillcolor = "#99CC00"];
	入出力         [style = filled, fillcolor = "#99CC00"];
	式評価         [style = filled, fillcolor = "#FFCC00"];
	記憶域管理関数 [style = filled, fillcolor = "#FFCC00"];

	識別子 -> 変数の有効範囲;
	算術型 -> 演算子;
	算術型 -> 式評価;
	算術型 -> 配列・文字列;
	算術型 -> その他の型;
	制御文 -> 演算子;
	制御文 -> 関数;
	演算子 -> 式評価;
	配列・文字列 -> ポインタ;
	配列・文字列 -> 入出力;
	ポインタ -> 関数;
	ポインタ -> 変数の有効範囲;
	ポインタ -> 記憶域管理関数;
	関数 -> 変数の有効範囲;
	関数 -> 再帰呼び出し;
	関数 -> ライブラリ関数;
	変数の有効範囲 -> 再帰呼び出し;
	ライブラリ関数 -> 入出力;
	ライブラリ関数 -> 記憶域管理関数;
	その他の型 -> 構造体;
	その他の型 -> 入出力;
	その他の型 -> 記憶域管理関数;
	前処理指令 -> ライブラリ関数;
	前処理指令 -> 入出力;
}

日本語を含みますが,文字コードUTF-8にしておけば,問題なしです*1Ubuntugraphvizをインストールして,dot -Tpng 2008.dot -o 2008.pngで変換.エラー・警告もなく,図ができました.

上から下への流れはできたものの,何か違和感があります.演算子を,配列・文字列と同列に並べるのはどうか…それで気づきました.この図では,各キーワードが,授業でどんな順番で取り上げるのか,さっぱり見えないですね.
ということでdotファイルを変更.

/* 2008.dot (完成版) */
digraph ckeyword2008 {
	識別子         [style = filled, fillcolor = "#FF99CC"];
	算術型         [style = filled, fillcolor = "#FF99CC"];
	制御文         [style = filled, fillcolor = "#FF99CC"];
	演算子         [style = filled, fillcolor = "#FF99CC"];
	配列・文字列   [style = filled, fillcolor = "#33CCCC"];
	ポインタ       [style = filled, fillcolor = "#33CCCC"];
	関数           [style = filled, fillcolor = "#33CCCC"];
	変数の有効範囲 [style = filled, fillcolor = "#33CCCC"];
	再帰呼び出し   [style = filled, fillcolor = "#33CCCC"];
	ライブラリ関数 [style = filled, fillcolor = "#99CC00"];
	その他の型     [style = filled, fillcolor = "#99CC00"];
	構造体         [style = filled, fillcolor = "#99CC00"];
	前処理指令     [style = filled, fillcolor = "#99CC00"];
	入出力         [style = filled, fillcolor = "#99CC00"];
	式評価         [style = filled, fillcolor = "#FFCC00"];
	記憶域管理関数 [style = filled, fillcolor = "#FFCC00"];2[shape = point, style = invis];3[shape = point, style = invis];4[shape = point, style = invis];5[shape = point, style = invis];6[shape = point, style = invis];8[shape = point, style = invis];9[shape = point, style = invis];10[shape = point, style = invis];11[shape = point, style = invis];12[shape = point, style = invis];2->3->4->5->6->8[style = invis]8->9->10->11->12[style = invis]

	識別子 -> 変数の有効範囲;
	算術型 -> 演算子;
	算術型 -> 式評価;
	算術型 -> 配列・文字列;
	算術型 -> その他の型;
	制御文 -> 演算子;
	制御文 -> 関数;
	演算子 -> 式評価;
	配列・文字列 -> ポインタ;
	配列・文字列 -> 入出力;
	ポインタ -> 関数;
	ポインタ -> 変数の有効範囲;
	ポインタ -> 記憶域管理関数;
	関数 -> 変数の有効範囲;
	関数 -> 再帰呼び出し;
	関数 -> ライブラリ関数;
	変数の有効範囲 -> 再帰呼び出し;
	ライブラリ関数 -> 入出力;
	ライブラリ関数 -> 記憶域管理関数;
	その他の型 -> 構造体;
	その他の型 -> 入出力;
	その他の型 -> 記憶域管理関数;
	前処理指令 -> ライブラリ関数;
	前処理指令 -> 入出力;

	{rank = same;2回 識別子 算術型};
	{rank = same;3回 制御文};
	{rank = same;4回 演算子 式評価};
	{rank = same;5回 配列・文字列};
	{rank = same;6回 ポインタ};
	{rank = same;8回 関数 変数の有効範囲};
	{rank = same;9回 再帰呼び出し ライブラリ関数};
	{rank = same;10回 その他の型 構造体};
	{rank = same;11回 前処理指令 入出力};
	{rank = same;12回 記憶域管理関数};
}

「第2回」〜「第12回」というダミーノードを入れて,揃えました.授業回数がいくつか飛んでいますが,初回はイントロ,第7回はポインタの2回目だからです.第13〜14回はおさらい,第15回は試験なので除外しています.
そしてできた図は:

「前処理指令」が下から上への矢印になっているのが,一見おかしいです.といってもこれは,ライブラリ関数に結びつけて,「#include」によるヘッダファイルのインクルードを説明しないといけないためです.2年ほど前までは,前処理指令として#define,#if,#includeを解説してから,よく知られたライブラリ関数を挙げていましたが,現在は,再帰呼び出しをする関数だけで1コマというのは多すぎるので,関数の「もう一つの話」として,ライブラリ関数,そして#includeを扱っています.
あと,2つ,黄色になっているところは,黄色の意味が薄れているような.すなわち,「式評価」の黄色は赤色に,「記憶域管理関数」は緑色でよさそうです.今年度の授業では,また改訂します.

*1:Windows環境では,このdotファイルのままで変換すると,文字化けの嵐です.「node [fontname = "MSPgothic"];」という指定を中に入れることで,警告は出ますが,日本語表示されます.と思いつつもよく見ると,明朝体で出ています.フォントの指定方法は,結局,分かりませんでした.