トラック6・🔀制御構造

流れを変える——制御構造の全体像

読む目安 約8分・ゴール:プログラムの流れが「順次・分岐・繰り返し」の3つでできていることを理解し、場面に応じてどれを使うか見当をつけられる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

プログラムは、書いた順に上から下へ実行されます。カレーのレシピと同じです。

ところが、実際のレシピにはこんな行がありませんか。「まだ固ければ、もう5分煮る」「アクが出なくなるまで、すくい続ける」。この2つは、上から順に読むだけでは表せません。プログラムにも、流れを曲げたり、同じ場所をぐるぐる回ったりする仕組みが要ります。それが制御構造です。

制御構造は、たった3つしかありません。

順次 — 上から順に実行する。何も指示しなければ、いつもこれです。

分岐 — 条件によって通る道を選ぶ。if文とswitch文が担当します。

繰り返し — 条件が満たされている間、同じ処理を回す。for文とwhile文が担当します。

どんなに複雑なアプリでも、突き詰めればこの3つの組み合わせです。コンピュータはメモリに並んだ命令を上から順に実行していきますが、分岐は「次に実行する場所を飛ばす」こと、繰り返しは「前の場所へ戻る」こと。つまり制御構造とは、実行する場所をどこへ移すかの指示にすぎません。読むのが苦しくなったら「今どの行にいるか」を指で追ってください。プログラムを読むとは、その指の動きを追うことです。

まずは順次だけのプログラムです。

#include <stdio.h>

int main(void) {
    int price = 500;
    int count = 3;
    printf("合計 %d 円\n", price * count);
    return 0;
}

上から1行ずつ、寄り道せずに進みます。ここに分岐を足すと、道が2本に分かれます。

#include <stdio.h>

int main(void) {
    int total = 1200;

    if (total >= 1000) {          // ここで道が分かれる
        printf("送料無料です\n");
    } else {
        printf("送料 300 円です\n");
    }
    return 0;
}

繰り返しを足すと、同じ場所を何度も通れます。

#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 3; i++) {   // 3回まわる
        printf("%d 回目\n", i);
    }
    return 0;
}
ビット3つだけ、って聞くと急に簡単そうに見えるよね。あとはこの3つをどう組み合わせるか、の勝負だよ

ここで先に釘を刺しておきます。流れの範囲を決めているのは、波かっこ { } であって、見た目のインデントではありません。人間はインデントを見て「ここまでが if の中身だな」と読みますが、コンパイラは { } しか見ていません。この食い違いが、このトラックで出てくる事故のかなりの部分を生みます。

流れが頭の中で追えなくなったら、フローチャートで図にするか、トレース表で1行ずつ値を書き出してください。目に見える形にした瞬間に解決することが、本当によくあります。

このトラックのゴールは「書ける」ことだけではありません。書いたものがどう動くか予想できることです。予想と実際がずれた瞬間がバグで、その差を埋める作業がそのままデバッグになります。

まとめます。プログラムの流れは順次・分岐・繰り返しの3つでできている。分岐は if / switch、繰り返しは for / while。範囲を決めるのは { }。次のトピックから、ひとつずつ手を動かしていきます。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

プログラムの流れを作る「制御構造」は、大きく3つに分けられます。その3つの組み合わせとして正しいものはどれですか。

  1. 順次・分岐・繰り返し
  2. 入力・計算・出力
  3. 変数・関数・型
  4. 宣言・代入・比較
答えを見る

正解:A(順次・分岐・繰り返し)

プログラムの流れは「順次(上から順に)」「分岐(条件で道を選ぶ)」「繰り返し(同じ処理を回す)」の3つで組み立てられます。「入力・計算・出力」はプログラムの役割の分け方、「変数・関数・型」は部品の話、「宣言・代入・比較」は文や演算の種類で、どれも流れの分類ではありません。

確認問題 2

「パスワードが正しくなければ、正しく入力されるまで何度でも聞き直す」——この処理を作るとき、決め手になる制御構造はどれですか。

  1. 順次だけで書ける
  2. 分岐だけで書ける
  3. 繰り返し(判定に分岐も使う)
  4. 制御構造は必要ない
答えを見る

正解:C(繰り返し(判定に分岐も使う))

「正しくなるまで何度でも」は、何回かかるか分からない繰り返しです。while や do-while の出番になります。「正しいかどうか」の判定には分岐も使いますが、決め手は繰り返しのほう。順次だけでは「何度でも」を表現できず、聞き直しの回数ぶんコードを書き並べることになってしまいます。

「制御構造」の目次

  1. 流れを変える——制御構造の全体像
  2. if文——もしも、の分かれ道
  3. else if / else の分かれ道設計
  4. 条件式の罠——= と == の悲劇
  5. 論理演算子と短絡評価
  6. switch文とfallthrough
  7. for文——回数が決まった繰り返し
  8. while文——条件が決める繰り返し
  9. do-while文と入力チェック
  10. breakとcontinueの使いどころ
  11. ループのネストと九九表
  12. 無限ループとの付き合い方

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版