少し前のことですが,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にしておけば,問題なしです*1.Ubuntuでgraphvizをインストールして,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つ,黄色になっているところは,黄色の意味が薄れているような.すなわち,「式評価」の黄色は赤色に,「記憶域管理関数」は緑色でよさそうです.今年度の授業では,また改訂します.