【C言語入門講座】7章.for文で繰り返し処理や無限ループをする方法

C言語入門レッスン

☜前の章へ 条件分岐(if・else if・switch)
☞次の章へ 関数を使ってみよう


【C言語入門講座】は全13章から構成される、初心者向けのC言語学習コンテンツです。1章から13章まで学習して頂くことでC言語の基礎を学習することができます。

この記事で分かること
  1. ループ処理とは
  2. ループ処理の書き方(for文・while文・do while文)
  3. 2重for文・多重ループの書き方
  4. break文とcontinue文の書き方
  5. 無限ループの書き方

ループ処理(繰り返し処理)について学習していきます。

この記事を読めば、普通のループのやり方から2重ループ、無限ループなどができるようになります。

ループ処理とは

ループ処理(または繰り返し処理)は、同じ処理や指定された処理を、繰り返し実行するプログラムのことです。

ループを使用することで、同じ処理や指定された処理を、指定された条件が満たされるまで、繰り返すことができます

これにより、プログラムが効率的かつ簡潔になります。

ループ処理の書き方(for文・while文・do while文)

※上記の青い文字から読みたい項目へ移動することができます

C言語でループ処理を行う場合、for文、while文、do while文が基本の書き方になります。

それぞれ同じ処理を繰り返し行えるという点に関しては同じ性質を持ちます。

しかし、書き方など違いもあるのでそれぞれ見ていきましょう。

for文でのループ処理

for文の書き方
  • 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;
}

出力結果

ゲームを開始します。ゲームは10ターンで終了します。 1ターン目です 2ターン目です 3ターン目です 4ターン目です 5ターン目です 6ターン目です 7ターン目です 8ターン目です 9ターン目です 10ターン目です ゲームを終了します。

(初期化式 int i = 1; 条件式 i <= 10; 更新式 i++)

  • 初期化式では、for文の中でのみ使用できる変数を宣言し初期化します
  • 条件式には、ループが終了する条件を書きます。今回は初期化式で初期化した変数iの値が10以下の間ループを続けるという条件にしています
  • 更新式には、初期化式で初期化された変数の値を増減させます。今回は1周ごとに変数iを1ずつ加算しています
for文が使用されるケース
  1. 特定の回数だけ繰り返しを行いたい場合
  2. あらかじめループ回数が決まっている場合

例えば、今回の例でも出したようにゲームなどでターンが決まっている場合に使うことが出来ます。

while文でのループ処理

while文の書き方
  • 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;
}

出力結果

カウントダウン開始 5 4 3 2 1 0 End

while文はfor文とは違い、()の中に初期化式と更新式は書かず、条件式のみ書きます。

「i- -;」を書かないと無限ループになるので注意してください。

for文でもwhile文でも同じような処理は作れるのですが、while文の場合は主にあらかじめループ回数が決まっていない場合に使われます。

また、while文は特定の条件を満たしている場合にも使用されます。

while文が使用されるケース
  1. あらかじめループ回数が決まっていない場合
  2. 特定の条件を満たしている場合

上記の例は、基本的な書き方の紹介です。
もう少し分かりやすい、あらかじめループ回数が決まっていない場合の例も紹介します。

#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またはnを入力してください。 n 終了しますか?yまたはnを入力してください。 n 終了しますか?yまたはnを入力してください。 y

上記の例では、ユーザーがyと入力するまでループするという処理になります。

例えば、ループ内処理では次のようなことができます。ユーザーが学校の先生だと想定すると、先生は生徒一人一人の成績を管理するために、全員分の成績を入力していきます。必要な分の入力が終われば、yを入力して処理を終了します。

このように、あらかじめループ回数が決まっていない場合にwhile文は有効です。

do while文でのループ処理

do 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;
}

出力結果

整数を入力して下さい 1 1が入力されたのでループが終了します

do while文はwhile文と同様に、特定の条件を満たしている間、ループ処理を行います。

do while文とwhile文の違いは、do while文は必ず1回は処理が行われるという特徴があります。

while文は最初に条件判定を行うためループ処理が行われない可能性がありますが、do while文は絶対にループ処理が1回は行われます。

そのためdo while文は1回は絶対にループ処理を行いたい場合に使用されます。

do while文が使用されるケース
  1. 1回は絶対にループ処理を行いたい場合

2重for文・多重ループの書き方

多重ループの書き方
  • for (初期化式; 条件式; 更新式) {
    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;
}

出力結果

i=1:12345678910 i=2:12345678910 i=3:12345678910 i=4:12345678910 i=5:12345678910

上記の例の場合、外側のループが1周するまでに、内側のループが10周しています。

最終的に外側のループが5周し、内側のループが50周します。

配列に値を代入する時などに使えます。

break文とcontinue文の書き方

break文とcontinue文の書き方
  1. break文
  2. 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;
}

出力結果

1 2 3 4 5

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;
}

出力結果

5 4 3 2 End 3 4 5 End

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;
}

出力結果

ゲームを開始します。ゲームは10ターンで終了します。 1ターン目:あなたの番です 2ターン目:相手の番です 3ターン目:あなたの番です 4ターン目:相手の番です 5ターン目:あなたの番です 6ターン目:相手の番です 7ターン目:あなたの番です 8ターン目:相手の番です 9ターン目:あなたの番です 10ターン目:相手の番です ゲームを終了します。

上記の例は、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;
}

出力結果

10804 10805 10806 10807 10808 10809 10810 10811 10812

for文では条件式を書かなければ無限ループにすることができます。

while文での無限ループ

#include <stdio.h>

int main(void) {
    int i = 1;

    while(i < 5) {
        printf("%d\n", i);
    }

    return 0;
}

出力結果

1 1 1 1 1 1 1 1

while文ではループ処理内で条件式を満たすような処理を書かなければ無限ループにすることができます。

do while文での無限ループ

#include <stdio.h>

int main(void) {
    int i = 1;
    
    do {
        printf("%d\n", i);
    } while(i < 5);
    

    return 0;
}

出力結果

1 1 1 1 1 1 1 1

do while文もwhile文と同様に、ループ処理内で条件式を満たすような処理を書かなければ無限ループにすることができます。


練習問題

コンソールに次のように表示しましょう
123456789

#include <stdio.h>
int main()
{
    for(int i = 1; i <= 9; i++) {
        printf("%d", i);
    }
    
    return 0;
}

出力結果

123456789

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;
}

出力結果

マリオの帽子は赤色?yesの場合y、no場合nを入力してください。 y 正解! マリオの弟の名前はポワール?yesの場合y、no場合nを入力してください。 y 残念...マリオの弟の名前はルイージです。 マリオの最大の敵の名前はカッパ?yesの場合y、no場合nを入力してください。 n 正解!

コンソールに次のように表示しましょう

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;
}

出力結果

123456789 123456789 123456789

☜前の章へ 条件分岐(if・else if・switch)
☞次の章へ 関数を使ってみよう