☜前の章へ 条件分岐(if・else if・switch)
☞次の章へ 関数を使ってみよう
- ループ処理とは
- ループ処理の書き方(for文・while文・do while文)
- 2重for文・多重ループの書き方
- break文とcontinue文の書き方
- 無限ループの書き方
ループ処理(繰り返し処理)について学習していきます。
この記事を読めば、普通のループのやり方から2重ループ、無限ループなどができるようになります。
ループ処理とは
ループ処理(または繰り返し処理)は、同じ処理や指定された処理を、繰り返し実行するプログラムのことです。
ループを使用することで、同じ処理や指定された処理を、指定された条件が満たされるまで、繰り返すことができます。
これにより、プログラムが効率的かつ簡潔になります。
ループ処理の書き方(for文・while文・do while文)
C言語でループ処理を行う場合、for文、while文、do while文が基本の書き方になります。
それぞれ同じ処理を繰り返し行えるという点に関しては同じ性質を持ちます。
しかし、書き方など違いもあるのでそれぞれ見ていきましょう。
for文でのループ処理
#include <stdio.h>
int main(void) {
printf("ゲームを開始します。ゲームは10ターンで終了します。\n");
for(int i = 1; i <= 10; i++) {
printf("%dターン目です\n", i);
}
printf("ゲームを終了します。\n");
return 0;
}出力結果

(初期化式 int i = 1; 条件式 i <= 10; 更新式 i++)
- 初期化式では、for文の中でのみ使用できる変数を宣言し初期化します
- 条件式には、ループが終了する条件を書きます。今回は初期化式で初期化した変数iの値が10以下の間ループを続けるという条件にしています
- 更新式には、初期化式で初期化された変数の値を増減させます。今回は1周ごとに変数iを1ずつ加算しています
例えば、今回の例でも出したようにゲームなどでターンが決まっている場合に使うことが出来ます。
while文でのループ処理
#include <stdio.h>
int main(void) {
//初期化式
int i = 5;
printf("カウントダウン開始\n");
while(i >= 0) {
printf("%d\n", i);
i--;
}
printf("End\n");
return 0;
}出力結果

while文はfor文とは違い、()の中に初期化式と更新式は書かず、条件式のみ書きます。
「i- -;」を書かないと無限ループになるので注意してください。
for文でもwhile文でも同じような処理は作れるのですが、while文の場合は主にあらかじめループ回数が決まっていない場合に使われます。
また、while文は特定の条件を満たしている場合にも使用されます。
上記の例は、基本的な書き方の紹介です。
もう少し分かりやすい、あらかじめループ回数が決まっていない場合の例も紹介します。
#include <stdio.h>
void clearInputBuffer() {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
int main(void) {
char input;
while(input != 'y' && input != 'Y') {
printf("終了しますか?yまたはnを入力してください。\n");
scanf("%c", &input);
clearInputBuffer();
}
return 0;
}出力結果

上記の例では、ユーザーがyと入力するまでループするという処理になります。
例えば、ループ内処理では次のようなことができます。ユーザーが学校の先生だと想定すると、先生は生徒一人一人の成績を管理するために、全員分の成績を入力していきます。必要な分の入力が終われば、yを入力して処理を終了します。
このように、あらかじめループ回数が決まっていない場合にwhile文は有効です。
do while文でのループ処理
#include <stdio.h>
int main(void) {
int num = 1;
do {
// ループ処理
printf("整数を入力して下さい。\n");
scanf("%d", &num);
} while(num != 1);
printf("%dが入力されたのでループが終了します。\n",num);
return 0;
}出力結果

do while文はwhile文と同様に、特定の条件を満たしている間、ループ処理を行います。
do while文とwhile文の違いは、do while文は必ず1回は処理が行われるという特徴があります。
while文は最初に条件判定を行うためループ処理が行われない可能性がありますが、do while文は絶対にループ処理が1回は行われます。
そのためdo while文は1回は絶対にループ処理を行いたい場合に使用されます。
2重for文・多重ループの書き方
2重for文とは、ループの中でループを行うことです。
ループの中にループをいくつでも書けるので多重ループにすることもできます。
#include <stdio.h>
int main(void)
{
for (int i = 1; i <= 5; i++) {
printf("i=%d:", i);
for(int j = 1; j <= 10; j++) {
printf("%d", j);
}
printf("\n");
}
return 0;
}出力結果

上記の例の場合、外側のループが1周するまでに、内側のループが10周しています。
最終的に外側のループが5周し、内側のループが50周します。
配列に値を代入する時などに使えます。
break文とcontinue文の書き方
break文
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 10; i++) {
printf("%d\n", i);
if(i == 5) {
break;
}
}
return 0;
}出力結果

