PAD図の書き方

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