PAD 図の書き方 佐々木 稔 December 17, 2014 1 順接制御構造 簡単なプログラムは、はじめから順番に処理を行う順接制御構造である。この場合、PAD 図は図 1 のように なる。 処理 A 処理 B 処理 C 図 1: 順接制御構造 (PAD による表現) 例: 2 つの整数データを読み込んで、それらの和、差、積、商の値を計算して、出力するプログラムを作る。この 処理を行うプログラムを図 2 に、このプログラムの PAD 図を図 3 にそれぞれ示す。 #include <stdio.h> int main(void) { int i, j, s, d, p; double q; scanf("%d%d", &i, &j); s = i + j; d = i - j; p = i * j; q = ((double)i) / j; printf("s=%d, d=%d, p=%d, q=%f\n", s,d,p,q); return 0; } 図 2: プログラム 1 1 i, j の読込み s=i+j d=i-j main = p=i*j q=i/j s, d, p, q を出力 図 3: プログラム 1 の PAD による表現 2 2.1 判断分岐構造 二者択一処理 if 文は論理式の値が TRUE か FALSE のどちらかにより実行する文を選ぶ。これを PAD 図では以下のように 表す。 条件 EE 処理 真のとき処理する枝 処理 偽のとき処理する枝 図 4: 二者択一処理 (PAD による表現) 例: 2 次方程式 ax2 + bx + c = 0 の係数 a, b, c(a ̸= 0) を読込んで、2 つの解を出力するプログラムを作成する。こ の処理を行うプログラムを図 5 に、このプログラムの PAD 図を図 6 にそれぞれ示す。 2 #include <stdio.h> #include <math.h> int main(void) { double a, b, c, d, sd, x1, x2, x, y; scanf("%lf%lf%lf", &a, &b, &c); d = b * b - 4 * a * c; if (d >= 0) { sd = sqrt(d); x1 = (-b + sd) / (2 * a); x2 = (-b - sd) / (2 * a); printf("x1 = %lf\n", x1); printf("x2 = %lf\n", x2); } else { x = -b / (2 * a); y = sqrt(-d) / (2 * a); printf("x1 = %lf + %lf i\n", x, y); printf("x1 = %lf - %lf i\n", x, y); } return 0; } 図 5: プログラム 2 a, b, c を読込む d = b2 − 4ac の計算 √ sd = d の計算 x1 = (−b + sd)/(2 ∗ a) の計算 main = d >= 0 E E E E x2 = (−b − sd)/(2 ∗ a) の計算 x1, x2 を出力 x = −b/(2 ∗ a) の計算 y= √ −d/(2 ∗ a) の計算 x + yi と x − yi を出力 図 6: プログラム 2 の PAD による表現 3 2.2 多者択一処理 if-else if-else が続く処理や case 文を使った処理はいくつかの条件の中から実行する処理を選ぶ他者択一処理と なっている。これを PAD 図では以下のように表す。 条件 1 T 条件 2 T 条件 3 TT 処理 1 条件 1 が真のとき処理する枝 処理 2 条件 2 が真のとき処理する枝 処理 3 条件 3 が真のとき処理する枝 図 7: 多者択一処理 (PAD による表現) 例: 履修科目の点数を入力すると、その科目の成績評価 (A+, A, B, · · ·, E) を出力する。この処理を行うプログラ ムを図 8 に、このプログラムの PAD 図を図 9 にそれぞれ示す。 #include <stdio.h> int main(void) { int score; scanf("%d", &score); if((score > 100) || (score < 0)) printf("Wrong Number!"); else if(score>=90) printf("A+"); else if(score>=80) printf("A"); else if(score>=70) printf("B"); else if(score>=60) printf("C"); else printf("D"); printf("\n"); return 0; } 図 8: プログラム 3 4 点数 score を入力 (score > 100) or (score < 0) TT score >= 90 T main = score >= 80 T score >= 70 T score >= 60 else T ’Wrong Number!’ ’A+’ ’A’ ’B’ ’C’ ’D’ 図 9: プログラム 3 の PAD による表現 3 3.1 繰返し制御構造 前判断ループ for または while はループの内にある処理を行う前に継続条件を満たすかどうか判断する「前判断ループ」で ある。これを PAD 図では以下のように表す。 継続条件 処理 図 10: 前判断ループ構造 (PAD による表現) 例: 1 から 100 までの和を途中結果を含めて出力するプログラムを作る。この処理を行うプログラムを図 11 に、 このプログラムの PAD 図を図 12 にそれぞれ示す。 #include <stdio.h> int main(void) { int i, sum; sum = 0; for(i=1; i<=100; i++){ sum = sum + i; printf("i = %d, sum = %d\n", i, sum); } return 0; } 図 11: プログラム 4 5 sum を 0 に初期化 main = sum = sum + i i を 1 から 100 まで繰り返す i, s を出力 図 12: プログラム 4 の PAD による表現 3.2 後判断ループ repeat はループの内にある処理を行った後で継続条件を満たすかどうか判断する「後判断ループ」である。こ れを PAD 図では以下のように表す。 継続条件 処理 図 13: 後判断ループ構造 (PAD による表現) 例: 昔々、ユダヤの総指令官 Josephus を含む 41 人のユダヤ人は、ローマに反抗して独立戦争を起こした。しか し、ローマ軍に包囲され、捕らえられそうになり自決することを決めた。Josephus と彼の友人はなんとか行 き延びたいと思い、Josephus は全員を円形に並べ 2 人おきに自決をし、最後の 1 人は自殺する方法を取った。 Josephus と彼の友人は最後に残るような並び方をしていたので生き残ることができた。さて、Josephus と彼 の友人はそれぞれ数え始めの人から数えて何番目に並んでいたか。 この処理を行うプログラムを図 14 に、このプログラムの PAD 図を図 15 にそれぞれ示す。 6 #include <stdio.h> #define TRUE 1 #define FALSE 0 #define NUM 41 int main(void) { int p = 3; int i, j, k, M; int slave[NUM]; M = NUM; i = 0; for(k = 0; k < NUM; k++) slave[k] = TRUE; do{ for(j = 0; j < NUM; j++){ if(slave[j] == TRUE){ i++; if(i == p){ slave[j] = FALSE; M--; i = 0; } } } } while(M > p); for(k = 0; k < NUM; k++) if(slave[k]==TRUE) printf("%d 番目に並んでいた\n", k+1); return 0; } 図 14: プログラム 5 7 NUM = 41, p = 3 は定数 M = NUM M は生き残った人数 i=0 k は 0 から N まで繰り返す main = slave[k]:=TRUE 全員生存 i++ slave[j] = FALSE M>p slave[j]=TRUE E M– 3 人目 E i=0 生き残った 2 人の順番を出力 図 15: プログラム 5 の PAD による表現 表 1: PAD 書式一覧のまとめ 種類 処理 PAD proc proc cond 前判定反復 問題向き反復 (後判定反復) 選択 選択 (判定条件が 2 つ以上) サブルーチン cond proc cond E true 1 var = 2 T 3T false proc1 proc2 proc3 proc proc1 連接 proc2 処理(複数行) proc1 proc2 サブルーチン(複数行) proc1 proc2 proc1 message メッセージ proc2 proc1 comment 注釈 proc2 8
© Copyright 2024 Paperzz