C言語 for文の使い方【ループカウンタを使った反復処理を学ぶ】

C言語
この記事は約9分で読めます。

こんにちは、ナナです。

ここまで「順次処理」「分岐処理」と学び、プログラム3大要素の最後の一つとなりました。「反復処理」について学んでいきましょう。

本記事では次の疑問点を解消する内容となっています。

本記事で学習できること
  • 反復処理って何?
  • for文を使った反復処理の書き方とは?
  • ループカウンタって何?
  • 分岐で出てきたbreakが再度登場?
  • continueという新しいキーワードの役割は?

それでは反復処理の書き方と使い方を学びましょう。

スポンサー

for文を使った反復処理とは

はい、はーい。もう学んじゃいましたよ、順次と分岐。そろそろ次のいっちゃっていんじゃないですか?残ってるのありますよね。最初の頃の記事をちゃんと復習したので知ってるんですよ。

ナナ
ナナ

君はいつも軽いね。でも、復習するなんて偉いね、意外だよ。
じゃあ、「反復処理」について一緒に学んでいこうか。処理を繰り返したい時に使うよ。

皆さんの生活の中で「~の間はこれを繰り返す」といったことはよくあるシーンです。

反復横跳びはその名の通り「開始後20秒間は横に跳び続けてください」という繰り返しになります。「湯が沸騰するまで温める」といったものも温めるという行為を繰り返すことと言えます。

反復イメージ

このように「なんらかの条件を満たしている間は繰り返す」という反復処理をプログラムでも書くことができます。

プログラムの世界では繰り返すことを「ループ」と呼びます。

スポンサー

for文を使った反復処理の書き方

はい、はーい。ひょっとしてですが、この「はい、はーい」の「はい」って反復処理ですか?僕はひょっとして天性の反復使いですか?

ナナ
ナナ

よく気づいたね。それは「はい」を2回ループしていることになるね。君は生まれ持っての反復使いで間違いないよ。for文を使うとループ処理が書けるよ。

C言語で代表的な反復処理の記述はfor文という構文があります。

for文の反復処理の特徴は、決まっている回数だけ繰り返し処理を行いたいときに使います。

仏の顔も3度

for文は次のように記述します。

書き方

 for (初期化部 ; 反復条件部 ; 更新処理部)
 {
   繰り返したい処理;
 }

for文を使うには次の項目を指定しますが、省略することも可能です。

初期化部for文が実行される前に一度だけ実施される処理を記述する。
主にループカウンタの初期化を行う。
反復の条件部ループを繰り返すための条件式を記述する。
条件式が真となった場合にループを繰り返す。
更新処理部繰り返し処理が行われる度に実施したい処理を記述する。
主にループカウンタのインクリメントを行う。

for文で使うループカウンタとは

for文では、今が何回目の繰り返し処理なのかという数を管理していないと、繰り返しを終わるための条件がわかりません。

この繰り返し回数を管理する情報を「ループカウンタ」と呼びます。

#include <stdio.h>

int main(void)
{
    int i;  // ループカウンタ

    // 10回の繰り返し処理
    for (i=0 ; i < 10; i++)
    {
        printf("Hello %d\n", i);
    }

    return 0;
}

ループカウンタは慣例としてi、j、kを変数名として使用することが多いです。これらの変数名を見かけたらそれはループカウンタと判断してもよいでしょう。

スポンサー

for文で使える特殊なキーワード

ほほいのほーい。反復練習中なんですけどトイレに行きたくなっちゃいました。反復練習止めてもいいですか?

ナナ
ナナ

いいよ。反復処理ではbreak命令を使えば、反復処理を終了できるからbreakしてトイレいっておいで。

反復処理の中では反復処理を制御するための特別なキーワードが使えます。これらをうまく活用することで目的のループ処理を行うようにします。

反復処理でも使えるbreak文

分岐の章でも登場したbreak文は反復処理においても使用します。

繰り返し処理の途中で、なんらかの理由により繰り返し処理を終了したい時があります。そのような時に使うのが反復処理のbreak文であり分岐処理と組み合わせて使います。

反復のbreak

実際のプログラムにおける終了条件は様々ですが、このようにbreak文が実行されると対象となっている反復処理の外側に処理が移動します。

注意点は反復①の中に反復②がある場合は、breakで抜けられるのは所属している反復処理に対してのみとなります。

ネスト時のbreak処理
ナナ
ナナ

