こんにちは
デシジョンテーブルを生成するプログラムについて考えた時の備忘録です。
動機
いつも行き当たりばったりでデバッグ項目を考えていたのですが,そろそろ機械的にデバッグ項目を決めたいと思い,デシジョンテーブルを頼る事にしました。
ただ,手動でデシジョンテーブルを作成するのはしんどいので,条件と動作を与えたら表を自動生成するプログラムを作りたいと思った次第です。
簡易的なデシジョンテーブルをサクッと作りたい時に便利かも…?
デシジョンテーブル(決定表)とは
システムに入力される[条件]と出力される[動作]を表として視覚的に表現したものだと思っています。
ソフトウェア以外の分野でもよく使われている気がします。
JISX0125:1986でも説明されていますね。
kikakurui.com
生成するデシジョンテーブル
単純なカンマ区切りの.csv形式で出力することを目指します。
サンプル
条件数=3: Y (条件を満足する),N (条件を満足しない)
動作数=4: - (実行しない)
初期状態だけを生成して,後は好きに扱うこととします。
,No. 1,No. 2,No. 3,No. 4,No. 5,No. 6,No. 7,No. 8 条件,,,,,,,, 条件1,Y,Y,Y,Y,N,N,N,N 条件2,Y,Y,N,N,Y,Y,N,N 条件3,Y,N,Y,N,Y,N,Y,N 動作,,,,,,,, 動作1,-,-,-,-,-,-,-,- 動作2,-,-,-,-,-,-,-,- 動作3,-,-,-,-,-,-,-,- 動作4,-,-,-,-,-,-,-,-
デシジョンテーブルとは言えないかもしれませんが,まあヨシッ!!
アルゴリズム
大まかな処理は以下の通りです。
- 表見出し生成
- 条件部生成
- 動作部生成
説明する程でも無いですが,未来の自分の為にエセ言語で示します...
1. 表見出し生成
「No.~」の部分ですね。
,No. 1,No. 2,No. 3,No. 4,No. 5,No. 6,No. 7,No. 8
デシジョンテーブルの列数は,条件数をXとすると以下の式から求められます。
あとは列数分だけカンマ区切りで出力するだけですね。
条件数 <- InputNum 列数 <- 2^{条件数} i <- 0 for i < 列数 do print "," + "No." + i i <- i + 1 end for print "\n"
2. 条件部生成
Y/Nを規則的に出力する条件部は少し考える余地があります。
条件部の各行に中もすると,YとNが規則的に出現します。
条件数(X)が2の時 条件1: Y,Y,N,N 条件2: Y,N,Y,N 条件数(X)が3の時 条件1: Y,Y,Y,Y,N,N,N,N 条件2: Y,Y,N,N,Y,Y,N,N 条件3: Y,N,Y,N,Y,N,Y,N 条件数(X)が4の時 条件1: Y,Y,Y,Y,Y,Y,Y,Y,N,N,N,N,N,N,N,N 条件2: Y,Y,Y,Y,N,N,N,N,Y,Y,Y,Y,N,N,N,N 条件3: Y,Y,N,N,Y,Y,N,N,Y,Y,N,N,Y,Y,N,N 条件4: Y,N,Y,N,Y,N,Y,N,Y,N,Y,N,Y,N,Y,N
暫く眺めてみると,Y/Nの出現パターンは以下のような気がしますね。
正直,うまく説明できないので感じてほしい。
ここから,条件数がX=4のとき,Y/Nは交互に下記のパターンで出現します。
要は前回の行の半分が出現パターンになるようです。
列数: 2^4 = 16 条件1(N=1): Y=8, N=8 条件2(N=2): Y=4, N=4 条件3(N=3): Y=2, N=2 条件4(N=4): Y=1, N=1
このままでも実装できますが,剰余も使うとスッキリプログラムが書ける気がしました。
(val%2の部分)
条件数 <- InputNum 列数 = 2^{条件数} print "条件" i <- 0 for i < 列数 do print "," i <- i + 1 end for 条件記述部[] <- InputString[] 条件指定部[] <- {"Y", "N"} div <- 列数 / 2 i <- 0 for i < 条件数 do print " " + 条件記述部[i] j <- 0 for j < 列数 do val <- j / div index <- val % 2 print "," + 条件指定部[index] end for div <- div / 2 print "\n" end for
プログラムを書く前は「真理値表を作るだけじゃん」とか思っていたのですが,.csv形式に落とす時に詰みました。
今回は行に注目しましたが,列に注目するなら真理値表を作成する方式で良さそうですね。
3. 動作部生成
ここはフォーマットに合わせて出力するだけ。
動作数 <- InputNum 条件数 <- InputNum 列数 = 2^{条件数} print "動作" i <- 0 for i < 列数 do print "," i <- i + 1 end for 動作記述部[] <- InputString[] i <- 0 for i < 動作数 do print " " + 動作記述部[i] j <- 0 for j < 列数 do print "," + "-" end for print "\n" end for
実装: シェルスクリプト
勉強を兼ねてシェルスクリプトで実装しました。
処理効率が悪いので,別の言語で実装した方が良いです。
めも
- 関数の引数はC言語のように指定せず,通常通り指定する。
- 関数の戻り値は標準出力を経由する。
- 関数のreturnは関数の終了ステータスを示す。
- echo -n で改行しない。
感想
デシジョンテーブルを使いこなして定時退社したい。