83
やわらかマッドサイエンティスツのプログラミング入門 3つのダイアログから見た プログラミング USP友の会会員 鳥海秀一 第2回 ジャクソン構造図の巻(後編)

Usp友の会勉強会、ジャクソン構造図の巻(後編)

  • Upload
    umidori

  • View
    2.261

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Usp友の会勉強会、ジャクソン構造図の巻(後編)

やわらかマッドサイエンティスツのプログラミング入門

3つのダイアログから見た プログラミング

USP友の会会員 鳥海秀一

第2回 ジャクソン構造図の巻(後編)

Page 2: Usp友の会勉強会、ジャクソン構造図の巻(後編)

自己紹介

名前:鳥海秀一

出身地:北海道

年齢:47歳

業務で初めて使った言語はRPG

職業:SIerのBPとして、金融機関で働いてます

趣味:プログラミング言語の習得

USP友の会との関わり: 「アジャイルジャパン2009」の當仲講演から

Page 3: Usp友の会勉強会、ジャクソン構造図の巻(後編)

本日の予定

1. USP友の会の紹介(10分)

2. アイスブレイク(一言自己紹介)(30分)

3. 前回の振り返り(30分)

4. 講義1(先読み技法紹介)(30分)

5. 演習( 60分ぐらい)

6. ライブプログラミング(30分)

7. 次回の予告(20分)

8. まとめ(25分)

Page 4: Usp友の会勉強会、ジャクソン構造図の巻(後編)

自己紹介をお願いします

下記の内容を含めてください

①お名前とご出身と現在お住まいの場所

②ご職業と今やっていること

③この勉強会に参加しようと思ったわけ

1分間でお願いします。

Page 5: Usp友の会勉強会、ジャクソン構造図の巻(後編)

※注意 本勉強会が対象とする設計の規模

• 80個の“=”を出力するプログラムより少しだけ大きいプログラムの設計方法

Page 6: Usp友の会勉強会、ジャクソン構造図の巻(後編)

前回までの振り返り

1. プログラム入門でダイアログを 取り上げる理由について

2. 状態遷移図について

3. ジャクソン構造図について

Page 7: Usp友の会勉強会、ジャクソン構造図の巻(後編)

プログラム入門でダイアログを取り上げる理由

プログラムの作成には事前の設計が大切

• 設計は二つのプロセスから構成される – 発散

– 収束

• 発散には概要把握と視点の切り替えが必要

• ダイアログは上記二つを提供する

Page 8: Usp友の会勉強会、ジャクソン構造図の巻(後編)

3つのダイアログが提供する3つの視点

• 状態遷移図 状態遷移(計算モデル)

• ジャクソン構造図 データの構造

• データフローダイアグラム データの流れ

Page 9: Usp友の会勉強会、ジャクソン構造図の巻(後編)

状態遷移図について

1. 計算モデルの一つ、有限オートマトンの図式表現

• 構成要素は状態、事象、状態遷移、(アクティビティ)

2. マルコフ性を意識することが重要

• 未来の状態は現在の状態と外部刺激だけで決まる

Page 10: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例題:整数判定の状態遷移図

S0 S1 S2 OK

NG

0~9

0~9

0~9

+|- EOS

その他 その他

その他

開始

Page 11: Usp友の会勉強会、ジャクソン構造図の巻(後編)

詳しくは下記資料を参照

• スライドシェア http://www.slideshare.net/ryuichiueda/usp-9642558

• USPマガジン Vol.3

Page 12: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図について

1. プログラムの入出力データ構造に着目

• 連接、選択、反復の3つの構成要素を用いた木構造でデータを表現

2. 表現力は状態遷移図と等価

3. 可読性の高いプログラムを導きやすい

Page 13: Usp友の会勉強会、ジャクソン構造図の巻(後編)

入出力のデータ構造に着目

• プログラムは入力データを出力データに変換するものであり、両者の構造から影響を受ける

処理 入力データ 出力データ

Page 14: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図の基本構造

次の3つの基本構造でデータを記述する

