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つのコンソールを用意して、ソースコードの作成と、コンパイル・実行を、それぞれ別のコンソールで行うと、作業効率は良くなる(下図参照)。
↑ 左のコンソールでソースコードを作成し(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言語入門に戻る>
Keyword(s):
References:[C言語入門] [C言語入門6. ファイルの入出力]