for文

同じ処理を繰り返す方法の基本。ループ制御を学ぶ

概要

プログラムで同じ処理を何度も繰り返す必要があることがよくあります。 その時に使うのがfor文です。

例えば「1から10まで足し算をする」という処理を for文で実現できます。

for文の基本形

for (初期化; 条件; 終了処理) {
    // 条件が true の間、ここが繰り返される
}

各部分の役割

  • 初期化:ループを開始する前に一度だけ実行(カウンタ変数の初期化)
  • 条件:毎回チェック。true なら実行、false なら終了
  • 終了処理:1回のループが終わるたびに実行(カウンタのインクリメントなど)

シンプルな例

#include <iostream>

int main() {
    for (int i = 0; i < 5; i++) {
        std::cout << i << std::endl;
    }
    return 0;
}

0
1
2
3
4

実行の流れ:

段階 i の値 実行内容
初期化 i = 0 i を 0 で初期化
1回目 0 0 < 5? YES → 出力 → i++(i=1)
2回目 1 1 < 5? YES → 出力 → i++(i=2)
... ... ...
終了判定 5 5 < 5? NO → ループ終了

計算例

例1: 合計を計算

#include <iostream>

int main() {
    int sum = 0;
    
    for (int i = 1; i <= 10; i++) {
        sum = sum + i;
    }
    
    std::cout << "1から10までの合計: " << sum << std::endl;
    return 0;
}

1から10までの合計: 55

例2: 九九表

#include <iostream>

int main() {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= 9; j++) {
            std::cout << i * j << "\t";
        }
        std::cout << std::endl;
    }
    return 0;
}

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
...(省略)

このようにネストされたfor文(for文の中にfor文)で、 2次元的な繰り返しができます。

ループ制御

break:ループを抜ける

#include <iostream>

int main() {
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            break;  // i == 5 になったらループを抜ける
        }
        std::cout << i << std::endl;
    }
    std::cout << "終了" << std::endl;
    return 0;
}

0
1
2
3
4
終了

continue:次の繰り返しへ

#include <iostream>

int main() {
    for (int i = 0; i < 10; i++) {
        if (i % 2 == 0) {
            continue;  // 偶数は飛ばす
        }
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

1 3 5 7 9

様々なループのバリエーション

逆順ループ

for (int i = 10; i > 0; i--) {
    std::cout << i << " ";
}

10 9 8 7 6 5 4 3 2 1

2ずつ増加

for (int i = 0; i < 20; i += 2) {
    std::cout << i << " ";
}

0 2 4 6 8 10 12 14 16 18

実践例

例1: 素数判定(複数の数値)

#include <iostream>

int main() {
    for (int n = 2; n <= 20; n++) {
        bool isPrime = true;
        
        for (int i = 2; i < n; i++) {
            if (n % i == 0) {
                isPrime = false;
                break;
            }
        }
        
        if (isPrime) {
            std::cout << n << " ";
        }
    }
    std::cout << std::endl;
    return 0;
}

2 3 5 7 11 13 17 19

例2: ピラミッド図形を描く

#include <iostream>

int main() {
    for (int i = 1; i <= 5; i++) {
        for (int j = 0; j < i; j++) {
            std::cout << "*";
        }
        std::cout << std::endl;
    }
    return 0;
}

*
**
***
****
*****

ポイント

  • for文は回数が決まっているループに適している
  • 初期化・条件・終了処理の3つの部分から構成される
  • breakでループを途中で抜けられる
  • continueで現在の繰り返しをスキップできる
  • ネストしたfor文で複複雑なパターンに対応

よくある誤り

誤り1: 無限ループになる

for (int i = 0; i < 10; ) {  // i++ がない!
    std::cout << i << std::endl;
    // i が更新されないので無限ループ
}

誤り2: 条件が常に true

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        i = 0;  // i をリセット(再び0から)→ 無限ループ
    }
}

誤り3: セミコロンを置く

for (int i = 0; i < 10; i++);  // セミコロン!
{
    std::cout << i << std::endl;  // これは1度だけ実行
}

やってみよう

練習1: 1から100までの合計を計算するプログラム。

練習2: ユーザーから10個の数値を受け取り、その平均を計算するプログラム。

練習3: かけ算九九の3の段を表示するプログラム。

チャレンジ: ユーザーから数値 n を受け取り、n! (階乗) を計算するプログラム。 (例: 5! = 5 × 4 × 3 × 2 × 1 = 120)

まとめ

  • for文は決まった回数のループに最適
  • 初期化・条件・終了処理の順序を理解することが重要
  • breakcontinueでループを制御
  • ネストしたfor文で複雑なパターンにも対応可能