
1選択と反復
第5話までに解説した知識だけでも、高度なプログラムを作成することができます。 例えば、「画面にHello, world!を30個表示するプログラム」は、図1-1のように書けます。
- #include <stdio.h>
-
- int main(void)
- {
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- printf("Hello, world!\n");
- return 0;
- }
ただ、これが30個ではなく10,000個だと相当大変になります。
しかし今回解説する分岐と繰り返しの方法を使うとこのプログラムは「printf("Hello, world!\n");を30回繰り返せ」というふうに簡潔に書けます。 条件の真偽によって分岐する「選択処理」と、一定の命令を繰り返す「反復処理」を組み合わせます(図1-2)。

また選択処理でも反復処理でもない、上から下に実行されるだけの処理を「逐次処理」といいます。 どのプログラミング言語にも似たものが用意されていますので、例としてC言語における選択・反復処理の構文を順に見ましょう。
2if
「if」は、条件の真偽によって処理を変える、選択処理の基本的な構文です。 図2-1のように書きます。
- #include <stdio.h>
-
- int main(void)
- {
- int n;
- n = 12;
-
- if (n < 5)
- {
- printf("small\n");
- }
- else if (n < 10)
- {
- printf("medium\n");
- }
- else if (n < 15)
- {
- printf("large\n");
- }
- else
- {
- printf("extra large\n");
- }
-
- return 0;
- }
ifは、「もし○○ならばこの処理を、ではなく××ならばこの処理を、でなければこの処理を実行する」という構文です。
このプログラムでは、「もしn<5ならば"small"を、ではなくn<10ならば"medium"を、ではなくn<15ならば"large"を、でなければ"extra large"を画面に表示せよ」となっています。 「ではなく」に相当する「else」は、いくつでも追加したり、省略することもできます(図2-2)。
- #include <stdio.h>
-
- int main(void)
- {
- int n;
- n = 12;
-
- if (n < 5)
- {
- printf("small\n");
- printf("small\n");
- printf("small\n");
- }
-
- return 0;
- }
このプログラムの場合、n<5ならば画面にsmallが3回表示され、それ以外のときには何も表示されないプログラムとなります。
3switch
「switch」は、値に応じて処理を分ける構文です。 例えば、変数nの値に応じて処理を分ける場合、図3-1のように書けます。
- #include <stdio.h>
-
- int main(void)
- {
- int n;
- n = 3;
-
- switch (n)
- {
- case 0:
- case 1:
- case 5:
- printf("red\n");
- break;
- case 3:
- case 8:
- printf("green\n");
- break;
- default:
- printf("blue\n");
- break;
- }
-
- return 0;
- }
このプログラムの場合、nが0か1か5であればredを、nが3か8であればgreenを、それ以外ならばblueを画面に表示します。 switchは、括弧内の値と一致する「case 値:」にジャンプし、「break;」によってswitchを抜ける動作となっています。 「break;」が無ければその次のcaseの処理まで実行されます。
一致したcaseが無ければ「default:」にジャンプします。 defaultは省略可能で、その場合、一致するcaseが無ければ何もせずにswitchを抜けます。
4goto
「goto」は、指定した行にジャンプする構文です。 図4-1のように書きます。
- #include <stdio.h>
-
- int main(void)
- {
- piyo:
- printf("looping\n");
- goto piyo;
-
- return 0;
- }
ジャンプ先となる行には「ラベル名:」を記述します。 このプログラムは「goto piyo;」によって「piyo:」にジャンプする処理になっており、画面には「looping」が何度も表示され続けます。
gotoを使うとソースコードが読みづらくなるという欠点があるため、できればgotoは使わずに別の方法で書くことが推奨されています。
5while
「while」は、条件が真である限り処理を繰り返す構文です。 図5-1のように書きます。
- int main(void)
- {
- int n;
- n = 0;
-
- while (n != 10)
- {
- n += 2;
- }
-
- return 0;
- }
このプログラムの場合、「n!=10」である限り「n+=2;」の処理を繰り返して実行します。 初めから「n!=10」の条件を満たしていなかった場合は、何もせずにwhileを抜けます。 似た構文に「do-while」があります(図5-2)。
- int main(void)
- {
- int n;
- n = 0;
-
- do
- {
- n += 2;
- } while (n != 10);
-
- return 0;
- }
このdo-whileは、動作はwhileと似ていますが、繰り返すかどうかの判断が中身の処理の後で行われます。 つまりdo-whileの場合、初めから「n!=10」の条件を満たさなかった場合でも、最低1回は「n+=2;」が実行されます。
6for
「for」は、数を数えながら繰り返す構文です。 例えば、0から9まで数えながら計10回処理を行いたい場合、図6-1のように書きます。
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- for (i = 0; i < 10; i++)
- {
- printf("%d\n", i);
- }
-
- return 0;
- }
書式は「for(初期値;繰り返し条件;増減)」です。 このプログラムでは、画面には0から9までの10個の数が順に表示されます。 もし10から0まで2ずつカウントダウンしたい場合は、「for(i=10;i>=0;i-=2)」となります。
forは、同じ動作をするwhileに書き換えることができます。 先ほどのプログラムは図6-2のように書けます。
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- i = 0;
- while (i < 10)
- {
- printf("%d\n", i);
- i++;
- }
-
- return 0;
- }
数えながら一定回数だけ繰り返したい場合は見やすさのためにforを、それ以外の繰り返し処理はwhileを使うと分かりやすいでしょう。
7breakとcontinue
for、while、do-whileの繰り返し処理を途中で抜けるには「break」を書きます。 また、繰り返し処理を1回スキップするには「continue」を書きます(図7-1)。
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- for (i = 0; i < 10; i++)
- {
- if (i == 3)
- {
- continue;
- }
- else if (i == 6)
- {
- break;
- }
- printf("%d\n", i);
- }
-
- return 0;
- }
この例では、iが3になると繰り返し処理を1回スキップし、iが6になると繰り返し処理を抜けるというプログラムになっているため、画面には「0」「1」「2」「4」「5」が表示されます。
厳密には、breakは繰り返し処理の閉じ括弧「}」の直後にジャンプする命令で、continueは閉じ括弧「}」の直前にジャンプする命令です。 forなどが何重にも入れ子になっていた場合は、breakやcontinueは一番内側の1つだけを抜けたりスキップします。
8最後に
それでは最後に、「画面にHello, world!を30個表示するプログラム」を簡潔に書き直してみたいと思います。 図8-1の通りです。
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- for (i = 0; i < 30; i++)
- {
- printf("Hello, world!\n");
- }
-
- return 0;
- }
とてもシンプルになりました。 ちなみに別の言語で書いても同様で、JavaScriptの場合は図8-2のようになります。
- <!DOCTYPE html>
- <script>
- for (i = 0; i < 30; i++)
- {
- document.write("Hello, world!<br />");
- }
- </script>
今回は、Hello, world!を30回表示する簡潔な書き方を解説しました。 次回は、変数が30種類あった場合に簡潔に扱う方法を解説します!