6. 繰り返し処理の制御(2/2)
6.3 for文
for文も条件が成立している間、繰り返しの処理を実行しますが、while文と異なりfor文中で繰り返し制御条件を変えることができます。従って、予め繰り返し制御条件が分かっている場合はfor文が適しています。
6.3.1 形式
for文は括弧の中にセミコロンで区切って式を3つ指定します。式はそれぞれ、前処理、繰り返し制御条件、後処理になります。
for(式1; 式2; 式3)
繰り返し実行する処理;
- 式1
- 繰り返し処理に入る前の前処理を指定します。通常、繰り返しを制御する変数の初期化を行います。
- 式2
- 繰り返し制御条件を指定します。条件が成立(真)している間は繰り返しの処理を続行し、不成立(偽)になると繰り返しから抜け出します。
- 式3
- 繰り返し処理の後の後処理を指定します。通常、繰り返しを制御する変数の更新を行います。
- 繰り返し実行する処理
- 処理が1文のみの場合はブロックにする必要はありませんが、複数の場合は{と}で括ってブロックにします。
式1は最初に1回実行するのみです。「式2 → 繰り返し実行する処理 → 式3」を式2の値が真の間繰り返します。
式1、式2、式3は省略可能です。ただし、区切り記号の;(セミコロン)は省略できません。なお、全て省略した場合は永久ループになります。
6.3.2 例題
九九の表を出力します。行と列をカウントする変数を用意し、繰り返しの中で1〜9までカウントアップします。そして、「行 × 列」の計算を行うことで九九の計算を行います。
#include <stdio.h>
int main()
{
int gyou;
int retu;
printf("九九の表を作成します\n");
for(gyou = 1; gyou <= 9; ++gyou)
{
for(retu = 1; retu <= 9; ++retu)
{
printf("\t%d", gyou * retu);
}
printf("\n");
}
return 0;
}
$ ./ex06_3.prg
九九の表を作成します
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
$
- 8行目
- 行の出力を制御します。変数gyouの値が1〜9の間、繰り返し処理を行います。「gyou = 1」が前処理、「gyou <= 9」が繰り返し制御条件、「++gyou」が後処理になります。
- 10行目
- 列の出力を制御します。変数retuの値が1〜9の間、繰り返し処理を行います。
- 12行目
- 「gyou * retu」で九九の計算を行います。
- 15行目
- 1行分出力したので改行します。
6.4 その他の文
ここでは繰り返し処理に関連する次の文を説明します。これらの文は処理の流れを強制的に変更しますので、多用すると理解しにくいプログラムになりがちです(特にgoto文)ので、使用は極力控えた方がよいでしょう。
6.4.1 形式
break文は繰り返し(while文、do文、for文)やswitch文から抜け出ます。
continue文は繰り返し(while文、do文、for文)処理を中断し、繰り返し条件のチェックを行います。for文の場合は、式3(後処理)を行った後に繰り返し条件のチェックを行います。
goto文は指定したラベル行に制御を移します。
break;
continue;
goto ラベル;
6.4.2 例題
while文の例題として紹介したプログラムと同じ機能ですが、こちらはbreak文で繰り返しから抜け出しています。
#include <stdio.h>
int main()
{
char cont;
double taijyu;
double sinchyo;
printf("肥満度(BMI)の計算を行います\n");
while(1)
{
printf("体重(kg)と身長(m)を入力してください ==> ");
scanf("%lf%lf", &taijyu, &sinchyo);
/* 肥満度(BMI) = 体重(kg) / 身長(m) / 身長(m) */
printf("肥満度は%.2fです\n", taijyu / sinchyo / sinchyo);
printf("繰り返し肥満度の計算をしますか(Y/N) ==> ");
scanf("%*c%c", &cont);
if(cont != 'Y' && cont != 'y')
{
break;
}
}
printf("終了します\n");
return 0;
}
- 10行目
- C言語の場合、式の値が0は偽、0以外は真となりますので、1は真となり永久ループになります。「
for(; ;)
」も同じです。
- 21行目
- 変数contの値が「Y」でない場合、while文による繰り返しから抜け出します。