今回の目的
for文とwhile文の使い方の違いを理解する。
for 文と while 文の比較
while 文と for 文は相互に変換することができます。
たとえば、次のような while 文があったとします。
int i;
i = 1;
while(i <= 10){
printf("%d\n", i);
++i;
}
これは、次のような for 文に置き換えることができます。
int i;
for(i = 1; i <= 10; ++i){
printf("%d\n", i);
}
文の書いてある場所が変わっているだけで、内容は全く同じということが分かるでしょうか?
for 文を使うと、ある特定の while 文をより綺麗に分かりやすく記述することができます。
for 文の形式
for 文は一般的に次のような形式をしています。
for(初期設定; 条件式; 更新文){
条件が成立している間実行する文;
}
for 文は次のようなステップで実行されます。
- 初期設定が実行される
- 条件式が評価される
- 条件が成立していれば 3 へ
- 条件が成立していなければ、繰り返しを終了する
- 括弧 {} 内の文を実行する
- 更新文を実行し、2 へ戻る
上の for 文は、次のような while 文と同等です。
初期設定;
while(条件式){
条件が成立している間実行する文;
更新文;
}
for 文と while 文の使い分け
一般的には、次のようになります。
- for 文
ループ回数がループ実行前に明らかな時 - while 文
ループ回数がループ実行前に不明な時
プログラムに慣れてくれば、どちらを使うのが適切か分かるようになります。
頻度的には for 文の方が多く利用されることが多いですが、while 文も利用されます。
for 文が適した例
以下は、1 からユーザーが入力した数までの和を求めるプログラムです。
ループ実行前に、ループ回数 (= n ) が判明しています。
int i, n, s, t;
scanf("%d", &n);
s = 0;
for(i = 0; i < n; ++i){
scanf("%d", &t);
s = s + t;
}
printf("%d\n", s);
while 文が適した例
以下は、0 が入力されるまで、入力された整数の和を求めるプログラムです。
ループ実行前に、ループ回数が判明していません。
int s, t;
s = 0;
scanf("%d", &t);
while(t != 0){
s = s + t;
scanf("%d", &t);
}
printf("%d\n", s);
二重ループ
ループの中にループを入れることができます。
int i, j;
for(i = 0; i < 3; ++i){
for(j = 0; j < 3; ++j){
printf("%d %d\n", i, j);
}
}
上のプログラムを実行すると、下のように出力されます。
0 0 0 1 0 2 1 0 1 1 1 2 2 0 2 1 2 2
変数がどのように変化してるかを見て、
どのようにプログラムが動作しているか考えてみてください。
もちろん、三重ループもできますし、while 文でも可能です。
for 文による無限ループ
for 文による無限ループは以下の形式になります。
for(;;){
実行する文;
}
条件式の部分が空ですが、これで無限ループが成立します。
while 文の無限ループとどちらを使うかは、好みで構いません。
複合代入演算子
何らかの操作を伴う代入をより簡潔に記述するために、
C言語には次のような複合代入演算子が用意されています。
演算子 | 代入演算子を使う場合 | 複合代入演算子を使う場合 |
+= | a = a + 1 | a += 1 |
-= | a = a - 2 | a -= 2 |
*= | a = a * 4 | a *= 4 |
/= | a = a / 8 | a /= 8 |
どちらの書き方でも、実行結果は同じになります。
どちらで書いても構いませんが、後者の書き方にも慣れるようにしてください。*1
例
1 から 20 までの奇数を表示する。
int i;
for(i = 1; i < 20; i += 2){
printf("%d\n", i);
}
課題
課題1
入力された n 個の整数のうち、一番大きい整数を出力するプログラムを作りなさい。
n は 1 以上の整数であり、標準入出力を用いてください。
実行例
1行目が入力される整数の個数 n、
2行目は実際に比較する n 個の整数を表します。
3行目はプログラムによる出力です。
./a.out 2 7 9 9
./a.out 5 4 2 6 9 2 9
./a.out 2 -4 3 3
./a.out 1 3 3
課題2
for 文を使って、n! (階乗) を求めなさい。
n は 1 以上の整数であり、標準入出力を用いてください。
実行例
一行目は求めたい階乗、2行目はプログラムによる出力です。
./a.out 1 1
./a.out 3 6
./a.out 5 120
課題3
for 文を使って、ある値 a の b 乗を求めなさい。
a, b は 1 以上の整数とします。
標準入出力を用いるプログラムを作成すること。
実行例
1行目は、求めるべき乗を表します。
2行目はプログラムによる出力です。
./a.out 3 2 9
./a.out 2 4 16
./a.out 86 1 86
挑戦課題
- AOJ 10012: Print a Rectangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10012
- AOJ 10013: Print a Frame
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10013
- AOJ 10014: Print a Chessboard 難
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10014
- AOJ 10016: Grading
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10016
- AOJ 10017: How many ways? 難
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10017
- AOJ 0003: Is it a Right Triangle?
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0003&lang=jp
- AOJ 0007: Debt Hell
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0007&lang=jp
- AOJ 0008: Sum of 4 Integers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0008&lang=jp