07_繰り返し処理

はじめに

この章では、同じ処理を繰り返すための for 文と while 文について学びます。ループ処理を使うことで、同じ処理を何度も効率よく実行できます。C言語と書き方は変わりません。

変数宣言のタイミングとスコープ(for の前に)

03章で学んだとおり、C++では変数を 使う直前に、意味のある初期値を与えて宣言する のが基本です。for 文に入る前に、それと深く関係する「スコープ(有効範囲)はできるだけ狭く」という考え方を確認しておきましょう。これが for の書き方に直結します。

C言語との違い

C言語(特に古い規格)では 関数の先頭ですべての変数を宣言する 必要がありました。C++では 必要になった場所で宣言できる ため、次の利点があります。

スコープが狭い=間違いが減る

{ } のブロックの中で宣言した変数は、そのブロックの中だけで有効です(この有効範囲を「スコープ」と呼びます)。役目が終わった変数を外に残さないことで、別の場所で誤って使う・書き換える事故や、名前の取り違えを防げます。次の for 文はその代表例です。

例:for はスコープ最小化の代表例

#include <iostream>
using namespace std;

int main() {
    cout << "繰り返す回数を入力:";
    int times;          // 直後の cin で値が入る(入力で受け取る変数はこの形)
    cin >> times;

    for (int i = 1; i <= times; i++) {   // i は for の中だけで有効
        cout << i << "回目の処理" << endl;
    }
    // ここで i は使えない(for の外なので)= 役目が終わった変数が残らない

    return 0;
}

ループカウンタ i はループの中でしか使いません。だから for初期化部で「使う直前に」「初期値 1 を与えて」宣言し、しかも「for の中だけ」に閉じ込めています。03章で学んだ宣言スタイルを、もっとも自然に実践した形です。

3つの原則: 変数は「使う直前に」「初期値つきで」「できるだけ狭いスコープに」宣言する。for (int i = 1; ...) はこの3つを全部満たした書き方です。

for文の基本

#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        cout << i << "回目の処理" << endl;
    }
    return 0;
}
解説

while文の基本

#include <iostream>
using namespace std;

int main() {
    int count = 1;
    while (count <= 5) {
        cout << count << "回目の処理" << endl;
        count++;
    }
    return 0;
}
解説

do-while文の特徴

#include <iostream>
using namespace std;

int main() {
    int count = 1;
    do {
        cout << count << "回目の処理" << endl;
        count++;
    } while (count <= 5);
    return 0;
}
解説

コーディング演習

演習1:基本コードを動かす

07_01_loop.cpp を作成し、次のコードを入力して実行しましょう。
// loop_basic.cpp
#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        cout << i << "回目の処理" << endl;
    }
    return 0;
}

演習2:コードを改造する

07_01_loop.cpp をコピーして 07_02_loop_mod.cpp として保存し、次の変更を加えてみましょう:
ヒントを見る 合計を累積する変数 sum を用意し、sum += i; でループのたびに加算します。
cin >> n; でキーボード入力を受け取れます。

理解度チェック

問題07-1

次のコードを実行したとき、最後に表示される数字はいくつですか?

for (int i = 1; i <= 5; i++) {
    cout << i << endl;
}
解説を表示 正解:ウ
i は1から始まり、i <= 5 の間繰り返します。i=5のとき最後に実行され、5が表示されます。i=6になると条件が偽になりループが終了します。

問題07-2

次のコードの出力として正しいものはどれですか?

int count = 1;
while (count <= 3) {
    cout << count * 2 << endl;
    count++;
}
解説を表示 正解:イ
count=1のとき 1×2=2、count=2のとき 2×2=4、count=3のとき 3×2=6 が表示されます。

問題07-3

do-while 文と while 文の最大の違いはどれですか?

解説を表示 正解:ア
do-while はブロックを先に実行してから条件を評価します。そのため条件が最初から偽でも、必ず1回は処理が実行されます。

問題07-4

次のコードを実行すると sum の値はいくつになりますか?

int sum = 0;
for (int i = 1; i <= 4; i++) {
    sum += i;
}
cout << sum << endl;
解説を表示 正解:イ
1+2+3+4 = 10 になります。sum += i はループのたびに i の値を sum に加算します。

関数の定義と呼び出し(C++での復習)

C言語で学んだ「関数」はC++でもそのまま使えます。 ここで一度確認しておきましょう。クラスを学ぶ前に、 「クラスに属さない普通の関数」(グローバル関数) の書き方を整理します。

基本構文

戻り値の型 関数名(引数の型 引数名, ...) {
    // 処理
    return 戻り値;
}
// 例:2つの数の大きい方を返す関数
#include <iostream>
using namespace std;

int maxValue(int a, int b) {    // 関数の定義(main の前に書く)
    if (a > b) {
        return a;
    } else {
        return b;
    }
}

int main() {
    int result = maxValue(10, 20);   // 関数の呼び出し
    cout << "大きい方:" << result << endl;
    return 0;
}
なぜここで確認するか:
次の章から学ぶ「クラスのメンバ関数」は、クラスの中に書く関数です。 普通の関数との違いを意識しながら学んでいきましょう。

コーディング演習(関数)

演習:関数を作って呼び出す

07_03_func.cpp を作成し、次のコードを参考にして 「2つの整数の合計を返す関数 add」と 「挨拶を表示する関数 greet(文字列を受け取り Hello, ○○ と表示)」を作りましょう。
ヒントを見る add(int a, int b)int を返す。greet(string name) は戻り値なし(void)にする。

まとめ