繰り返し for

Last-modified: 2016-01-08 (金) 21:41:26
 

今回の目的

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 文は次のようなステップで実行されます。

  1. 初期設定が実行される
  2. 条件式が評価される
    • 条件が成立していれば 3 へ
    • 条件が成立していなければ、繰り返しを終了する
  3. 括弧 {} 内の文を実行する
  4. 更新文を実行し、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 + 1a += 1
-=a = a - 2a -= 2
*=a = a * 4a *= 4
/=a = a / 8a /= 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
./a.out
3
-3 -2 -1
-1

課題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

課題4

nPr (順列) を求めるプログラムを作成しなさい。

実行例

1行目は、n と r の入力です。
2行目は、nPr の出力です。

./a.out
4 2
12
./a.out
5 5
120

課題5

nCr (組み合わせ) を求めるプログラムを作成しなさい。

実行例

1行目は、n と r の入力です。
2行目は、nCr の出力です。

./a.out
4 2
6
./a.out
5 5
1

挑戦課題

 


*1 慣れたら、だるくて代入演算子は使ってられません。