このサイトは更新終了し, こちらに移行しています。

C言語入門: 繰り返し処理

筑波大学農林工学系 奈佐原(西田)顕郎

ホーム


次に、数値解析や画像解析では不可欠の、繰り返し処理をマスターしよう。

同じような処理を何回も繰り返すことを、「繰り返し処理」とか「ループ処理」という。繰り返し処理では、以下に述べる「for文」を使うことが多い。

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

  1. /* hello.c */
  2. /* 2008/07/15 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. /* 2008/07/15 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!
$
ここで、7行めで新しい整数変数"i"を定義している。8行めの"for"以下の文では、変数"i"に、1から出発してひとつづつ増加する値を代入しながら、"i"が10以下である限り、9行め以下の処理(9行めと10行目の、{と}で囲まれた部分)を繰り返す。 つまり、"i"は繰り返し処理の回数をカウントするカウンターである。


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

  1. /* repeat.c */
  2. /* 2008/07/15 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.など)は打ち込まないで良い。
10行目: 最初に変数iに1を入れ(i=1)、iが10以下である限り下の部分をまわし続け(i<=10)、繰り返すたびにiに1を加える(i++)、という意味。このように、for文は、for (初期条件;繰り返しを続ける条件;繰り返しごとに行う処理)という書式である。i++はi=i+1と書いても良い。

11〜13行目: 繰り返し処理される部分。{}で囲む。

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


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


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

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

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

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

課題-5. 下記のように、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
ところで、課題-5の結果を、画面ではなく、ファイルに出力してみよう。以下のようにすればよい:

$ gcc kadai5.c -o kadai5
$ ./kadai5 > kadai5.txt
ここでkadai5.txtというのは出力先のファイル名であり、各自、適当に名付けてよい。

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

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

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

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

課題-8 2つの整数x,yをキーボードから読み込んで、xのy乗を表示するプログラムを作れ。(ヒント:for文で、かけざんをy回おこなう)

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


(ブラウザの「戻る」ボタンで戻ってください)