第6章の4 for文

1. 基本的な for文

for文は、繰り返し回数があらかじめ決まっている場合に便利な制御文です。初期設定式、継続条件式、再設定式を1つの行にまとめて記述できるため、コードがすっきりと読みやすくなります。

(1) for文の記述方法

【書き方】
for (初期設定式; 継続条件式; 再設定式) {
  文;
}

  • 文は複合文も可。
  • 複数行の文の場合には { } で囲み複合文に。単文の場合には{ }は省略可能。
  • 再設定式の後に「;」は入れてはいけない。

【フローチャート】

// 例
for (int i = 1; i <= 5; i++) {
    printf("i = %d\n", i);
}

【実行結果例】
i = 1
i = 2
i = 3
i = 4
i = 5

  • 初期設定式は通常の代入文を記述。
  • 継続条件式はこの式が真の間、ループを続けるという意味。「~の間」であって、「~まで」ではないので注意。
  • 再設定式には「i++」ばかりではなく、 「i–」や「i = i + 2」などいろいろな値をとることが可能。
  • ループ変数(使用例では i)は int型以外にも char型や double型なども可能。

(2) for文のいろいろなパターン

// 複合文の例

int sum = 0;
int mul = 1;

for(int i = 1; i <= 10; i++) {
    sum = sum + i;
    mul = mul * i;
    printf("sum = %d, mul = %d\n", sum, mul);
}

【実行結果例】
sum = 1, mul = 1
sum = 3, mul = 2
sum = 6, mul = 6
sum = 10, mul = 24
sum = 15, mul = 120
sum = 21, mul = 720
sum = 28, mul = 5040
sum = 36, mul = 40320
sum = 45, mul = 362880
sum = 55, mul = 3628800

10 から 20 まで 2刻み

int sum = 0;
int mul = 1;

for(int i = 10; i <= 20; i += 2) {
    sum = sum + i;
    mul = mul * i;
    printf("sum = %d, mul = %d\n", sum, mul);
}

【実行結果例】
sum = 10, mul = 10
sum = 22, mul = 120
sum = 36, mul = 1680
sum = 52, mul = 26880
sum = 70, mul = 483840
sum = 90, mul = 9676800

20 から 10 まで -2刻み

int sum = 0;
int mul = 1;

for(int i = 20; i >= 10; i -= 2) {
    sum = sum + i;
    mul = mul * i;
    printf("sum = %d, mul = %d\n", sum, mul);
}

【実行結果例】
sum = 20, mul = 20
sum = 38, mul = 360
sum = 54, mul = 5760
sum = 68, mul = 80640
sum = 80, mul = 967680
sum = 90, mul = 9676800

ループ変数が浮動小数点数の例

for (double x = 0.1; x <= 2.0; x += 0.1)
    printf("%.1f\n", x);

【実行結果例】
0.1
0.2
0.3
(中略)
1.7
1.8
1.9  <— 演算誤差のため x = 2.0 が表示されない

浮動小数点数をループ変数に用いると誤差が生じます。以下のように、ループ変数は整数型にしましょう。

// 改良例
for (int i = 1; i <= 20; i++)       // ループ変数を整数型にする
    printf("%.1f\n", i / 10.0);     // 出力時にxを10.0で割る

【実行結果例】
0.1
0.2
0.3
(中略)
1.7
1.8
1.9
2.0  <— 2.0 も表示される

ループ変数が文字の場合

for(char ch = 'A'; ch <= 'Z'; ch++)
    printf("%c ", ch);
printf("\n");

【実行結果例】
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

※ 文字コードはASCIIとする

配列の添字をカウントアップする例

int data1[10], data2[10];

for(int i = 0; i < 10; i++) {
    data1[i] = i;
    data2[i] = data1[i] * 2;
    printf("data1[%d] = %d, data2[%d] = %d\n", i, data1[i], i, data2[i]);
}

【実行結果例】
data1[0] = 0, data2[0] = 0
data1[1] = 1, data2[1] = 2
data1[2] = 2, data2[2] = 4
data1[3] = 3, data2[3] = 6
data1[4] = 4, data2[4] = 8
data1[5] = 5, data2[5] = 10
data1[6] = 6, data2[6] = 12
data1[7] = 7, data2[7] = 14
data1[8] = 8, data2[8] = 16
data1[9] = 9, data2[9] = 18