• 連接

• 選択

• 反復

Page 15: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図による連接の表現

Aは、BとCとDからなる

A

B C D

Page 16: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図の連接の例

年月日

年 月 日

名前

姓 名

Page 17: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図による選択の表現

Aは、BかCかDである

A

B C D

Page 18: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図による選択の表現(補足1)

Aは、BかCか存在しないかである

A

B C -

Page 19: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図による選択の表現(補足2)

Aは、Bか存在しないかである

A

B -

A

B

(省略形)

Page 20: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図の選択の例

年金

国民 年金

厚生 年金

共済 年金

男 女

Page 21: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図による反復の表現

Aは、複数のBからなる

A

B

Page 22: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図の反復の例

テキスト ファイル

プロジェクト

プロジェクトメンバー

Page 23: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図による整数表現

整数

+ or -

1文字目 数字

0~9

符号

2文字目 以降数字群

絶対値

0~9

Page 24: Usp友の会勉強会、ジャクソン構造図の巻(後編)

表現力は状態遷移図と等価

言語階層 機械 文法 備考

タイプ0 チューリングマシン 句構造文法

タイプ1 線形有界オートマトン 文脈依存文法

タイプ2 プッシュダウンオートマトン

文脈自由文法 プログラミング言語の階層

タイプ3 有限オートマトン 正規文法

ジャクソン構造図と等価

状態遷移図と等価

Page 25: Usp友の会勉強会、ジャクソン構造図の巻(後編)

可読性の高いプログラムを導きやすい

1. 木構造でデータを表現

• 木構造は人の思考となじみやすい

2. 3つの基本構造という制約

• 基本構造の制約が構造化された(上から下に読んでいける)プログラムを導く

Page 26: Usp友の会勉強会、ジャクソン構造図の巻(後編)

木構造による表現

木構造(階層構造)は概念構造に相即的

• 複合概念、基本概念

• 上位概念、下位概念

Page 27: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例:整数という概念

整数は符号とそれに続く絶対値から構成される。符号はなくてもよいが、ある場合には「+」か「ー」かの一文字からなり…

整数

+ or -

1文字目 数字

0~9

符号

2文字目 以降数字群

絶対値

0~9

Page 28: Usp友の会勉強会、ジャクソン構造図の巻(後編)

補足:階層構造を導入した状態遷移図(ハレル図)

絶対値

符号

整数

0 ~ 9

+|-

0 ~ 9

0 ~ 9

EOS

Page 29: Usp友の会勉強会、ジャクソン構造図の巻(後編)

3つの基本構造という制約

• きちんと構造を表現しないとプログラムが導けない

(整数のジャクソン構造図の悪例)

整数

文字

符号 ○

数字

+ or -

0~9

Page 30: Usp友の会勉強会、ジャクソン構造図の巻(後編)

(補足)状態遷移図の威力

状態遷移図からなら先の悪例からもプログラムを導けます。

Page 31: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例:整数判定の状態遷移図

S0 S1 S2 OK

NG

0~9

0~9

0~9

+|- EOS

その他 その他

その他

開始

Page 32: Usp友の会勉強会、ジャクソン構造図の巻(後編)

先の例を状態遷移表に変換

符号 (+ or -)

数字 (0~9)

終端 (EOS)

その他

S0 S1 S2 NG NG

S1 NG S2 NG NG

S2 NG S2 OK NG

Page 33: Usp友の会勉強会、ジャクソン構造図の巻(後編)

状態遷移表の縦と横を入れ替える

S0 S1 S2

符号 (+ or -)

S1 NG NG

数字 (0~9)

S2 S2 S2

終端 (EOS)

NG NG OK

その他 NG NG NG

Page 34: Usp友の会勉強会、ジャクソン構造図の巻(後編)

プログラムに変換すると

} else {

exit 1;

}

}

if ($s == 2) {

exit 0;

} else {

exit 1;

}

#!/usr/bin/perl

@c = split //, shift;

$s = 0;

