とらりもんHOME  Index  Search  Changes  Login

C言語入門2. 繰り返し処理

<C言語入門に戻る>

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

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

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

    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回表示させたいなら, どうすればよいだろう? そこで使うのがfor文である。こうするのだ:

    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!
$ 

ここで、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つのコンソールを用意して、ソースコードの作成と、コンパイル・実行を、それぞれ別のコンソールで行うと、作業効率は良くなる(下図参照)。

twoconsoles.png

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

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

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

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

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

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

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

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

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

<C言語入門に戻る>

Last modified:2022/08/09 13:48:51
Keyword(s):
References:[C言語入門] [C言語入門6. ファイルの入出力]