第6回 | C言語のfor文と繰り返し処理を学ぶ:同じ処理をまとめて実行する| UNIX Cafe

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第6回|C言語のfor文と繰り返し処理を学ぶ:同じ処理をまとめて実行する

はじめてのC言語 | 第6回

目次

はじめに

前回は、if 文を使って「条件によって処理を分ける」方法を学びました。今回は、同じ処理を何度も実行する for 文 を扱います。

繰り返し処理というと、最初は少し機械的に感じるかもしれません。でも、for 文を使えるようになると、数字を順番に表示するだけでなく、ターミナルの画面に模様を描いたり、表を作ったり、ゲームの盤面のようなものを表示したりできます。

プログラムは、ただ命令を並べるだけのものではありません。少しルールを変えるだけで、画面に出てくる結果が変わります。その変化を自分の手で作れるところが、プログラミングの楽しいところです。

この回の目的は次の4点です。

  • for 文の基本形を理解する
  • 回数を指定した繰り返しを書けるようにする
  • カウンタ変数の役割を知る
  • for 文と if 文を組み合わせて、簡単な模様を描く

繰り返し処理とは何か

繰り返し処理とは、同じような処理を何度も実行することです。

たとえば、次のような場面で使います。

  • 1から10まで順に表示する
  • 同じメッセージを何回か表示する
  • 条件を満たす値だけを表示する
  • 10行×10列のマス目を作る

C言語では、こうした処理を for 文で書けます。

for 文の基本形

for 文は、次の形で書きます。

for (初期化; 条件式; 更新) {
    繰り返す処理;
}

それぞれの意味は次のとおりです。

  • 初期化: 最初に1回だけ実行する
  • 条件式: 条件が成り立つ間、繰り返す
  • 更新: 1回の処理が終わるごとに実行する

まずは、1から5まで表示する小さなプログラムを書いてみましょう。

#include <stdio.h>

int main(void) {
    int i;

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

    return 0;
}

このコードは、たとえば for_count.c という名前で保存します。保存したら、ターミナルで clang for_count.c -o for_count を実行し、./for_count で動かします。

実行結果:

1
2
3
4
5

コードの読み方

int i;

繰り返しの回数を管理するための変数を用意しています。このような変数を カウンタ変数 と呼びます。

for (i = 1; i <= 5; i++)

この部分が for 文の中心です。

  • i = 1 : 最初に i を 1 にする
  • i <= 5 : i が 5 以下の間、繰り返す
  • i++ : 1回の処理が終わるごとに i を 1 増やす

i++ は、この例では次の書き方と同じ働きをします。

i = i + 1;

for 文では、カウンタを1ずつ進める目的でよく使います。

0から始める書き方

C言語では、0から数え始める書き方もよく使います。

#include <stdio.h>

int main(void) {
    int i;

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

    return 0;
}

実行結果:

0
1
2
3
4

この場合、条件式が i < 5 なので 5 は表示されません。0, 1, 2, 3, 4 の5回分だけ繰り返します。

for 文と if 文を組み合わせる

for 文の中で if 文を使うと、「繰り返しながら、条件に合うときだけ処理を変える」ことができます。

たとえば、1から10まで調べて、偶数だけを表示するプログラムは次のように書けます。

#include <stdio.h>

int main(void) {
    int i;

    for (i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            printf("%d\n", i);
        }
    }

    return 0;
}

実行結果:

2
4
6
8
10

% は、割り算の余りを求める演算子です。i % 2 == 0 は「i を 2 で割った余りが 0」、つまり偶数かどうかを調べています。

for で遊んでみる:マス目を描いてみよう

ここまでの例では、数字や文字を縦に表示してきました。次は、for 文を2つ組み合わせて、10行×10列のマス目を作ってみます。

外側の for 文で「行」を進め、内側の for 文で「列」を進めます。このように for 文の中に for 文を書く形を、二重ループと呼びます。

for (i = 0; i < 10; i++) {
    for (j = 0; j < 10; j++) {
        1マス分を表示する;
    }
    printf("\n");
}

内側の for 文が1行分のマスを表示し終えたら、printf("\n"); で改行します。これで、画面上にマス目ができます。

サンプル1:左上から右下へ線を引く

まずは、square_l.cを見てみましょう。10×10のマス目に、左上から右下へ黒いマスを並べるプログラムです。

#include <stdio.h>

int main(void) {
    int i, j;

    for (i = 0; i < 10; i++) {
        for (j = 0; j < 10; j++) {
            if (i == j) {
                printf("◾️");
            } else {
                printf("◽️");
            }
        }
        printf("\n");
    }

    return 0;
}

コンパイルと実行:

clang square_l.c -o square_l
./square_l

実行結果:

◾️◽️◽️◽️◽️◽️◽️◽️◽️◽️
◽️◾️◽️◽️◽️◽️◽️◽️◽️◽️
◽️◽️◾️◽️◽️◽️◽️◽️◽️◽️
◽️◽️◽️◾️◽️◽️◽️◽️◽️◽️
◽️◽️◽️◽️◾️◽️◽️◽️◽️◽️
◽️◽️◽️◽️◽️◾️◽️◽️◽️◽️
◽️◽️◽️◽️◽️◽️◾️◽️◽️◽️
◽️◽️◽️◽️◽️◽️◽️◾️◽️◽️
◽️◽️◽️◽️◽️◽️◽️◽️◾️◽️
◽️◽️◽️◽️◽️◽️◽️◽️◽️◾️

