Web教材一覧アルゴリズム
(BOK大区分:1 基礎理論、中区分:2 アルゴリズムとプログラミング

プログラム制御構造

キーワード

プログラム制御構造、構造化プログラミング(Structured Programming)、順次(sequence)、選択(selection)、反復(repeatition)、goto命令


プログラムの制御構造とは、コンピュータの実行順序を体系化したものです。次の3つだけで、すべての実行順序を記述できることが証明されています(構造化定理)。
  ・sequence:順次
  ・selection:選択(条件分岐)
  ・repeatition:反復(繰り返し)
 この3つの構造だけでプログラムを作成することを構造化プログラミング(Structured Programming)といいます。

連続

最も基本的な構造です。プログラムの記述の順に実行されます。

選択

「条件を満足すれば処理1を行い、満足しなければ処理2を行う」という構造です。

二分岐:if
分岐先がyes/no の二つのときはif命令があります。次のように記述します(thenを省略する言語が多い)。
   if 条件 (then) 処理1 else 処理2;
多分岐:switch-case
「条件の値がαなら処理1、βなら処理2、γなら処理3」というように、多岐になるときには、if命令でも
   if 値がα 処理1;
   else if 値がβ 処理2;
   else if 値がγ 処理3;
のように記述できますが、分岐が多いときにはaswitch-case命令が使われます。
   switch(値) {
     case α; 処理1; break;
     case β; 処理2; break;
     case γ; 処理3; break;
   }

反復

sum=a(1)+a(2)+a(3)+…+a(n) のような計算をするときに用いられる構造です。このときは、配列a(i)の添字iを変えながら同じ加算処理を行うことになります。その反復部分をループといいます。
 反復制御には、反復条件(ループから抜けて次の命令に移る条件)をループに入る前に指定する(前判定反復)のか、ループの処理結果をみて抜け出すのか(後判定反復)のケースがあります。また、何回繰り返すのか(回数指定反復)がよく用いられますが、これは前判定反復の一つのケースだといえます。

それらの流れはAのようになりますが、反復であることを明示するためにBのように書くのがよいとされています。

回数指定反復:for
上のsumを求めるプログラムは次のようになります。
   sum = 0;
   for (i=1; i<=n; i++) {
     sum = sum + a[i];
   }
 for の一般形は次の通りです。
   for (添字の初期値; 反復をする条件; 添字の増分)
前判定反復:while
「sumが100を超えない間、処理を繰り返す」ような場合です。
   sum = 0;
   i = 0;
   while (sum <= 100) {
     i = i+1;
     sum = sum + a[i];
   }
   →ここに来たとき(のループからでたとき)sumは100を超えている。
後判定反復:do-while
「処理の結果、sumが100以上になったら繰り返しをやめる」ような場合です。
   sum = 0;
   i = 0;
   do {
     i = i+1;
     sum = sum + a[i];
   } while (sum <= 100);

(トピックス)goto命令の追放

構造化プログラミングが普及する以以前(初期のFORTRANやCOBOLの時代)は、goto命令(ジャンプ命令、無条件分岐)が多用されていました。命令にラベルをつけ、そこにジャンプする命令です。

例えば、上のニ分岐選択は次のように記述します。
    IF 条件がNo GOTO LABEL2
    処理1
    GOTO LABEL3
   LABEL2:
    処理2
   LABEL3: (合流点)
 前判定反復では、次のようになります。
    SUM = 0
    I = 0
   LABEL0: (戻り点)
    I = I+1
    SUM = SUM + A(I)
    IF SUM <= 100 GOTO LABEL0
   LABEL3: (ループから出た点)

goto命令は、小細工がきく命令です。とくにプログラムを修正するときに使いたくなります。ところが、プログラマの恣意であちこちにジャンプするプログラムになりがちです。このようなプログラムは、他人に理解できない状態(スパゲッティ状態といわれた)になり、手が付けられなくなります。

そのような状況から脱却するには、構造化を徹底すること、すなわち上述の三つの構造で記述することが効果があります。このことは端的にいえば「goto命令を追放せよ」ということになります。
 それで、構造化プログラミング後に開発されたプログラミング言語の多くはgoto命令をもたなくなりました。


アルゴリズムへ