Kuina-chan

くいなちゃん2018年12月11日


6さいからのプログラミング」第7話では、プログラムを上から下へ順に処理させるだけでなく、分岐や繰り返しを行う方法について解説します。

1選択と反復

第6話までに解説した知識だけでも、高度なプログラムを作成することができます。 例えば、「画面にHello, world!を30個表示するプログラム」は、図1-1のように書けます。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   printf("Hello, world!\n");
  6.   printf("Hello, world!\n");
  7.   printf("Hello, world!\n");
  8.   printf("Hello, world!\n");
  9.   printf("Hello, world!\n");
  10.   printf("Hello, world!\n");
  11.   printf("Hello, world!\n");
  12.   printf("Hello, world!\n");
  13.   printf("Hello, world!\n");
  14.   printf("Hello, world!\n");
  15.   printf("Hello, world!\n");
  16.   printf("Hello, world!\n");
  17.   printf("Hello, world!\n");
  18.   printf("Hello, world!\n");
  19.   printf("Hello, world!\n");
  20.   printf("Hello, world!\n");
  21.   printf("Hello, world!\n");
  22.   printf("Hello, world!\n");
  23.   printf("Hello, world!\n");
  24.   printf("Hello, world!\n");
  25.   printf("Hello, world!\n");
  26.   printf("Hello, world!\n");
  27.   printf("Hello, world!\n");
  28.   printf("Hello, world!\n");
  29.   printf("Hello, world!\n");
  30.   printf("Hello, world!\n");
  31.   printf("Hello, world!\n");
  32.   printf("Hello, world!\n");
  33.   printf("Hello, world!\n");
  34.   printf("Hello, world!\n");
  35.   return 0;
  36. }
図1-1: hello_worlds.c
これが30個ではなく10,000個だと相当大変になります。 しかし今回解説する分岐と繰り返しの方法を使うとこのプログラムは「printf("Hello, world!\n");を30回繰り返せ」というふうに簡潔に書けます。 条件の真偽によって分岐する「選択処理せんたくしょり」と、一定の命令を繰り返す「反復処理はんぷくしょり」を組み合わせます(図1-2)。
選択と反復
図1-2: 選択と反復
また選択処理でも反復処理でもない、上から下に実行されるだけの処理を「逐次処理ちくじしょり」といいます。
どのプログラミング言語にも似たものが用意されていますので、例としてC言語における選択・反復処理の構文を順に見ましょう。

2if文

if文イフぶん」は、条件の真偽によって処理を変える、選択処理の基本的な構文です。 図2-1のように書きます。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int n;
  6.   n = 12;
  7.  
  8.   if (n < 5)
  9.   {
  10.     printf("small\n");
  11.   }
  12.   else if (n < 10)
  13.   {
  14.     printf("medium\n");
  15.   }
  16.   else if (n < 15)
  17.   {
  18.     printf("large\n");
  19.   }
  20.   else
  21.   {
  22.     printf("extra large\n");
  23.   }
  24.  
  25.   return 0;
  26. }
図2-1: if.c
if文は、「もし○○ならばこの処理を、ではなく××ならばこの処理を、でなければこの処理を実行する」という構文です。
このプログラムでは、「もしn<5ならば"small"を、ではなくn<10ならば"medium"を、ではなくn<15ならば"large"を、でなければ"extra large"を画面に表示せよ」となっています。 「ではなく」に相当する「else」は、いくつでも追加したり、省略することもできます(図2-2)。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int n;
  6.   n = 12;
  7.  
  8.   if (n < 5)
  9.   {
  10.     printf("small\n");
  11.     printf("small\n");
  12.     printf("small\n");
  13.   }
  14.  
  15.   return 0;
  16. }
図2-2: if2.c
このプログラムの場合、n<5ならば画面にsmallが3回表示され、それ以外のときには何も表示されないプログラムとなります。

3switch文

switch文スイッチぶん」は、値に応じて処理を分ける構文です。 例えば、変数nの値に応じて処理を分ける場合、図3-1のように書けます。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int n;
  6.   n = 3;
  7.  
  8.   switch (n)
  9.   {
  10.     case 0:
  11.     case 1:
  12.     case 5:
  13.       printf("red\n");
  14.       break;
  15.     case 3:
  16.     case 8:
  17.       printf("green\n");
  18.       break;
  19.     default:
  20.       printf("blue\n");
  21.       break;
  22.   }
  23.  
  24.   return 0;
  25. }
図3-1: switch.c
このプログラムの場合、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のように書きます。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5. piyo:
  6.   printf("looping\n");
  7.   goto piyo;
  8.  
  9.   return 0;
  10. }
図4-1: goto.c
ジャンプ先となる行には「ラベル名:」を記述します。 このプログラムは「goto piyo;」によって「piyo:」にジャンプする処理になっており、画面には「looping」が何度も表示され続けます。
goto文を使うとソースコードが読みづらくなるという欠点があるため、できればgoto文は使わずに別の方法で書くことが推奨されています。