for $c (@c) {

if ($c eq '+' || $c eq '-') {

if ($s == 0) {

$s = 1;

} else {

exit 1;

}

} elsif ('0' le $c && $c le '9') {

if ($s == 0 || $s1 == 1 || $s == 2) {

$s = 2;

}

Page 35: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図による整数表現

整数

+ or -

1文字目 数字

0~9

符号

2文字目 以降数字群

絶対値

0~9

Page 36: Usp友の会勉強会、ジャクソン構造図の巻(後編)

先のジャクソン構造図から導かれたプログラム

while ('0' le $c && $c le '9') {

$c = shift @c;

}

if ($c eq '') {

exit 0;

} else {

exit 1;

}

#!/usr/bin/perl

@c = split //, shift;

$c = shift @c;

if ($c eq '+' || $c eq '-') {

$c = shift @c;

}

if ('0' le $c && $c le '9') {

$c = shift @c;

} else {

exit 1;

}

Page 37: Usp友の会勉強会、ジャクソン構造図の巻(後編)

前回の宿題

1. 身の回りのもので位置を利用して情報を表現しているものを探してみよう

2. 浮動小数点数のジャクソン構造図をプログラムに変換してみよう

3. 浮動小数点数の状態遷移図からgoto

プログラムを書いたのち、発見的手法でgotoを取り除いてみよう

Page 38: Usp友の会勉強会、ジャクソン構造図の巻(後編)

宿題2のジャクソン構造図

浮動

小数点数

符号

○ + or -

仮数部

○ 整数部付 絶対値

○ 小数部のみ 絶対値

整数部

○ 省略可能 小数部

1文字目 数字

2文字目 以降数字群

0~9

* 0~9

小数点

小数

* 0~9

小数部

小数点

小数

1文字目 数字

2文字目 以降数字群

0~9

* 0~9

絶対値

指数部

○ 省略可能 指数部

指数文字

小数部

E or e

指数

符号

○ + or -

整数部

1文字目 数字

2文字目 以降数字群

0~9

* 0~9

Page 39: Usp友の会勉強会、ジャクソン構造図の巻(後編)

宿題2の解答例

} elsif ($c eq '.') {

$c = shift @c;

if ('0' le $c && $c le '9') {

$c = shift @c;

while ('0' le $c && $c le '9') {

$c = shift @c;

}

} else {

exit 1;

}

} else {

exit 1;

}

if ($c eq 'E' || $c eq 'e') { $c = shift @c; if ($c eq '+' || $c eq '-') { $c = shift @c; } if ('0' le $c && $c le '9') { $c = shift @c; while ('0' le $c && $c le '9') { $c = shift @c; } } else { exit 1; } } if ($c eq '') { exit 0; } else { exit 1; }

#!/usr/bin/perl

@c = split //, shift;

$c = shift @c;

if ($c eq '+' || $c eq '-') {

$c = shift @c;

}

if ('0' le $c && $c le '9') {

$c = shift @c;

while ('0' le $c && $c le '9') {

$c = shift @c;

}

if ($c eq '.') {

$c = shift @c;

}

Page 40: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ここで休憩です

Page 41: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン構造図とは

データの構造の図示したもの

では、データの構造とは?

Page 42: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例題1

下記の課題が与えられたときのテキスファイルの構造をジャクソン構造図で示せ

問題1.テキストファイルの行数を求めよ。

問題2.テキストファイルのバイト数を求めよ。

問題3.テキストファイルの文字数を求めよ。

Page 43: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例題1:解答例

テキスト ファイル

* 行

テキスト ファイル

* バイト

テキスト ファイル

* 文字

解答例1 解答例2 解答例3

Page 44: Usp友の会勉強会、ジャクソン構造図の巻(後編)

プログラムに変換すると

#!/usr/bin/perl

$count = 0;

while (defined(getc)) {

$count++;

}

print $count, "¥n";

#!/usr/bin/perl

binmode STDIN, ":utf8";

$count = 0;

while (defined(getc)) {

$count++;

}

print $count, "¥n";

#!/usr/bin/perl

$count = 0;

while (<STDIN>) {

$count++;

}

print $count, "¥n";

解答例2 解答例3 解答例1

Page 45: Usp友の会勉強会、ジャクソン構造図の巻(後編)

結論1

データ構造はプログラムの目的により 変化する

Page 46: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例題2

テキストファイルの行数を求めたいとき、 テキストファイルの構造をジャクソン構造図で 示せ

Page 47: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例題2:解答例

テキスト ファイル

テキスト ファイル

文字

改行以外の文字

改行文字

テキスト ファイル

行文字列

改行文字

改行以外の文字

解答例1 解答例2 解答例3

Page 48: Usp友の会勉強会、ジャクソン構造図の巻(後編)

プログラムに変換すると

#!/usr/bin/perl

binmode STDIN, ":utf8";

$count = 0;

while (defined($char = getc)) {

if ($char eq "¥n") {

$count++;

}

}

print $count, "¥n";

#!/usr/bin/perl

binmode STDIN, ":utf8";

$count = 0;

while () {

while (defined($char = getc) && $char ne "¥n") {

}

last if (! defined($char));

$count++;

}

print $count, "¥n";

#!/usr/bin/perl

$count = 0;

while (<STDIN>) {

$count++;

}

print $count, "¥n";

問題2 問題3 解答例1

Page 49: Usp友の会勉強会、ジャクソン構造図の巻(後編)

結論2

データ構造は問題の解釈により変化する

Page 50: Usp友の会勉強会、ジャクソン構造図の巻(後編)

結論3

データの構造とはデータの解釈の仕方である。

「事実というものは存在しない。存在するのは解釈だけである。 」(by ニーチェ)

「われわれは事象を利用するために真理を『発明』する」(by ベルクソン)

Page 51: Usp友の会勉強会、ジャクソン構造図の巻(後編)

実用的に言い直すと

データの解釈の仕方により、プログラミングが簡単になったり、難しくなったりする。

プログラミングが簡単になる構造を見つけ出すのがジャクソン構造図を描く理由となる。

入力データ構造と出力データ構造の要素が良く対応する構造図がよいとされる。

Page 52: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例題3

「uniq –c」と同じような動きをするプログラ

ムを記述せよ。ただし、入力は標準入力のみとする。

Page 53: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例題3のプログラムの働き

4 a

3 b

a

a

a

a

b

b

b

出力データ 入力データ

Page 54: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例題3の拡張状態遷移図による表現

S0 S1 S2

行の取得成功 / カウンタ= 1

保存行に取得した行を保存 行の取得成功 & 保存行と取得行が一致 / カウンタ++

行の取得成功 & 保存行と取得行業が不一致 / print カウンタ, 保存行 カウンタ= 1 保存行に取得した行を保存

行の取得失敗 / print カウンタ, 保存行

行の取得失敗 / -

Page 55: Usp友の会勉強会、ジャクソン構造図の巻(後編)

状態遷移図をプログラムに変換すると

#!/usr/bin/perl

$line = <STDIN>;

if (not $line) {

exit;

}

$count = 1;

$old_line = $line;

while ($line = <STDIN>) {

if ($line ne $old_line) {

print "$count¥t$old_line";

$count = 1;

$old_line = $line;

} else {

$count++;

}

}

print "$count¥t$old_line";

Page 56: Usp友の会勉強会、ジャクソン構造図の巻(後編)

プログラムから導かれるデータ構造の ジャクソン構造図による表現

テキスト ファイル

内容なし

最初の行

間の行

内容あり

最後の行

○ 非ブレイク行

ブレイク行

直前の行と 同じ行

直前の行と 異なる行

テキスト ファイル

同一行の数

同一行

入力データ 出力データ

Page 57: Usp友の会勉強会、ジャクソン構造図の巻(後編)

もっと良い構造はないか…

あります。

但し、プログラムで表現するには先読み技法が必要です。

テキスト ファイル

同一行

同一行 グループ

テキスト ファイル

同一行の数

同一行

出力データ 入力データ

Page 58: Usp友の会勉強会、ジャクソン構造図の巻(後編)

先読み技法とは

ファイル処理に用いる技法で、処理対象となるデータの1つ先のデータを読む技法

ファイルの 内容の一部

ファイル

1.読み出し

2.注目

ファイルの 内容の一部

ファイル

内容の一部のコピー

1.読み出し 3. 読み出し

2.コピー

4.注目

5.とぎどき注目

通常のファイル処理 先読み技法を使った

ファイル処理

Page 59: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例:標準入力の行数を求めるプログラム

#!/usr/bin/perl

$count = 0;

$next_line = <STDIN>;

$line = $next_line;

while ($line) {

$next_line = <STDIN>;

$count++;

$line = $next_line;

}

print $count, "¥n";

#!/usr/bin/perl

$count = 0;

while (<STDIN>) {

$count++;

}

print $count, "¥n";

先読み技法を使ったファイル処理 通常のファイル処理

Page 60: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例題3のプログラムを記述

#!/usr/bin/perl

$next_line = <STDIN>;

while ($line = $next_line) {

$count = 0;

while ($line eq $next_line) {

$count++;

$next_line = <STDIN>

}

print "$count¥t$line";

}

#!/usr/bin/perl $line = <STDIN>; if (not $line) { exit; } $count = 1; $old_line = $line; while ($line = <STDIN>) { if ($line ne $old_line) { print "$count¥t$old_line"; $count = 1; $old_line = $line; } else { $count++; } } print "$count¥t$old_line";

先読み技法を使ったファイル処理 通常のファイル処理

Page 61: Usp友の会勉強会、ジャクソン構造図の巻(後編)

演習問題

print "小計:$count2¥t$old_col1 $old_col2¥n";

$count1 += $count2;

$count2 = 1;

$old_col2 = $col2;

if ($col1 ne $old_col1) {

print "大計:$count1¥t$old_col1¥n";

$count1 = 0;

$old_col1 = $col1;

}

} else {

$count2++;

}

}

