🔀 制御構造
🎯 プログラムの流れが「順次・分岐・繰り返し」の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;
}ここで先に釘を刺しておきます。流れの範囲を決めているのは、波かっこ { } であって、見た目のインデントではありません。人間はインデントを見て「ここまでが if の中身だな」と読みますが、コンパイラは { } しか見ていません。この食い違いが、このトラックで出てくる事故のかなりの部分を生みます。
流れが頭の中で追えなくなったら、フローチャートで図にするか、トレース表で1行ずつ値を書き出してください。目に見える形にした瞬間に解決することが、本当によくあります。
このトラックのゴールは「書ける」ことだけではありません。書いたものがどう動くか予想できることです。予想と実際がずれた瞬間がバグで、その差を埋める作業がそのままデバッグになります。
まとめます。プログラムの流れは順次・分岐・繰り返しの3つでできている。分岐は if / switch、繰り返しは for / while。範囲を決めるのは { }。次のトピックから、ひとつずつ手を動かしていきます。
{ } であって、インデントではない1つの値がどのケースに一致するかによって処理を振り分ける制御構造のこと。同じ変数に対する多分岐を、if-elseの連鎖より見やすく書ける。整数や文字など、値がぴったり一致するかどうかで振り分けが行われる。
「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。
条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。
処理の流れを四角形やひし形などの図形と矢印で表した図。分岐やループの構造が一目で分かるため、手順を設計するときの地図の役割を果たす。四角形は処理、ひし形は分岐というように、図形ごとに意味が決められている。
プログラムを1行ずつ実行したときの、各変数の値の変化を表にまとめたもの。頭の中でコンピュータになりきって処理を追いかける道具にあたる。変数の値がどう変わっていくかを紙の上で追うことで、頭の中の実行イメージがはっきりする。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。