とらりもんHOME  Index  Search  Changes  Login

とらりもん - 繰り返し処理 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

<[[C言語入門]]に戻る>

 次に、繰り返し処理をマスターしよう。同じような処理を何回も繰り返すことを、「繰り返し処理」とか「ループ処理」という。これは, 大量の数値を扱う仕事(数値シミュレーションや画像解析など)では特に不可欠の処理である。

 C言語では、繰り返し処理を行うときに、以下に述べる「{{fontc(for文,red)}}」を使うことが多い。

 たとえば、以下のプログラムは、前回作ったのと同様の, 「Hello!という文を表示するプログラム」である。実際に打ち込んでコンパイル・実行して確認せよ。ただし左端の行番号は、後の解説のためであり、入力しなくてよい。また, 2行めと3行めは、今日の日付と君の名前に置き換えること:

     1. /* hello.c */
     2. /* 2017/02/18 K. Nasahara */
     3. # include <stdio.h>
     4. main()
     5. {printf("Hello!\n");
     6. }

注意: 左端の数字(6.など)は打ち込まないで良い。

$ gcc hello.c -o hello
$ ./hello
Hello!
$

ここで、もっと景気良く、Hello!を10回表示させたい!と思ったら、こうすればよい:

     1. /* hello.c */
     2. /* 2017/02/18 K. Nasahara */
     3. # include <stdio.h>
     4. main()
     5. {int i;
     6. for (i=1; i<=10; i++)
     7.    {printf("Hello!\n");
     8.    }
     9. }

注意: 左端の数字(6.など)は打ち込まないで良い。

$ gcc hello.c -o hello
$ ./hello Hello!
Hello!
Hello!
...
Hello!
$

ここで、5行めで新しい整数変数"i"を定義している。6行めの"for"以下の文では、変数"i"に、1から出発してひとつづつ増加する値を代入しながら、"i"が10以下である限り、7行め以下の処理(7行めと8行目の、{と}で囲まれた部分)を繰り返す。つまり、"i"は繰り返し処理の回数をカウントするカウンターみたいなものだ。

 上の例では, Hello!を表示させるということを毎回全く同じように愚直に繰り返したが, 「よく似ているけどすこしづつ微妙に違うこと」を繰り返すこともできる。例として、以下のソースコードは、1から10までの整数を足し合わせるプログラムだ。これをrepeat.cというファイル名で作成し、コンパイルし、実行せよ。ただし左端の行番号は、後の解説のためであり、みなさんは入力しなくてよい。右端の//から始まるコメントも入力しなくてよい:

     1. /* repeat.c */
     2. /* 2017/02/18 K. Nasahara */
     3. /* sum of 1+2+...+10 */
     4. # include <stdio.h>
     5. main()
     6. {
     7. int i;
     8. int s=0;              // 足し算の結果をたくわえる変数。初期値としてゼロを設定。
     9. for (i=1; i<=10; i++) // 繰り返し処理のコマンド。変数iを増やしながら次の{...}を繰り返す。
    10.    {s=s+i;              // iは1から10まで1づつ増えるが、それを順にsに足していく。
    11.     printf("%d %d\n", i, s); // 足し算の途中経過を表示。
    12.    }                    // 繰り返し処理の範囲の区切り。
    13. }

注意: 左端の数字(6.など)は打ち込まないで良い。

 この9行目がポイントである。最初に変数iに1を入れ(i=1)、iが10以下である限り下の部分をまわし続け(i<=10)、繰り返すたびにiに1を加える(i++)、という意味。このように、for文は、for (初期条件;繰り返しを続ける条件;繰り返しごとに行う処理)という書式である。i++はi=i+1と書いても良い。
 10〜12行目は, for文によって繰り返される処理の内容を述べている。{}で囲むこと。

'''課題2-1''': 10行めの{と12行めの}を削除して, コンパイルと実行をしてみよ。何が起きるか? なぜそんなことが起きたか?

注意:一般的に、プログラミングの際は、2つのコンソールを用意して、ソースコードの作成と、コンパイル・実行を、それぞれ別のコンソールで行うと、作業効率は良くなる(下図参照)。

{{attach_view(twoconsoles.png)}}

↑ 左のコンソールでソースコードを作成し(vi)、右のコンソールでコンパイルや実行をする。

'''''課題2-2'': 2-2''': 上のプログラムを改造し、1から100までの和を計算するプログラムを作れ。

'''''課題2-3'': 2-3''': 1から10までの数の、それぞれの2乗を足し合わせるプログラムを作れ。(ヒント:iの2乗は、i*iと書く。i^2ではダメ。C言語では巾乗を"^"であらわすことはできない)

'''''課題2-4'': 2-4''': 1から99までの奇数を合計するプログラムを作れ。(ヒント:for文で、処理をi=i+2とする)

'''''課題2-5'': 2-5''': 9から順に1づつ減らして0まで表示するプログラムを作れ。(ヒント:for文で、初期値をi=9とし、条件を0<=i、処理をi=i-1とする)

'''''課題2-6'': 2-6''': 下記のように、0〜9の整数について、2乗、3乗、4乗を表示するプログラムを作れ。(ヒント: タテの列をそろえるには、タブを使うと良い。タブはprintf文の中では
\t
で表現できる。)

        0       0       0       0
        1       1       1       1
        2       4       8       16
        3       9       27      81
        4       16      64      256
        5       25      125     625
        6       36      216     1296
        7       49      343     2401
        8       64      512     4096
        9       81      729     6561

 ところで、課題2-6の結果を、画面ではなく、ファイルに出力してみよう。以下のようにすればよい(「出力リダイレクト」というテクニック):

$ gcc kadai2-6.c -o kadai2-6
$ ./kadai2-6 > kadai2-6.txt

ここでkadai2-6.txtというのは出力先のファイル名であり、各自、適当に名付けてよい。

 すると、計算結果はすぐには画面に表示されず、かわりに、

$ cat kadai2-6.txt

とすれば、画面に表示される。このように、UNIXでは、画面への出力を、ファイルへの出力に振り替えることができる。このような操作を「リダイレクト」という。

'''''課題2-7'':2-7''': ひとつの整数をキーボードから読み込んで、1からその数までの和を計算するプログラムを作れ。

'''''課題2-8'':2-8''': ひとつの整数をキーボードから読み込んで、その2乗、3乗、4乗を表示するプログラムを作れ。

'''''課題2-9'':2-9''': 2つの整数x, yをキーボードから読み込んで、xのy乗を表示するプログラムを作れ。(ヒント:for文で、かけざんをy回おこなう。整数型変数zを用意し, 最初にz=1としてから, z=z*xという計算をy回行えば, zに答えが入るはず。)

'''''課題2-10'':2-10''': ひとつの整数をキーボードから読み込んで、階乗、つまり1からその数までの積(1×2×...×n)を計算するプログラムを作れ。

<[[C言語入門]]に戻る>