iが5の時にループから抜けています。
このようにbreak文を使うとfor文で特定の条件を設定してループから抜けることができます。
while文とdo while文もbreak文を使えばループの途中で抜けることが出来ます。
#include <stdio.h>
int main(void) {
//初期化式
int i = 5;
while(i >= 0) {
printf("%d\n", i);
if(i ==2) {
break;
}
i--;
}
printf("End\n");
do {
i++;
printf("%d\n", i);
if(i == 5) {
break;
}
} while(i <= 10);
printf("End\n");
return 0;
}出力結果

continue文
#include <stdio.h>
int main(void) {
printf("ゲームを開始します。ゲームは10ターンで終了します。\n");
for(int i = 1; i <= 10; i++) {
if(i % 2 != 0) {
printf("%dターン目:あなたの番です\n", i);
continue;
}
printf("%dターン目:相手の番です\n", i);
}
printf("ゲームを終了します。\n");
return 0;
}出力結果

上記の例は、if文でiが奇数かを判定し、iが奇数の場合は「あなたの番です」と表示するようにしています。
if文の中にcontinueがあることで「printf(“%dターン目:相手の番です\n”, i);」という処理は飛ばされて、ループ処理が最初から始まります。
このようにcontinue文は後続の処理をスキップする際に使用されます。
無限ループの書き方
VSCODEで無限ループの処理が止まらなくなった場合はターミナルを選択した状態で「Ctrl + C」で止めてください。またはターミナルにあるゴミ箱のようなアイコンから強制終了してください。
無限ループが発生してもパソコンは壊れないので安心してください。
for文での無限ループ
#include <stdio.h>
int main(void) {
for(int i = 0;; i++) {
printf("%d\n", i);
}
return 0;
}出力結果

for文では条件式を書かなければ無限ループにすることができます。
while文での無限ループ
#include <stdio.h>
int main(void) {
int i = 1;
while(i < 5) {
printf("%d\n", i);
}
return 0;
}出力結果

while文ではループ処理内で条件式を満たすような処理を書かなければ無限ループにすることができます。
do while文での無限ループ
#include <stdio.h>
int main(void) {
int i = 1;
do {
printf("%d\n", i);
} while(i < 5);
return 0;
}出力結果

do while文もwhile文と同様に、ループ処理内で条件式を満たすような処理を書かなければ無限ループにすることができます。
練習問題
コンソールに次のように表示しましょう
123456789
#include <stdio.h>
int main()
{
for(int i = 1; i <= 9; i++) {
printf("%d", i);
}
return 0;
}出力結果

3回ループさせて、ループごとにクイズを出題し、yesの場合はy、noの場合nで解答できるプログラムを作成しましょう
#include <stdio.h>
int main() {
char yn;
for(int i = 0; i <= 3; i++) {
switch (i) {
case 0:
printf("マリオの帽子は赤色?yesの場合y、no場合nを入力してください。\n");
scanf("%c", &yn);
fflush(stdin);
if(yn == 'y' || yn == 'Y') {
printf("正解!\n");
} else {
printf("残念...マリオの帽子は赤色です。\n");
}
break;
case 1:
printf("マリオの弟の名前はポワール?yesの場合y、no場合nを入力してください。\n");
scanf("%c", &yn);
fflush(stdin);
if(yn == 'y' || yn == 'Y') {
printf("残念...マリオの弟の名前はルイージです。\n");
} else {
printf("正解!\n");
}
break;
case 2:
printf("マリオの最大の敵の名前はカッパ?yesの場合y、no場合nを入力してください。\n");
scanf("%c", &yn);
if(yn == 'y' || yn == 'Y') {
printf("残念...マリオの最大の敵の名前はクッパです。\n");
} else {
printf("正解!\n");
}
break;
default:
break;
}
}
return 0;
}出力結果

コンソールに次のように表示しましょう
123456789
123456789
123456789
#include <stdio.h>
int main()
{
for(int i = 1; i <= 3; i++) {
for(int j = 1; j <= 9; j++) {
printf("%d", j);
}
printf("\n");
}
return 0;
}出力結果


