本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。
第6回 | C言語のfor文と繰り返し処理を学ぶ:同じ処理をまとめて実行する| UNIX Cafe

はじめての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 は列番号です。i と j が同じ場所だけ黒いマスを表示しています。つまり、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.c と square_r.c の違いは、ほとんど if 文の条件だけです。それでも、表示される模様は大きく変わります。プログラミングでは、このように「少し条件を変えるだけで、結果が変わる」瞬間がよくあります。
自分で改造してみよう
サンプルが動いたら、少しだけ条件を変えて遊んでみましょう。
i == jをi < jに変えるとどうなるかi + j == 9をi + 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.cとsquare_r.cを組み合わせて、Xの形を表示する
Xの形を作るには、i == j と i + j == 9 のどちらかが成り立つときに黒いマスを表示します。C言語では、どちらかの条件が成り立つことを if (i == j || i + j == 9) のように || で表します。前回学んだ if 文と、今回の for 文がつながる練習です。
まとめ
今回のポイントは次のとおりです。
for文を使うと、回数を決めた繰り返し処理を書けるfor(初期化; 条件式; 更新) の形で書くi++は値を1増やす操作であるfor文の中にfor文を書くと、行と列のような表現ができるif文と組み合わせると、数字の表示だけでなく模様も作れる
for 文は、同じ処理をまとめて実行するための道具です。最初は数字を表示するだけでも、少し進むと、画面に線や模様を描けるようになります。プログラムは無機質な暗記ではなく、自分でルールを作り、結果を見て、また変えていく楽しい実験です。
次回予告
次回は、while 文を使った繰り返し処理に進みます。「条件が成り立つ間、処理を続ける」という考え方を、for 文との違いを意識しながら見ていきましょう。
復習してみよう
復習したい方は、こちらもあわせてご覧ください。













