対象試験と出題頻度
構造化プログラミングは、基本情報技術者・応用情報技術者で出題されるテーマです。
アルゴリズム分野の基礎として定番化しており、「順次」「選択」「繰返し」の3つの基本制御構造を区別できるか、また各構造をフローチャートで表現したときの形を識別できるかが問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★☆☆
ランクB(標準)覚えておくと有利
用語の定義
情報処理試験を勉強していると、「構造化プログラミングって結局なんのこと?プログラミング言語の名前?」と混乱しがちです。
構造化プログラミング(Structured Programming)とは、一言で言うと
「順次・選択・繰返しの3つの基本制御構造だけを組み合わせてプログラムを記述する手法」
のことです。
イメージとしては、「料理のレシピ」です。
レシピは「①野菜を切る → ②鍋に油をひく → ③炒める」のように上から順に進み(順次)、「焦げそうなら火を弱める」と条件で枝分かれし(選択)、「とろみが出るまで混ぜる」と同じ動作を繰り返します(繰返し)。
プログラムも同じで、この3パターンの組み合わせだけで、どんなに複雑な処理でも書けます。
これが構造化プログラミングの中心的な考え方です。
📊 構造化プログラミングの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Structured Programming |
| 提唱者 | エドガー・W・ダイクストラ(1968年「GOTO文は有害である」) |
| 3つの基本構造 | 順次(Sequence)/選択(Selection)/繰返し(Iteration) |
| 排除対象 | 無制限なGOTO文(処理の飛び先が読みづらくなる) |
解説
1960年代までのプログラムは、GOTO文で処理を自由に飛び回らせる書き方が主流でした。
しかし、規模が大きくなるとロジックが「スパゲッティ状」に絡まり、誰も読み解けないコードが量産される事態に陥ります。
この状況を打破するため、ダイクストラらは「3つの基本構造だけを使えば、どんなプログラムでも記述できる」という構造化定理を根拠に、GOTO文を排した記述方式を提唱しました。これが構造化プログラミングの出発点です。
3つの基本制御構造
試験で問われるのはこの3種類の見分け方です。フローチャートでの形と動きをセットで覚えてください。
| 構造 | 英語名 | 動き |
|---|---|---|
| 順次 | Sequence | 処理を上から下へ順番に実行する。最も基本的な流れ |
| 選択 | Selection(分岐) | 条件によって実行する処理を切り替える。if文・case文がこれ |
| 繰返し | Iteration(反復) | 条件を満たす間、同じ処理を繰り返す。for文・while文がこれ |
図解:3つの構造をフローチャートで見る
① 順次
上から順に実行
② 選択(分岐)
条件で枝分かれ
③ 繰返し(反復)
条件が真の間ループ
▲ どんなプログラムも、この3パターンの組み合わせで記述できる
繰返しの2タイプ:前判定と後判定
繰返しはさらに、条件をいつチェックするかで2種類に分かれます。
試験のひっかけポイントなので押さえてください。
前判定(while型):処理を実行する前に条件をチェックします。条件が最初から偽なら、処理は1回も実行されません。
後判定(do-while型):処理を1回実行してから条件をチェックします。条件に関係なく、最低1回は処理が走ります。
前判定 vs 後判定
// 前判定:条件が偽なら1回も実行されない
while (i < 10) {
print(i);
i = i + 1;
}
// 後判定:必ず1回は実行される
do {
print(i);
i = i + 1;
} while (i < 10);
※ 同じ初期値でも、最初から条件が偽の場合に挙動が変わる点が試験で問われます。
関連手法との位置づけ
| 手法 | 中心的な考え方 | 登場時期 |
|---|---|---|
| 構造化プログラミング | 3つの基本構造でロジックを組み立てる | 1960年代後半 |
| オブジェクト指向 | データと処理をクラスにまとめて再利用する | 1980年代以降 |
| 関数型プログラミング | 純粋関数の合成で副作用を抑える | 古くからあるが近年再評価 |
構造化プログラミングは古い手法と思われがちですが、現代のオブジェクト指向言語でも、メソッド内部のロジックは結局この3つの構造で書かれています。土台として今も生きている考え方です。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 構造化プログラミングの核心を3行で
・順次・選択・繰返しの3つの基本制御構造だけで記述する手法
・GOTO文の乱用によるスパゲッティコードを排除する目的で生まれた
・繰返しは「前判定(while型)」と「後判定(do-while型)」の2タイプがある
試験ではこう出る!
構造化プログラミングは、FE・APの午前問題でフローチャートやアルゴリズムの基礎知識として出題されます。出題パターンは大きく2つです。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H29春 午前 問7 |
フローチャートで示された処理が、3つの基本構造のどれに該当するかを問う問題。 | ・ひし形+分岐=選択 ・ループ端記号=繰返し |
| AP H25春 午前 問8 |
前判定繰返しと後判定繰返しの違いを問う問題。 | ・後判定は最低1回実行される ・前判定は0回の場合もあり |
| FE H27秋 午前 問8 |
構造化プログラミングの説明として正しいものを選ぶ問題。 | ・「3つの基本構造で記述」が正解 ・オブジェクト指向・関数型の説明がひっかけ |
📝 IPA試験での出題パターン
パターン1:「フローチャートと構造名の対応」
図中のひし形分岐を見て「選択」、ループ端記号を見て「繰返し」、上から下への直線を「順次」と即座に判断できるかが問われます。記号の形と構造名をセットで暗記してください。
パターン2:「前判定 vs 後判定」
「条件が最初から偽の場合に処理が実行されるのはどちらか」というひっかけが頻出です。答えは後判定(do-while型)。理由は条件チェックが処理の後ろにあるため、最低1回は処理が走るからです。
試験ではここまででOKです。構造化定理の数学的証明や、GOTO文の歴史的背景まで深追いする必要はありません。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. 構造化プログラミングの説明として、最も適切なものはどれでしょうか?
- A. データと操作を一体化した「クラス」を単位として、継承や多態性を活用してプログラムを設計する手法。
- B. 副作用を排した純粋関数の合成によって計算を表現し、状態の変化を最小限に抑える手法。
- C. 順次・選択・繰返しという3つの基本制御構造だけを組み合わせて、プログラムのロジックを記述する手法。
正解と解説を見る
正解:C
解説:
構造化プログラミングは、ダイクストラが提唱した、3つの基本制御構造のみでロジックを組み立てる手法です。GOTO文の乱用で読みにくくなったコードを整理する目的で広まりました。
選択肢Aはオブジェクト指向プログラミングの説明です。クラス・継承・多態性はオブジェクト指向の中心概念であり、構造化プログラミングとは別系統の考え方です。選択肢Bは関数型プログラミングの説明です。純粋関数や副作用の排除は関数型の特徴であり、制御構造の整理を目的とする構造化プログラミングとは異なります。
よくある質問(FAQ)
Q. 現代のプログラミングで構造化プログラミングはまだ使われていますか?
使われています。Java、Python、C#などの主要言語ではオブジェクト指向が主流ですが、各メソッド内部のロジックは順次・選択・繰返しで書かれています。つまり、構造化プログラミングはオブジェクト指向に「置き換えられた」のではなく、その内側で土台として生き続けています。
Q. GOTO文は完全に悪なのですか?
完全な悪ではありません。例外的に深いネストから一気に脱出する場合や、エラー処理に飛ぶ用途では今でも使われます。Linuxカーネルのソースコードでも限定的にgotoが利用されています。問題視されたのは「無秩序に飛び回るGOTO」であり、用途を絞った使い方まで否定されているわけではありません。試験では「無制限なGOTO文を避ける」という文脈で覚えておけば十分です。
Q. 「構造化分析」「構造化設計」と「構造化プログラミング」は同じものですか?
別物ですが、思想は地続きです。構造化分析はDFDなどでシステム要件を分解する手法、構造化設計はモジュール分割と階層化で設計を整理する手法、構造化プログラミングはコード記述レベルの手法です。要件定義→設計→実装の各フェーズに「構造化」の考え方を当てはめたものと整理してください。
Q. switch文(case文)は3つの構造のどれに当たりますか?
「選択」に分類されます。if-elseが2分岐の選択、switch-caseが多分岐の選択という関係です。本質的にはどちらも「条件によって実行する処理を切り替える」という同じ構造であり、試験でも選択構造の一形態として扱われます。