Web教材一覧>
アルゴリズム
(BOK大区分:1 基礎理論、中区分:2 アルゴリズムとプログラミング)
プログラム制御構造、構造化プログラミング(Structured Programming)、順次(sequence)、選択(selection)、反復(repeatition)、goto命令
プログラムの制御構造とは、コンピュータの実行順序を体系化したものです。次の3つだけで、すべての実行順序を記述できることが証明されています(構造化定理)。
・sequence:順次
・selection:選択(条件分岐)
・repeatition:反復(繰り返し)
この3つの構造だけでプログラムを作成することを
最も基本的な構造です。プログラムの記述の順に実行されます。
「条件を満足すれば処理1を行い、満足しなければ処理2を行う」という構造です。
sum=a(1)+a(2)+a(3)+…+a(n) のような計算をするときに用いられる構造です。このときは、配列a(i)の添字iを変えながら同じ加算処理を行うことになります。その反復部分をループといいます。
反復制御には、反復条件(ループから抜けて次の命令に移る条件)をループに入る前に指定する(前判定反復)のか、ループの処理結果をみて抜け出すのか(後判定反復)のケースがあります。また、何回繰り返すのか(回数指定反復)がよく用いられますが、これは前判定反復の一つのケースだといえます。
それらの流れはAのようになりますが、反復であることを明示するためにBのように書くのがよいとされています。
構造化プログラミングが普及する以以前(初期の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命令をもたなくなりました。