ポイントは、次の条件です。

if (i == j)

i は行番号、j は列番号です。ij が同じ場所だけ黒いマスを表示しています。つまり、0行0列、1行1列、2行2列……という場所が黒くなります。

たった1つの条件で、画面に斜めの線が現れました。ここが、繰り返し処理のおもしろいところです。1マスずつ手で書いているわけではなく、ルールを1つ決めるだけで、プログラムが残りを作ってくれます。

サンプル2:右上から左下へ線を引く

次は、square_r.c です。今度は、右上から左下へ黒いマスを並べます。

#include <stdio.h>

int main(void) {
    int i, j;

    for (i = 0; i < 10; i++) {
        for (j = 0; j < 10; j++) {
            if (i + j == 9) {
                printf("◾️");
            } else {
                printf("◽️");
            }
        }
        printf("\n");
    }

    return 0;
}

コンパイルと実行:

clang square_r.c -o square_r
./square_r

実行結果:

◽️◽️◽️◽️◽️◽️◽️◽️◽️◾️
◽️◽️◽️◽️◽️◽️◽️◽️◾️◽️
◽️◽️◽️◽️◽️◽️◽️◾️◽️◽️
◽️◽️◽️◽️◽️◽️◾️◽️◽️◽️
◽️◽️◽️◽️◽️◾️◽️◽️◽️◽️
◽️◽️◽️◽️◾️◽️◽️◽️◽️◽️
◽️◽️◽️◾️◽️◽️◽️◽️◽️◽️
◽️◽️◾️◽️◽️◽️◽️◽️◽️◽️
◽️◾️◽️◽️◽️◽️◽️◽️◽️◽️
◾️◽️◽️◽️◽️◽️◽️◽️◽️◽️

ポイントは、次の条件です。

if (i + j == 9)

10×10のマス目では、行番号も列番号も 0 から 9 まで動きます。i + j が 9 になる場所だけを黒くすると、右上から左下へ斜めの線になります。

square_l.csquare_r.c の違いは、ほとんど if 文の条件だけです。それでも、表示される模様は大きく変わります。プログラミングでは、このように「少し条件を変えるだけで、結果が変わる」瞬間がよくあります。

自分で改造してみよう

サンプルが動いたら、少しだけ条件を変えて遊んでみましょう。

  • i == ji < j に変えるとどうなるか
  • i + j == 9i + j < 9 に変えるとどうなるか
  • 10 を 5 や 20 に変えると、マス目の大きさはどう変わるか
  • ◾️ と ◽️ 以外の文字に変えると、どんな雰囲気になるか

最初から正解を探す必要はありません。条件を変えて、コンパイルして、実行して、画面に出てきた結果を見る。この小さな実験の繰り返しが、プログラミングを楽しくしてくれます。

初心者がつまずきやすい点

=== を混同しない

= は代入、== は比較です。for 文の初期化では = を使い、if 文の条件では == を使います。

i = 0;              // i  0 を入れる
if (i == j) {       // i  j が等しいとき
    /* 処理 */
}

改行の位置を意識する

二重ループでは、printf("\n"); の位置が大切です。内側の for 文が終わったあとに改行すると、1行分の表示がきれいにまとまります。

for (i = 0; i < 10; i++) {
    for (j = 0; j < 10; j++) {
        printf("◽️");
    }
    printf("\n");
}

無限ループに注意する

更新を書き忘れると、条件がずっと成り立ったままになり、処理が終わらなくなることがあります。

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

この例では i が増えないため、i < 10 がずっと真のままになります。for 文では、初期化・条件式・更新の3つをセットで確認しましょう。

練習問題

余裕があれば、次の練習にも挑戦してみてください。

  • 1から10まで表示する
  • 1から20までの中で、3の倍数だけ表示する
  • 10×10のマス目をすべて白いマスで表示する
  • square_l.csquare_r.c を組み合わせて、Xの形を表示する

Xの形を作るには、i == ji + j == 9 のどちらかが成り立つときに黒いマスを表示します。C言語では、どちらかの条件が成り立つことを if (i == j || i + j == 9) のように || で表します。前回学んだ if 文と、今回の for 文がつながる練習です。

まとめ

今回のポイントは次のとおりです。

  • for 文を使うと、回数を決めた繰り返し処理を書ける
  • for (初期化; 条件式; 更新) の形で書く
  • i++ は値を1増やす操作である
  • for 文の中に for 文を書くと、行と列のような表現ができる
  • if 文と組み合わせると、数字の表示だけでなく模様も作れる

for 文は、同じ処理をまとめて実行するための道具です。最初は数字を表示するだけでも、少し進むと、画面に線や模様を描けるようになります。プログラムは無機質な暗記ではなく、自分でルールを作り、結果を見て、また変えていく楽しい実験です。

次回予告

次回は、while 文を使った繰り返し処理に進みます。「条件が成り立つ間、処理を続ける」という考え方を、for 文との違いを意識しながら見ていきましょう。

復習してみよう

復習したい方は、こちらもあわせてご覧ください。

C言語の次にUnityやUnreal Engineを学ぶ選択肢

用途ごとに選ぶ C言語のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

目次