print "小計:$count2¥t$old_col1 $old_col2¥n";

$count1 += $count2;

print "大計:$count1¥t$old_col1¥n";

#!/usr/bin/perl

$line = <STDIN>;

if (not $line) {

exit;

}

($col1, $col2) = split(/¥s/, $line);

$count1 = 0;

$count2 = 1;

$old_col1 = $col1;

$old_col2 = $col2;

while ($line = <STDIN>) {

($col1, $col2) = split(/¥s/, $line);

if ($col1 ne $old_col1 || $col2 ne $old_col2) {

下記のプログラムを先読み技法を使用して書き直せ。

Page 62: Usp友の会勉強会、ジャクソン構造図の巻(後編)

演習問題のプログラムの働き

小計:2 a a

小計:2 a b

大計:4 a

小計:3 b b

大計:3 b

a a

a a

a b

a b

b b

b b

b b

出力データ 入力データ

Page 63: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ヒント

入力データのジャクソン構造は下記の通り。

テキスト ファイル

カラム1,2 同一行グループ

カラム1 同一行グループ

カラム1,2 同一行

Page 64: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ここで休憩です

Page 65: Usp友の会勉強会、ジャクソン構造図の巻(後編)

演習問題解答例

print "小計:$count2¥t$col1 $col2¥n";

$count1 += $count2;

}

print "大計:$count1¥t$col1¥n";

}

