PAD(パド[1]、Problem Analysis Diagram)は、問題解析図とも呼ばれ、プログラムの制御構造を木構造的に表す図である。日立製作所の二村良彦、川合敏雄らによって開発された[2]。JIS X 0128 に「プログラム構成要素及びその表記法」としてフローチャートとともに規定されている[3]。 プログラムの作成にあたっては、制御構造を表すフローチャートを作り、示された手順に基づいてコーディングしていくことが行われてきた。フローチャートは個々の処理記号(処理、判断、ループ、など)は決められているが、処理記号や接続する線の位置や方向が定められていないため、同じ手順が異なるチャートになったり、制御構造が判然としなくなるという欠点があった[1]。 さらに、構造化プログラミング技法が浸透することによってフローチャートの欠点は顕著になった。 PADはこの欠点を解消するために開発された2次元木構造図であり、ワーニエ図
概要
具体的には、プログラムの構造を、
連接:単純な処理の連続
選択:条件による処理の選択(分岐)
反復:条件による処理の繰り返し
という内容に細分化していき、明確化していくことを目的としている。
そのため、PADでは各処理の記号と記号の接続方法を規定しておくことで、多くの場合、プログラム構造を表すPADはフローチャートに比べて作成者によるバラツキが少なくなる[6]。また、プログラムのソースとPADが対応しているのでコーディングを機械的に行うことが出来る[7]。 PADにおける各制御構造と対応するフローチャート、および、サンプル擬似コードを示す。なお、A、B…は処理(サンプルコードにおいては関数)、Q、R、C1?Cx は選択や反復の条件など、選択におけるTはTrue、FはFalesを表すものとする。また、PADでは「Start」「End」の記号は必須ではないが、フローチャートとの比較用に用いている。 処理「A」に続いて処理「B」を実行する例。 PADフローチャートサンプルコード 条件「Q」の真偽によって処理を実行するか否かを選択する例。 条件「Q」が真の場合に処理「A」を実行する例。「if文(if...then)」に相当する。 PADフローチャートサンプルコード 各条件「Q」が真の場合に処理「A」を実行し、偽の場合に処理「B」を実行する例。「if文(if...then...else)」に相当する。。 PADフローチャートサンプルコード 「Q」に対しそれぞれの条件「Cn」が成立した場合に各処理を実行する例。「switch文」に相当する。 PADフローチャートサンプルコード 最初に条件「Q」を判定し、成立している間は処理「A」「B」を実行する例。「while文」に相当する。 PADフローチャートフローチャート(JIS)サンプルコード 処理「A」「B」を実行したあとに条件「Q」を判定し成立するまで処理を繰り返す例。「do-while文」に相当する。また、「for文」処理にも用いられる(条件設定部に初期値、継続条件、更新処理を記述する)。 PADフローチャートフローチャート(JIS)サンプルコード 連接、選択、反復の構造だけでは必ずしも全てのプログラムを実現できるわけではなく、例えば「goto文」を使うことが効率的なこともある。このような事例をPADで記述するための記法がある。また、ひとまとまりの処理を定義する記法もある。 ループに入る前に行う処理がループ内でも行われる場合の記法である。標準記法でも記述できるが、拡張図式として記述することが出来る[8]。 PAD(標準図式)PAD(拡張図式)フローチャートサンプルコード Break(gotoと同義)[9]。 PADフローチャートサンプルコード 処理(関数やサブルーチン)の定義名をつけて一連の処理を記述しておき、他のPAD図でその処理を引用する[10][11]。(以下の例では、処理名を「func」とし、定義名と処理の内容を「 = d e f {\displaystyle {\overset {def}{=}}} 」でつなぐ。) int func(){ A(); while(P){ if Q C(); D(); } B();}int sample(void){ if (R) func(); F();} 具体的な処理例として、打ち切り処理付きバブルソートのPAD、フローチャート、サンプルコードの対応を示す[注釈 1]。 PADフローチャートサンプルコード PADでは、 という2次元的な図になる。 これは、構造化プログラムにおいて、フローチャートでは判別しにくい論理構造がPADでは視覚的に把握しやすい図として表現できることを示している。同時に、処理の接続展開方向が規定されているので、プログラム構造を図にする場合はフローチャートに比べてPADで表記することで作成する個人差が出にくいという利点もある[13][14]。 逆に、プログラムの論理構造が明確でない場合はPADにすることができないともいえる[15][注釈 2]。
記述法
連接
int sample(void){ A(); B();}
選択
if then型
int sample(void){ if (Q) A();}
if then else型
int sample(void){ if (Q) A(); else B();}
多分岐(switch case)型
int sample(void){ switch(Q){ case C1: A(); break; case C1: B(); break; … case Cx: ; break; }}
前判定反復
int sample(void){ while(Q){ A(); B(); }}
後判定反復
int sample(void){ do{ A(); B(); } while{Q};}
拡張図式
N+1/2ループ
int sample(void){ A(); do{ B(); A(); } while{Q};}
Break
goto label;label:
定義
実例
break後に移行する場所を図中に記す「L1」
break記号内に移行場所「L1」を記す
int bubblesort(int a[], int n){ for (int i = 0; i < n-1; i++){ int flag = 0; for (int j = n-1; j > i; j--) if (a[j-1] > a[j]){ int work = a[j-1]; a[j-1] = a[j]; a[j] = work; flag = 1; } if (flag==0) break; }}
PADの視覚的利点PADによるプログラム構造の視覚効果
処理の実行順序 - 下への接続
選択・反復の深さ - 右方向への展開
脚注
注釈^ アルゴリズムは『新・明解 C言語で学ぶアルゴリズムとデータ構造』[12]を基にした。
^ 構造化されていないプログラムであるから、といえる[16]。
Size:23 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
担当:undef