5while文

while文ホワイルぶん」は、条件が真である限り処理を繰り返す構文です。 図5-1のように書きます。
  1. int main(void)
  2. {
  3.   int n;
  4.   n = 0;
  5.  
  6.   while (n != 10)
  7.   {
  8.     n += 2;
  9.   }
  10.  
  11.   return 0;
  12. }
図5-1: while.c
このプログラムの場合、「n!=10」である限り「n+=2;」の処理を繰り返して実行します。 初めから「n!=10」の条件を満たしていなかった場合は、何もせずにwhile文を抜けます。 似た構文に「doドゥ-while文ホワイルぶん」があります(図5-2)。
  1. int main(void)
  2. {
  3.   int n;
  4.   n = 0;
  5.  
  6.   do
  7.   {
  8.     n += 2;
  9.   } while (n != 10);
  10.  
  11.   return 0;
  12. }
図5-2: do-while.c
このdo-while文は、動作はwhile文と似ていますが、繰り返すかどうかの判断が中身の処理の後で行われます。 つまり初めから「n!=10」の条件を満たさなかった場合でも、最低1回は「n+=2;」が実行されます。

6for文

for文フォアぶん」は、数を数えながら繰り返す構文です。 例えば、0から9まで数えながら計10回処理を行いたい場合、図6-1のように書きます。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int i;
  6.   for (i = 0; i < 10; i++)
  7.   {
  8.     printf("%d\n", i);
  9.   }
  10.  
  11.   return 0;
  12. }
図6-1: for.c
書式は「for(初期値;繰り返し条件;増減)」です。 このプログラムでは、画面には0から9までの10個の数が順に表示されます。 もし10から0まで2ずつカウントダウンしたい場合は、「for(i=10;i>=0;i-=2)」とします。
for文は、同じ動作をするwhile文に書き換えることができます。 先ほどのプログラムは図6-2のように書けます。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int i;
  6.   i = 0;
  7.   while (i < 10)
  8.   {
  9.     printf("%d\n", i);
  10.     i++;
  11.   }
  12.  
  13.   return 0;
  14. }
図6-2: while2.c
数えながら一定回数だけ繰り返したい場合は見やすさのためにfor文を、それ以外の繰り返し処理はwhile文を使うと良いでしょう。

7break文とcontinue文

for文、while文、do-while文の繰り返し処理を途中で抜けるには「break文ブレークぶん」を書きます。 また、繰り返し処理を1回スキップするには「continue文コンティニューぶん」を書きます(図7-1)。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int i;
  6.   for (i = 0; i < 10; i++)
  7.   {
  8.     if (i == 3)
  9.     {
  10.       continue;
  11.     }
  12.     else if (i == 6)
  13.     {
  14.       break;
  15.     }
  16.     printf("%d\n", i);
  17.   }
  18.  
  19.   return 0;
  20. }
図7-1: break_and_continue.c
この例では、iが3になると繰り返し処理を1回スキップし、iが6になると繰り返し処理を抜けるというプログラムになっているため、画面には「0」「1」「2」「4」「5」が表示されます。
厳密には、breakは繰り返し処理の閉じ括弧「}」の直後にジャンプする命令で、continueは閉じ括弧「}」の直前にジャンプする命令です。 for文などが何重にも入れ子になっていた場合は、breakやcontinueは一番内側の1つだけを抜けたりスキップしたりします。

8無限ループ

無限に繰り返したい場合は、よく「for(;;)」と書きます。 for文の各項目は省略可能で、繰り返し条件を省略すると永久に繰り返します(図8-1)。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   for (; ; )
  6.   {
  7.     printf("looping\n");
  8.   }
  9.   return 0;
  10. }
図8-1: infinite_loop.c
「for(;;)」ではなく、C言語では「while(1)」、C++では「while(true)」と書いても無限に繰り返されますが、条件式が常に真になる処理はコンパイル時に警告が出る場合があります。

9最後に

それでは最後に、「画面にHello, world!を30個表示するプログラム」を簡潔に書き直してみたいと思います。 図9-1の通りです。
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int i;
  6.   for (i = 0; i < 30; i++)
  7.   {
  8.     printf("Hello, world!\n");
  9.   }
  10.  
  11.   return 0;
  12. }
図9-1: hello_worlds2.c
とてもシンプルになりました。 ちなみに別の言語で書いても同様で、JavaScriptの場合は図9-2のようになります。
  1. <!DOCTYPE html>
  2. <script>
  3.   for (i = 0; i < 30; i++)
  4.   {
  5.     document.write("Hello, world!<br />");
  6.   }
  7. </script>
図9-2: hello_worlds2.html
今回は、Hello, world!を30回表示するための簡潔な書き方について解説しました。 次回は、変数が30種類あった場合に簡潔に扱う方法を解説します!
1544537692jaf