繰り返し処理
この章では「繰り返し処理」に焦点を当て説明します。for文、while文、do-while文を使用して、特定の処理を繰り返し実行する方法を説明します。
for文
for文は決まった回数だけ処理を繰り返すときに使用します。
構文は以下の通りです。
for(初期化式 ; 条件式 ; 変化式){
命令文;
}
以下は、iが1から5まで繰り返すサンプルコードです。このコードをfor文の構文と比較してみましょう。
for( int i=1; i <= 5; i++){
printf("i=%d\n",i);
}
- ①初期化式
-
int i=1;
初期化式は代入演算子を使い、定義した変数を初期化します。 - ②条件式
-
i<=5;
条件式は、その式が真である間、繰り返しを行うことを意味します。
条件式が偽と評価された場合、繰り返しは終了します。
この例では、変数iが5以下である限り、処理が続くことを示しています。 - ③命令文
-
printf(“i=%d\n”,i);
画面に変数iの値を出力します。
- ④変化式
-
i++;
ループごとに変数iの値を変更します。この変更は命令文が処理された後に行われます。
変化式を正しく設定しないと、条件式が永遠に偽にならず、無限ループが発生する可能性があるので注意が必要です。
変化式は、以下のように、さまざまな値を取ることができます。
- i = i + 1 ・・・i++と等しく変数の値を1増加させます
- i += 2 ・・・変数の値を2増加させます( i= i +2 とも書くことができる)
- i– ・・・変数の値を1減少させます( i = i-1 とも書くことができる)
- i -= 3 ・・・変数の値を3減少させます(i=i-3とも書くことができる)
- ⑤繰り返し
- ②の処理へ戻ります。
for文の処理の流れを図に示します。
while文
while文は、指定された条件式が真である限り繰り返し処理を行う時に、使用します。
構文は以下の通りです。
while(条件式){
命令文;
}
for文と異なり、初期化式および変化式は指定しません。
したがって、条件式で使用される変数は、while文の前で初期化を行い、命令文内で変更を加える必要があります。
以下は、1から始めて合計が5未満になるまで加算を繰り返すサンプルコードです。このコードをwhile文の構文と比較してみましょう。
int i = 1;
int sum = 0;
while(sum<5){
printf("i=%d:sum=%d\n",i,sum);
sum = sum + i;
i++;
}
実行結果
i=1:sum=0
i=2:sum=1
i=3:sum=3
- ①変数の初期化
-
while文の中で使用する変数を定義し初期化します。
int i = 1;
int sum = 0;
- ②条件式
-
while(sum<5)
条件式の評価が偽の場合、繰り返し処理を抜けます。
この例では、変数sumが5未満である間、処理を繰り返すことを示しています。 - ③命令文
-
printf(“i=%d:sum=%d\n”,i,sum);
sum = sum + i;
i++;
命令文の中で、実行する処理と変化式を記述します。
変化式を記述しなければ、条件式②が偽となることはなく、結果として無限ループに陥ってしまいます。
- ④繰り返し
- ②の処理へ戻ります。
while文の処理の流れを図に示します。
for文とwhile文はどちらも繰り返し処理を制御するために使用されます。通常、for文は特定の回数だけ処理を繰り返す場合に用いられ、while文はある条件が満たされている間処理を繰り返す場合に適しています。
while文を使用しても、for文と同様に特定の回数だけ処理を繰り返すことは可能です。
以下は、for文で作成したソースコードをwhile文で記載したサンプルコードです。
int i=1;
while( i<=5){
printf("i=%d\n",i);
i++;
}
for文の初期化式の処理をwhile文の前に記述し、変化式は命令文の中に記載しています。※上記のサンプルで使用されている大なりイコール(<=)は全角文字で記述しているため、テキストをコピーした後は半角文字に変更してください。
do-while文
do-while文は、while文と同じように、指定された条件が真の間は繰り返し処理を実行するために使用されます。
do-while文とwhile文の主な違いは、do-while文では最初に命令文を実行し、その後で条件式を評価する点です。これにより、while文が一度も命令文を実行しない可能性があるのに対し、do-while文では少なくとも一度は命令文が実行されることになります。
構文は以下の通りです。
do(
命令文
} while(条件式) ;
※while(条件式)の後には、;(セミコロン)を必ず記述しなければなりません。
以下は、while文でも記述した「変数sumが5より小さい間繰り返し処理を続ける」サンプルコードをdo-while文で書き換えたサンプルです。
int i=1;
int sum=0;
do{
printf("i=%d:sum=%d\n",i,sum);
sum = sum + i;
i++;
} while(sum<5);
このプログラムの流れを図に示します。
while文は条件が最初から偽である場合、命令文が一度も実行されないのに対し、do-while文では少なくとも一度は命令文が実行されます。以下に例を示します。
//while文
int i=0;
while(i>0){
printf("i=%d\n",i);
i--;
}
実行結果
(出力なし)
//do-while文
int i=0;
do{
printf("i=%d\n",i);
i--;
} while(i>0);
実行結果
i=0;
do-while文は、繰り返し処理を実行する際、「最低1回は命令文を実行する」場合に便利です。
continue文
繰り返し処理の中で使用します。
if文と併用され、if文の条件によりそれに続く命令文をスキップし、繰り返し処理を継続するときに使用します。
以下はfor⽂を利⽤し変数iの値が偶数である場合にのみ処理をスキップするサンプルコードです。
for (int i = 1; i < 10; i++) {
if (i % 2 == 0) {
continue;
}
printf("%d\n",i);
}
実行結果
1
3
5
7
9
if (i % 2 == 0)が真のとき以降の処理はスキップし、次の繰り返し処理に移ります。
そのため、実行結果では、iが偶数のときの出力処理は実行されていません。
このプログラムの流れを図に示します。
break文
switch-case文では、ブロックから脱出するために使用しています。
繰り返し処理の中でも使用可能です。繰り返し処理を強制終了する際に用います。if文と組み合わせて使用されることが一般的です。
以下は、while文を使用して1から順に合計を計算し、その合計が20を超えた場合にループを強制終了するサンプルコードです。
int i = 1;
int sum = 0;
while (i<100) {
printf("(%d)%d⇒",i,sum);
if (sum > 20) {
break;
}
sum = sum + i;
i++;
printf("(%d)%d\n",i,sum);
}
printf("\n");
printf("1から%dまでの和は%dです\n",i,sum);
実行結果
(1)0⇒(2)1
(2)1⇒(3)3
(3)3⇒(4)6
(4)6⇒(5)10
(5)10⇒(6)15
(6)15⇒(7)21
(7)21⇒
1から7までの和は21です
iとsumを加算する前後でそれぞれの値を出力すると、if (sum > 20) の条件が真の場合にプログラムが強制終了し、while文から抜け出しているため、強制終了後の処理は実行されていないことが確認できます。
このプログラムの流れを図に示します。
コメント