所属しているループのみしか抜けられないことに注意が必要です。

反復処理特有のcontinue文の使い方

continue文は反復処理特有の命令であり、強制的に次のループへ処理を移すための命令です。

この条件を満たした場合は次のループ処理に移行したいといった場合に使用します。

#include <stdio.h>
int main(void)
{
    int i;

    for (i=0 ; i < 100; i++)
    {
        if (i % 2 == 0)
        {
            // 次の繰り返し処理へ
            continue;
        }

        printf("%d\n", i);
    }

    return 0;
}

この処理ではループカウンタが奇数の場合、ディスプレイのカウンタ値が表示されるようになります。ループカウンタが偶数である場合は次のループ処理に移行させています。

スポンサー

Q&A:for文に関するよくある質問

ナナ
ナナ

for文に関する質問に答えます!

Q:ループカウンタの変数名はなぜ「i」「j」「k」を使うのでしょうか?

ほーい、質問でーす。ループカウンタのi、j、kってなんですか?

ナナ
ナナ

プログラミングの世界の慣例だね。Fortranという古い言語で使っていたルール他の言語の慣例になったんだね。

Fortranというプログラム言語においてはiから始まる変数が整数型(integer)となるルールがあり、その名残でi、j、kといった1文字の変数をループカウンタで表現することが一般的になりました。

iとjが識別しづらいといった理由で、この慣例を使わないケースもあります。

Q:for文の項目に対して省略が可能ってどういうこと?

はーい。for文の項目って省略可能って説明なんですが、どうやって省略するんですか?

ナナ
ナナ

条件式のセミコロンは残した状態で項目を書かなければOKだよ。

for文において項目は書くのが基本なのですが、省略することも可能です。例えば次のように書くことができます。

int i;

// 反復終了条件を省略
for (i = 0 ; ; i++)
{
    printf("%d\n", i);

    //  100になったら反復終了
    if (i >= 100)
    {
        break;
    }
}

上記例は真ん中の反復条件のみを省略していますが、3項目全てを省略することも可能です。

しかし、この表記は第3者の目から、省略したのか、書き忘れたのか判断が付かないという問題があります。

そのため、人によっては次のようにコメントを記載することで「意図的に省略してます!」というのをアピールすることもあります。

// 反復終了条件の省略をコメントで表現
for (i = 0 ; /**/ ; i++)
ナナ
ナナ

こういう発想は自分のプログラムが別の人からどのように見えるのか?という意識から生まれる発想なんです。

スポンサー

課題:for文による反復の使い方が学べたかを確認しよう

ナナ
ナナ

もしも、プログラムが上手く動かなくて困ったときは、答えを見るのではなく「デバッガ」の使い方を学びましょう。

この記事を見ると問題の解決技術が身に付きます。困ったときのオススメ記事です!

課題1

課題内容

次の変数を定義せよ。

データ型変数名初期値
unsigned longnumber(任意の値)

0から変数numberで指定した数までを、改行をしながら数値表示せよ。初期値として「5」を与えた場合に出力期待結果の通りになるようにせよ。


出力期待結果

0
1
2
3
4
5


main.c

#include <stdio.h>

int main(void)
{
    unsigned long number = 5;
    unsigned long i;

    for (i = 0; i <= number; i++)
    {
        printf("%d\n", i);
    }

    return 0;
}
ナナ
ナナ

for文を使った一番基礎的なプログラムですね。<=で比較しているため、ループカウンタがnumber以下の場合は反復されます。

比較演算に=を付ける/付けないの切り分けは身につけておきましょう。

課題2

課題内容

九九を一覧化して表示せよ。
2桁の数値は次の書き方で表示することができる。

printf("%2d", 変数);

出力期待結果

 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

main.c

#include <stdio.h>

int main(void)
{
    char i;
    char k;

    // 縦方向のループ
    for (i = 1; i <= 9; i++)
    {
        // 横方向のループ
        for (k = 1 ; k <= 9 ; k++)
        {
            printf("%2d ", i * k);
        }

        // 1行表示したら改行
        printf("\n");
    }

    return 0;
}
ナナ
ナナ

ループを2つ組み合わせたプログラムですね。九九の縦方向と横方向をループで表現しているのがわかるでしょうか?ステップ実行しながら1つずつ表示するとイメージが湧くでしょう。

また、printfには様々な画面表示の方法が用意されています。%2で2桁というのを表していますね。%dにしたらどうなるか実験してみるとよいでしょう。