#!/usr/bin/perl

if ($line = <STDIN>) {

($next_col1, $next_col2) = split(/¥s/, $line);

}

while ($line) {

$col1 = $next_col1;

$count1 = 0;

while ($line && $col1 eq $next_col1) {

$col2 = $next_col2;

$count2 = 0;

while ($line && $col1 eq $next_col1

&& $col2 eq $next_col2) {

$count2++;

if ($line = <STDIN>) {

($next_col1, $next_col2)

= split(/¥s/, $line)

}

}

Page 66: Usp友の会勉強会、ジャクソン構造図の巻(後編)

先読み技法ライブプログラミング

a b c

1 2 3

" "" """

"a" "b c"

あ¥nい¥n う え

_ _ _

a,b,c

1,2,3

"""","""""",""""""""

"""a""","""b","c"""

"あ

",う,え

,,

~

Excel互換のCSVパーサーを記述する

出力データ 入力データ

Page 67: Usp友の会勉強会、ジャクソン構造図の巻(後編)

CSVパーサーの拡張状態遷移図

S0

S1

S2

S3

S4

NG

改行|カンマ /出力

他/バッファ

他/バッファ

改行|カンマ /出力

他/バッファ

ダブルクォート /何もしない

他/バッファ

ダブルクォート /何もしない

ダブルクォート/エラー

他/エラー

ダブルクォート/何もしない

ダブルクォート/バッファ

改行|カンマ/出力

OK

EOF /何もしない

Page 68: Usp友の会勉強会、ジャクソン構造図の巻(後編)

CSVファイルのジャクソン構造図

CSV ファイル

項目本体

項目

区切り文字

カンマ ○

改行 ○

通常文字 のみ項目

空項目 ○

特殊文字含 項目

ダブルクォーテーション

特殊文字含 項目本体

ダブルクォーテーション

通常文字 ○

ダブルクォーテーション

カンマ

改行

通常文字

特殊文字 含文字

Page 69: Usp友の会勉強会、ジャクソン構造図の巻(後編)

先読み技法を使ったExcel互換の CSVパーサープログラム

elif ch == '"' and nch == '"': buffer += ch nch = chs.next() elif ch == '"': sys.exit(1) elif ch == ",": buffer += "," elif ch == "¥n": buffer += "¥¥n" else: buffer += ch ch = nch else: while ch and ch != "," and ch != "¥n": if ch == '"': sys.exit(1) buffer += ch ch = chs.next() if ch == ",": print buffer.encode("utf_8"), ch = chs.next() elif ch == "¥n": print buffer.encode("utf_8") ch = chs.next()

#!/usr/bin/python import os, sys def genchs(): for line in sys.stdin: line = line.decode("utf_8") for ch in line: yield ch yield "" if __name__ == "__main__": chs = genchs() ch = chs.next() while ch: buffer = "" if ch == "," or ch == "¥n": buffer += "_" elif ch == '"': ch = chs.next() while ch: nch = chs.next() if ch == '"' and (nch == "," or nch == "¥n"): ch = nch break

Page 70: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ここで休憩です

Page 71: Usp友の会勉強会、ジャクソン構造図の巻(後編)

まとめ1

1. データの解釈の仕方によりプログラミングは簡単になったり、難しくなったりする。

2. ジャクソン構造図はプログラミングを簡単にする構造を導き出すのに役立つ。

3. 先読み技法はジャクソン法で導き出した構造をプログラム上で表現するのに役立つ。

Page 72: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン法の長所

1. 状態をプログラム上で表現する方法には2種類ある

• プログラムの実行位置(テキスト指標)

• 変数

2. ジャクソン法は、前者を方法を重視する。

このため、可読性の高いプログラムを導きやすい。

Page 73: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ジャクソン法の短所について

1. ジャクソン法は前者の方法を重視しているため、プログラムから柔軟性は失われる。

2. 実行時に動きを変更するなどの柔軟性をプログラムに持たせたい場合は、ほかの方法を採用する必要がある。

Page 74: Usp友の会勉強会、ジャクソン構造図の巻(後編)

テーブル駆動方式の紹介

実行時にプログラムの動きを変更できる柔軟性の高いプログラムを作成できる技法。

但し、可読性は最低。

プログラムの自動生成に向いている。

Page 75: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例1:整数判定の状態遷移図

S0 S1 S2 OK

NG

0~9

0~9

0~9

+|- EOS

その他 その他

その他

開始

Page 76: Usp友の会勉強会、ジャクソン構造図の巻(後編)

先の例を状態遷移表に変換

その他 符号 (+ or -)

数字 (0~9)

終端 (EOS)

S0 NG S1 S2 NG

S1 NG NG S2 NG

S2 NG NG S2 OK

Page 77: Usp友の会勉強会、ジャクソン構造図の巻(後編)

状態遷移表からプログラムを作成

#!/usr/bin/perl

@c = split //, shift;

@state_table = (

[-2, 1, 2, -2],

[-2, -2, 2, -2],

[-2, -2, 2, -1]

);

@char_num{('+', '-', '0'..'9', '')} = ((1)x2, (2)x10, 3);

$s = 0;

while ($s >= 0) {

$s = $state_table[$s][$char_num{shift @c} || 0];

}

exit($s == -2);

Page 78: Usp友の会勉強会、ジャクソン構造図の巻(後編)

例2:浮動小数点数判定の状態遷移図

S0 S1 S2 S4 S5 S6

S3

+|- 0~9

S7

0~9

E|e

0~9

E|e

0~9

・ OK

EOS

EOS

0~9

0~9

+|-

0~9

0~9

NG

その他

EOS

開始

Page 79: Usp友の会勉強会、ジャクソン構造図の巻(後編)

先の例を状態遷移表に変換

その他 符号 (+ or -)

数字 (0~9)

小数点 (.)

指数記号 (E or e)

終端 (EOS)

S0 NG S1 S2 S3 NG NG

S1 NG NG S2 S3 NG NG

S2 NG NG S2 S4 S5 OK

S3 NG NG S4 NG NG NG

S4 NG NG S4 NG S5 OK

S5 NG S6 S7 NG NG NG

S6 NG NG S7 NG NG NG

S7 NG NG S7 NG NG OK

Page 80: Usp友の会勉強会、ジャクソン構造図の巻(後編)

状態遷移表からプログラムを作成

#!/usr/bin/perl

@c = split //, shift;

@state_table = (

[-2, 1, 2, 3, -2, -2],

[-2, -2, 2, 3, -2, -2],

[-2, -2, 2, 4, 5, -1],

[-2, -2, 4, -2, -2, -2],

[-2, -2, 4, -2, 5, -1],

[-2, 6, 7, -2, -2, -2],

[-2, -2, 7, -2, -2, -2],

[-2, -2, 7, -2, -2, -1]

);

@char_num{('+', '-', '0'..'9', '.', 'E', 'e', '')} = ((1)x2, (2)x10, 3, (4)x2, 5);

$s = 0;

while ($s >= 0) {

$s = $state_table[$s][$char_num{shift @c} || 0];

}

exit($s == -2);

Page 81: Usp友の会勉強会、ジャクソン構造図の巻(後編)

まとめ2

1. 状態遷移図はジャクソン構造図と違い、コーディングスタイルまで規定しない。

2. 状態遷移図はその分応用範囲が広いと 言える。

Page 82: Usp友の会勉強会、ジャクソン構造図の巻(後編)

参考文献

• M.A.ジャクソン(1985/02) 『構造的プログラム設計の原理』 (日本コンピュータ協会)

• 若林糧(2000/03) 『C言語プログラミング演習』 (日経BP社) • 飯泉 純子、大槻 繁(2011/08) 『ずっと受けたかったソフトウェア設計の授業』 (翔泳社)

• E.W.ダイクストラ、C.A.R.ホーア、O.J.ダール(1975/05) 『構造化プログラミング』 (サイエンス社)

• 野口健一郎(1990/05) 『ソフトウェアの論理的設計法』 (共立出版) • 玉井哲雄(2004/03) 『ソフトウェア工学の基礎』 (岩波書店) • スティーブ マコネル(2005/03) 『Code Complete第2版〈上〉』 (日経BPソフトプレス)

• きだあきら(1995/05) 「特集 Cプログラム設計技法」 『C MAGAZIN 1993 MAY Vol.5 No.5』 (ソフトバンク )

Page 83: Usp友の会勉強会、ジャクソン構造図の巻(後編)

ご清聴ありがとうございました

次回で最終回です。

言語はシェルを使用します。