〇 演習問題

次のフローチャートに基づいてプログラムを作成しなさい。

問1

【実行結果例】
総和=5050

問2

【実行結果例】
a[]= 0 2 4 6 8

問3

【実行結果例】
100 は 100 で割り切れる 100 は 50 で割り切れる 100 は 25 で割り切れる 100 は 20 で割り切れる 100 は 10 で割り切れる 100 は 5 で割り切れる 100 は 4 で割り切れる 100 は 2 で割り切れる 100 は 1 で割り切れる

解答例

// 問1
#include <stdio.h>

int main(void)
{
    int wa = 0;
    for (int i = 1; i <= 100; i++) {
        wa = wa + i;
    }
    printf("総和 = %d\n", wa);

    return 0;
}
// 問2
#include <stdio.h>

int main(void)
{
    int a[5];

    printf("a[]=");
    for (int i = 0; i < 5; i++) {
        a[i] = i * 2;
        printf(" %d", a[i]);
    }
    printf("\n");

    return 0;
}
// 問3
#include <stdio.h>

int main( void )
{
    int amari;

    for (int i = 100; i >= 1; i--) {
        amari = 100 % i;
        if (amari == 0) {
            printf("100は%dで割り切れる\n", i);
        }
    }
    return 0;
}

2. for文の多重ループ

forループの中に複数の forループが入る形です。特に、forループの中に1つのforループが入るものを「for文の二重ループ」と呼びます。

(1) for文の二重ループの記述方法

【書き方】
for (初期設定式1; 継続条件式1; 再設定式1) {
  for (初期設定式2; 継続条件式2; 再設定式2) {
    文;
  }
}

  • forループ1 の中で forループ2 が繰り返されることに注意
  • つまり、forループ1 の 1回の処理に対して、forループ2 は最後まで回りきる。

【フローチャート】

// *10個を5回表示する例
#include <stdio.h>

int main(void)
{
    // <ループ1> 改行しながらループ2を5回繰り返す
    for (int n = 1; n <= 5; n++) {
        // <ループ2> *を10個横方向に表示
        for (int i = 1; i <= 10; i++) {
            printf("*"); 
        }
        printf("\n");
    }

    return 0; 
}

【実行結果例】

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

〇 演習問題

問1

次のフローチャートに基づいてプログラムを作成しなさい。

【実行結果例】

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

問2

0~9 までの数字を、0 から1個ずつ増やしながら 10行表示しなさい。
ただし、for文を二重に用いて表示すること。

【実行結果例】
0
01
012
0123
01234
012345
0123456
01234567
012345678
0123456789

問3

実行結果例のようになるように、九九の表を for文の二重ループを用いて作成しなさい。

【実行結果例】

   * * * 九九 * * *
   |  1  2  3  4  5  6  7  8  9
--------------------------------
1  |  1  2  3  4  5  6  7  8  9
2  |  2  4  6  8 10 12 14 16 18
3  |  3  6  9 12 15 18 21 24 27
4  |  4  8 12 16 20 24 28 32 36
5  |  5 10 15 20 25 30 35 40 45
6  |  6 12 18 24 30 36 42 48 54
7  |  7 14 21 28 35 42 49 56 63
8  |  8 16 24 32 40 48 56 64 72
9  |  9 18 27 36 45 54 63 72 81

解答例

// 問1
#include <stdio.h>

int main(void)
{
    for (int n = 0; n < 10; n++) {
        for (int i = 0; i <= n; i++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
// 問2
#include <stdio.h>

int main(void)
{
    for (int n = 0; n < 10; n++) {
        for (int i = 0; i <= n; i++) {
            printf("%d", i);
        }
        printf("\n");
    }
    return 0;
}
// 問3
#include <stdio.h>

int main(void)
{
    // タイトル出力
    printf("\n   * * * 九九 * * *\n");
    printf("   |");
    for (int i = 1; i <= 9; i++) {     // 上部の数字
        printf("%3d", i);
    }

    printf("\n--------------------------------\n");

    // 九九の出力
    for (int x = 1; x <= 9; x++) {
        printf("%d  |", x);            // 左の数字
        for (int y = 1; y <= 9; y++) {
            printf("%3d", x * y);      // 九九
        }
        printf("\n");
    }
    return 0;
}

コメント