for文制御


ループを作る

ここではプログラミングにおいて、最も重要なことのひとつループ制御を覚えたいと思います
ループとは、一定のプログラムを繰り返すことです

もちろん、繰り返す回数やループの終了条件もプログラマが定める必要があります
このようなループ制御にはforステートメントを使用します
ループ制御によって、作業の完結化、マクロ化ができますね

forステートメントはカウンター変数を用意して、現在のループ回数をカウントします
カウンター変数を条件式で用いて、条件式が偽になったときにループを抜ける仕組になっています
ループを抜けるまでは指定されたステートメントを実行しつづけます

for (カウンター ; 判定 ; ステップ) ステートメント

カウンター はカウンターとなる変数を初期化します
カウンターに使う変数をint型の count だとして、forループを再現すると以下のようになります

for (count = 0 ; count < 5 ; count++) printf("繰り返してます\n");

このforステートメントは printf()関数 を繰り返し実行するものです

count = 0 で初期化を行なっています
これは、必ずしも0である必要はなく、好きな初期値からはじめることができます
ここの初期化はループ開始時に一度だけ実行されます

次の count < 5 という条件式は、ループを繰り返すかどうかの評価をします
もしここで偽(false)が返された場合、forステートメントはループを終了して次の命令へと進みます
逆にいえば、条件式が真のならばループするということです

count++は計算の基礎でやったインクリメント演算子を使ってカウントを数えています
ここは、必ずしもインクリメントやデクリメントを使う必要はありませんが、一般的にはインクリメントかデクリメントを使います

条件式の評価とステップは繰り返すごとに実行されます
ステップでインクリメントが多く用いられるのは、くり返すごとにカウンタが1進むというわかりやすい構図だからです
そして6回繰り返した時点で count が5になるのでループをぬけます

以下のプログラムはforステートメントを使って現在のループ回数を数えるプログラムです
#include <stdio.h>

int main()
{
        int count;

        for (count = 1 ; count <= 10 ; count++) printf("%d回目のループです\n" , count);

        return 0;
}
countが11になった時点でループを抜けて終了します

ちなみに、最初から条件式が偽であればどうなるかというと一度も実行しないです
for文はかなり自由度の高いループ制御なので、実際のプロジェクトでも多用すると思われます

ところで、ステートメントはわずか一行しか指定していませんでしたね
何行にも及ぶ複数のステートメントをループに使いたい場合は、やはりif文同様コードブロックを使います
ベロニカベロニカベロニカトロイカベロニカベロニカベロニカ……すっきり♪
for(カウンター ; 判定 ; ステップ) { ステートメント }

この場合は、コードブロックを最後まで実行してからforステートメントの判定に戻ります
通常for文を使うのはこの形が多いのです
#include <stdio.h>

int main()
{
        int count;
        int max;

        printf("ループ回数を指定してください\n");
        scanf("%d",&max);

        for (count = 0 ; count < max ; count++) {
                printf("%d回目です\r" , count);
                if (count == 5000) {
                        printf("5000回目を越えたので強制終了します\n");
                        count = max;
                }
        }
        printf("ループを抜けました");
        return 0;
}
こうすれば、コードブロックを指定回数繰り返すことができます
このプログラムはユーザーに繰り返したい回数を入力させて実行するのですが
もちろん入力される数字は異常なほど高かったり負の数であったり、あるいは数ではなく文字が入力されることも考えられます
そのようなケースを考えて、5000回以上くり返された場合は強制的にループを抜け出すようにしています

forステートメントによるループの中に、他の制御文(ここではif)を用いるなどしてループをさらに細かく制御することもできるのです
他にもループ制御をつかった面白いプログラムが作れると思うので、自分で考えて作ってみてください


for( [init-expr]; [cond-expr]; [loop-expr] ) statement;

statementをcond-exprが真であるかぎり繰り返します
statementは単一行以外にコードブロックも指定できます

init-expr 省略可能です。変数の初期化を行ないます

cond-exor 省略可能です。繰り返すごとに評価する条件式を指定します。ここが真であるかぎり繰り返します

loop-expr 省略可能です。繰り返すごとに実行する式を指定します

statement 繰り返すごとに実行するステートメントを指定します



前のページへ戻る次のページへ