O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

3.751 visualizações

Publicada em

Publicada em: Tecnologia
  • Seja o primeiro a comentar

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

  1. 1. やわらかマッドサイエンティスツのプログラミング入門3つのダイアログから見たプログラミング第2回 ジャクソン構造図の巻(後編) USP友の会会員 鳥海秀一
  2. 2. 自己紹介名前:鳥海秀一出身地:北海道年齢:47歳業務で初めて使った言語はRPG職業:SIerのBPとして、金融機関で働いてます趣味:プログラミング言語の習得USP友の会との関わり: 「アジャイルジャパン2009」の當仲講演から
  3. 3. 本日の予定1. USP友の会の紹介(10分)2. アイスブレイク(一言自己紹介)(30分)3. 前回の振り返り(30分)4. 講義1(先読み技法紹介)(30分)5. 演習( 60分ぐらい)6. ライブプログラミング(30分)7. 次回の予告(20分)8. まとめ(25分)
  4. 4. 自己紹介をお願いします下記の内容を含めてください① お名前とご出身と現在お住まいの場所② ご職業と今やっていること③ この勉強会に参加しようと思ったわけ1分間でお願いします。
  5. 5. ※注意 本勉強会が対象とする設計の規模• 80個の“=”を出力するプログラムより少しだ け大きいプログラムの設計方法
  6. 6. 前回までの振り返り1. プログラム入門でダイアログを 取り上げる理由について2. 状態遷移図について3. ジャクソン構造図について
  7. 7. プログラム入門でダイアログを取り上げる理由プログラムの作成には事前の設計が大切• 設計は二つのプロセスから構成される – 発散 – 収束• 発散には概要把握と視点の切り替えが必要• ダイアログは上記二つを提供する
  8. 8. 3つのダイアログが提供する3つの視点• 状態遷移図 状態遷移(計算モデル)• ジャクソン構造図 データの構造• データフローダイアグラム データの流れ
  9. 9. 状態遷移図について1. 計算モデルの一つ、有限オートマトンの図式 表現 • 構成要素は状態、事象、状態遷移、(アクティビ ティ)2. マルコフ性を意識することが重要 • 未来の状態は現在の状態と外部刺激だけで決 まる
  10. 10. 例題:整数判定の状態遷移図 0~9 0~9 0~9 EOS +|-開始 S0 S1 S2 OK その他 その他 その他 NG
  11. 11. 詳しくは下記資料を参照• スライドシェアhttp://www.slideshare.net/ryuichiueda/usp-9642558• USPマガジン Vol.3
  12. 12. ジャクソン構造図について1. プログラムの入出力データ構造に着目 • 連接、選択、反復の3つの構成要素を用いた木 構造でデータを表現2. 表現力は状態遷移図と等価3. 可読性の高いプログラムを導きやすい
  13. 13. 入出力のデータ構造に着目• プログラムは入力データを出力データに 変換するものであり、両者の構造から影 響を受ける 入力データ 処理 出力データ
  14. 14. ジャクソン構造図の基本構造次の3つの基本構造でデータを記述する• 連接• 選択• 反復
  15. 15. ジャクソン構造図による連接の表現 A B C D Aは、BとCとDからなる
  16. 16. ジャクソン構造図の連接の例 名前 年月日姓 名 年 月 日
  17. 17. ジャクソン構造図による選択の表現 A B C D Aは、BかCかDである
  18. 18. ジャクソン構造図による選択の表現(補足1) A B C -Aは、BかCか存在しないかである
  19. 19. ジャクソン構造図による選択の表現(補足2) (省略形) A A B - B Aは、Bか存在しないかである
  20. 20. ジャクソン構造図の選択の例 人 年金 国民 厚生 共済男 女 年金 年金 年金
  21. 21. ジャクソン構造図による反復の表現 A * B Aは、複数のBからなる
  22. 22. ジャクソン構造図の反復の例 テキストプロジェクト ファイル * *プロジェクト 行 メンバー
  23. 23. ジャクソン構造図による整数表現 整数 符号 絶対値 ○ + or - 1文字目 2文字目 数字 以降数字群 * 0~9 0~9
  24. 24. 表現力は状態遷移図と等価言語階層 機械 文法 備考タイプ0 チューリングマシン 句構造文法タイプ1 線形有界オートマトン 文脈依存文法 プッシュダウンオートタイプ2 文脈自由文法 プログラミング言語の階層 マトン ジャクソン構造図と等価タイプ3 有限オートマトン 正規文法 状態遷移図と等価
  25. 25. 可読性の高いプログラムを導きやすい1. 木構造でデータを表現 • 木構造は人の思考となじみやすい2. 3つの基本構造という制約 • 基本構造の制約が構造化された(上から下に読 んでいける)プログラムを導く
  26. 26. 木構造による表現木構造(階層構造)は概念構造に相即的 • 複合概念、基本概念 • 上位概念、下位概念
  27. 27. 例:整数という概念整数は符号とそれに続く絶対値から構成される。符号はなくてもよいが、ある場合には「+」か「ー」かの一文字からなり… 整数 符号 絶対値 ○ 1文字目 2文字目 + or - 数字 以降数字群 * 0~9 0~9
  28. 28. 補足:階層構造を導入した状態遷移図(ハレル図) 0~9 整数 +|- 符号 0~9 絶対値 0~9 EOS
  29. 29. 3つの基本構造という制約• きちんと構造を表現しないとプログラムが導 けない(整数のジャクソン構造図の悪例) 整数 * 文字 ○ ○ 符号 数字 + or - 0~9
  30. 30. (補足)状態遷移図の威力状態遷移図からなら先の悪例からもプログラムを導けます。
  31. 31. 例:整数判定の状態遷移図 0~9 0~9 0~9 EOS +|-開始 S0 S1 S2 OK その他 その他 その他 NG
  32. 32. 先の例を状態遷移表に変換 符号 数字 終端 その他 (+ or -) (0~9) (EOS)S0 S1 S2 NG NGS1 NG S2 NG NGS2 NG S2 OK NG
  33. 33. 状態遷移表の縦と横を入れ替える S0 S1 S2 符号 S1 NG NG(+ or -) 数字 S2 S2 S2(0~9) 終端 NG NG OK (EOS)その他 NG NG NG
  34. 34. プログラムに変換すると#!/usr/bin/perl } else { exit 1;@c = split //, shift; } }$s = 0; if ($s == 2) {for $c (@c) { exit 0; if ($c eq + || $c eq -) { } else { if ($s == 0) { exit 1; $s = 1; } } else { exit 1; } } elsif (0 le $c && $c le 9) { if ($s == 0 || $s1 == 1 || $s == 2) { $s = 2; }
  35. 35. ジャクソン構造図による整数表現 整数 符号 絶対値 ○ + or - 1文字目 2文字目 数字 以降数字群 * 0~9 0~9
  36. 36. 先のジャクソン構造図から導かれたプログラム#!/usr/bin/perl while (0 le $c && $c le 9) { $c = shift @c;@c = split //, shift; }$c = shift @c; if ($c eq ) {if ($c eq + || $c eq -) { exit 0; $c = shift @c; } else {} exit 1; }if (0 le $c && $c le 9) { $c = shift @c;} else { exit 1;}
  37. 37. 前回の宿題1. 身の回りのもので位置を利用して情 報を表現しているものを探してみよう2. 浮動小数点数のジャクソン構造図をプ ログラムに変換してみよう3. 浮動小数点数の状態遷移図からgoto プログラムを書いたのち、発見的手法 でgotoを取り除いてみよう
  38. 38. 宿題2のジャクソン構造図 浮動 小数点数 仮数部 指数部 ○ 符号 絶対値 省略可能 指数部 ○ ○ ○+ or - 整数部付 小数部のみ 指数文字 指数 絶対値 絶対値 整数部 小数部 小数部 E or e 符号 整数部 ○ ○ 1文字目 2文字目 省略可能 小数点 小数 + or - 1文字目 2文字目 数字 以降数字群 小数部 数字 以降数字群 * * 0~9 0~9 小数点 小数 ・ 1文字目 2文字目 0~9 0~9 数字 以降数字群 * * ・ 0~9 0~9 0~9
  39. 39. 宿題2の解答例#!/usr/bin/perl } elsif ($c eq .) { if ($c eq E || $c eq e) { $c = shift @c; $c = shift @c; if ($c eq + || $c eq -) {@c = split //, shift; if (0 le $c && $c le 9) { $c = shift @c; $c = shift @c; }$c = shift @c; while (0 le $c && $c le 9) {if ($c eq + || $c eq -) { $c = shift @c; if (0 le $c && $c le 9) { $c = shift @c; } $c = shift @c; while (0 le $c && $c le 9) {} } else { $c = shift @c; exit 1; }if (0 le $c && $c le 9) { } } else { $c = shift @c; } else { exit 1; while (0 le $c && $c le 9) { exit 1; } } $c = shift @c; } } if ($c eq ) { exit 0; if ($c eq .) { } else { $c = shift @c; exit 1; } }
  40. 40. ここで休憩です
  41. 41. ジャクソン構造図とはデータの構造の図示したものでは、データの構造とは?
  42. 42. 例題1下記の課題が与えられたときのテキスファイルの構造をジャクソン構造図で示せ問題1.テキストファイルの行数を求めよ。問題2.テキストファイルのバイト数を求めよ。問題3.テキストファイルの文字数を求めよ。
  43. 43. 例題1:解答例解答例1 解答例2 解答例3テキスト テキスト テキストファイル ファイル ファイル * * * 行 バイト 文字
  44. 44. プログラムに変換すると解答例1 解答例2 解答例3#!/usr/bin/perl #!/usr/bin/perl #!/usr/bin/perl$count = 0; $count = 0; binmode STDIN, ":utf8";while (<STDIN>) { while (defined(getc)) { $count++; $count++; $count = 0;} } while (defined(getc)) {print $count, "¥n"; print $count, "¥n"; $count++; } print $count, "¥n";
  45. 45. 結論1データ構造はプログラムの目的により変化する
  46. 46. 例題2テキストファイルの行数を求めたいとき、テキストファイルの構造をジャクソン構造図で示せ
  47. 47. 例題2:解答例解答例1 解答例2 解答例3テキスト テキスト テキストファイル ファイル ファイル * * * 行 文字 行 ○ ○ 改行以外の 改行文字 行文字列 改行文字 文字 * 改行以外の 文字
  48. 48. プログラムに変換すると解答例1 問題2 問題3#!/usr/bin/perl #!/usr/bin/perl #!/usr/bin/perl$count = 0; binmode STDIN, ":utf8"; binmode STDIN, ":utf8";while (<STDIN>) { $count++; $count = 0; $count = 0;} while (defined($char = getc)) { while () {print $count, "¥n"; if ($char eq "¥n") { while (defined($char = getc) $count++; && $char ne "¥n") { } } } last if (! defined($char)); print $count, "¥n"; $count++; } print $count, "¥n";
  49. 49. 結論2データ構造は問題の解釈により変化する
  50. 50. 結論3データの構造とはデータの解釈の仕方である。「事実というものは存在しない。存在するのは解釈だけである。 」(by ニーチェ)「われわれは事象を利用するために真理を『発明』する」(by ベルクソン)
  51. 51. 実用的に言い直すとデータの解釈の仕方により、プログラミングが簡単になったり、難しくなったりする。プログラミングが簡単になる構造を見つけ出すのがジャクソン構造図を描く理由となる。入力データ構造と出力データ構造の要素が良く対応する構造図がよいとされる。
  52. 52. 例題3「uniq –c」と同じような動きをするプログラムを記述せよ。ただし、入力は標準入力のみとする。
  53. 53. 例題3のプログラムの働き入力データ 出力データa 4 aa 3 baabbb
  54. 54. 例題3の拡張状態遷移図による表現行の取得成功 / カウンタ= 1 行の取得成功 & 保存行と取得行が一致 / 保存行に取得した行を保存 カウンタ++ 行の取得失敗 / print カウンタ, 保存行 S0 S1 S2 行の取得成功 & 保存行と取得行業が不一致 / print カウンタ, 保存行 カウンタ= 1 保存行に取得した行を保存 行の取得失敗 / -
  55. 55. 状態遷移図をプログラムに変換すると#!/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";
  56. 56. プログラムから導かれるデータ構造の ジャクソン構造図による表現 入力データ 出力データ テキスト テキスト ファイル ファイル ○ ○ *内容なし 内容あり 行 最初の行 間の行 最後の行 同一行の数 同一行 * 行 ○ ○ 非ブレイク行 ブレイク行 直前の行と 直前の行と 同じ行 異なる行
  57. 57. もっと良い構造はないか…あります。 入力データ 出力データ テキスト テキスト ファイル ファイル * * 同一行 行 グループ * 同一行 同一行の数 同一行但し、プログラムで表現するには先読み技法が必要です。
  58. 58. 先読み技法とはファイル処理に用いる技法で、処理対象となるデータの1つ先のデータを読む技法 先読み技法を使った 通常のファイル処理 ファイル処理 2.注目 ファイルの 4.注目 内容の一部の 内容の一部 コピー 1.読み出し 2.コピー 5.とぎどき ファイルの 注目 ファイル 内容の一部 1.読み出し 3. 読み出し ファイル
  59. 59. 例:標準入力の行数を求めるプログラム通常のファイル処理 先読み技法を使ったファイル処理#!/usr/bin/perl #!/usr/bin/perl$count = 0; $count = 0;while (<STDIN>) { $next_line = <STDIN>; $count++; $line = $next_line;} while ($line) {print $count, "¥n"; $next_line = <STDIN>; $count++; $line = $next_line; } print $count, "¥n";
  60. 60. 例題3のプログラムを記述通常のファイル処理 先読み技法を使ったファイル処理#!/usr/bin/perl #!/usr/bin/perl$line = <STDIN>;if (not $line) { $next_line = <STDIN>; exit;} while ($line = $next_line) {$count = 1; $count = 0;$old_line = $line;while ($line = <STDIN>) { while ($line eq $next_line) { if ($line ne $old_line) { $count++; print "$count¥t$old_line"; $next_line = <STDIN> $count = 1; $old_line = $line; } } else { print "$count¥t$line"; $count++; } }}print "$count¥t$old_line";
  61. 61. 演習問題下記のプログラムを先読み技法を使用して書き直せ。#!/usr/bin/perl print "小計:$count2¥t$old_col1 $old_col2¥n"; $count1 += $count2;$line = <STDIN>; $count2 = 1;if (not $line) { $old_col2 = $col2; exit; if ($col1 ne $old_col1) {} print "大計:$count1¥t$old_col1¥n"; $count1 = 0;($col1, $col2) = split(/¥s/, $line); $old_col1 = $col1;$count1 = 0; }$count2 = 1; } else {$old_col1 = $col1; $count2++;$old_col2 = $col2; }while ($line = <STDIN>) { } ($col1, $col2) = split(/¥s/, $line); print "小計:$count2¥t$old_col1 $old_col2¥n"; if ($col1 ne $old_col1 || $col2 ne $old_col2) { $count1 += $count2; print "大計:$count1¥t$old_col1¥n";
  62. 62. 演習問題のプログラムの働き入力データ 出力データaa 小計:2 a aaa 小計:2 a bab 大計:4 aab 小計:3 b bbb 大計:3 bbbbb
  63. 63. ヒント入力データのジャクソン構造は下記の通り。 テキスト ファイル * カラム1 同一行グループ * カラム1,2 同一行グループ * カラム1,2 同一行
  64. 64. ここで休憩です
  65. 65. 演習問題解答例#!/usr/bin/perl print "小計:$count2¥t$col1 $col2¥n"; $count1 += $count2;if ($line = <STDIN>) { } ($next_col1, $next_col2) = split(/¥s/, $line); print "大計:$count1¥t$col1¥n";} }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) } }
  66. 66. 先読み技法ライブプログラミングExcel互換のCSVパーサーを記述する入力データ 出力データa,b,c abc1,2,3 123"""","""""","""""""" " "" """"""a""","""b","c""" "a" "b c""あ あ¥nい¥n う えい ___",う,え,,~
  67. 67. CSVパーサーの拡張状態遷移図 他/バッファ ダブルクォート/エラー NG 他/バッファ S1 他/バッファ 改行|カンマ 改行|カンマ/出力 /出力 ダブルクォート 他/バッファ S3 /何もしない S0 ダブルクォート ダブルクォート/何もしない /何もしない 他/エラー S2 S4 ダブルクォート/バッファ OK EOF 改行|カンマ/出力 /何もしない
  68. 68. CSVファイルのジャクソン構造図 CSV ファイル * 項目 項目本体 区切り文字 ○ ○ ○ ○ ○空項目 通常文字 特殊文字含 カンマ 改行 のみ項目 項目 *- 通常文字 ダブルクォー 特殊文字含 ダブルクォー テーション 項目本体 テーション * 特殊文字 含文字 ○ ○ ○ ○ 通常文字 ダブルクォー カンマ 改行 テーション
  69. 69. 先読み技法を使ったExcel互換の CSVパーサープログラム#!/usr/bin/python elif ch == " and nch == ": buffer += chimport os, sys nch = chs.next() elif ch == ":def genchs(): sys.exit(1) for line in sys.stdin: elif ch == ",": line = line.decode("utf_8") buffer += "," for ch in line: elif ch == "¥n": yield ch buffer += "¥¥n" yield "" else: buffer += chif __name__ == "__main__": chs = genchs() ch = nch ch = chs.next() else: while ch: while ch and ch != "," and ch != "¥n": buffer = "" if ch == ": sys.exit(1) if ch == "," or ch == "¥n": buffer += ch buffer += "_" ch = chs.next() elif ch == ": ch = chs.next() if ch == ",": while ch: print buffer.encode("utf_8"), nch = chs.next() ch = chs.next() if ch == " and (nch == "," or nch == "¥n"): elif ch == "¥n": ch = nch print buffer.encode("utf_8") break ch = chs.next()
  70. 70. ここで休憩です
  71. 71. まとめ11. データの解釈の仕方によりプログラミング は簡単になったり、難しくなったりする。2. ジャクソン構造図はプログラミングを簡単に する構造を導き出すのに役立つ。3. 先読み技法はジャクソン法で導き出した構 造をプログラム上で表現するのに役立つ。
  72. 72. ジャクソン法の長所1. 状態をプログラム上で表現する方法 には2種類ある • プログラムの実行位置(テキスト指標) • 変数2. ジャクソン法は、前者を方法を重視する。 このため、可読性の高いプログラムを導き やすい。
  73. 73. ジャクソン法の短所について1. ジャクソン法は前者の方法を重視している ため、プログラムから柔軟性は失われる。2. 実行時に動きを変更するなどの柔軟性を プログラムに持たせたい場合は、ほかの方 法を採用する必要がある。
  74. 74. テーブル駆動方式の紹介実行時にプログラムの動きを変更できる柔軟性の高いプログラムを作成できる技法。但し、可読性は最低。プログラムの自動生成に向いている。
  75. 75. 例1:整数判定の状態遷移図 0~9 0~9 0~9 EOS +|-開始 S0 S1 S2 OK その他 その他 その他 NG
  76. 76. 先の例を状態遷移表に変換 その他 符号 数字 終端 (+ or -) (0~9) (EOS)S0 NG S1 S2 NGS1 NG NG S2 NGS2 NG NG S2 OK
  77. 77. 状態遷移表からプログラムを作成#!/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);
  78. 78. 例2:浮動小数点数判定の状態遷移図 0~9 E|e 0~9 0~9 0~9 0~9 +|- ・ E|e +|- 0~9 0~9開始 S0 S1 S2 S4 S5 S6 S7 EOS ・ EOS ・ 0~9 S3 EOS OK その他 NG
  79. 79. 先の例を状態遷移表に変換 その他 符号 数字 小数点 指数記号 終端 (+ or -) (0~9) (.) (E or e) (EOS)S0 NG S1 S2 S3 NG NGS1 NG NG S2 S3 NG NGS2 NG NG S2 S4 S5 OKS3 NG NG S4 NG NG NGS4 NG NG S4 NG S5 OKS5 NG S6 S7 NG NG NGS6 NG NG S7 NG NG NGS7 NG NG S7 NG NG OK
  80. 80. 状態遷移表からプログラムを作成#!/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);
  81. 81. まとめ21. 状態遷移図はジャクソン構造図と違い、 コーディングスタイルまで規定しない。2. 状態遷移図はその分応用範囲が広いと 言える。
  82. 82. 参考文献• 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』 (ソフトバンク )
  83. 83. ご清聴ありがとうございました 次回で最終回です。言語はシェルを使用します。

×