第8回
制御構造と変数(4)~forとwhileによる繰り返し(反復)処理

似たような処理の繰り返し

制御構造には、ifとswitch caseによる条件判定と分岐の他に、同じ処理を何度も繰り返す反復の構造があります。Cではfor、while、do whileの3つの命令が用意されています。

九九のプログラム

まずforから紹介していきましょう。サンプルとして、九九を表示するプログラムを作ってみます。キーボードから1~9までの数値を1つ入力したら、その段の九九を表示する──というシンプルなものです。

最初は、制御構造を使わないでソースを書いてみます。リスト1(ex0801.c)のようになります。

scanf関数で変数numに値を受け取り、それに基づいて“num * 1、num * 2……”と、printf関数で九九の結果を表示していくだけです。実行結果は画面1のようになります(実行形式ファイルex0801.exeが“D:\Data\CLANG\EXE”フォルダに保存されている状態で実行しています)。

リスト1:制御構造を使わない九九のプログラム(ex0801.cex0801.exe)
#include <stdio.h>

int	main(void)
{
	int num;    /* 基本の数値 */

	/* 基本の数値を受け取る */
	printf("Input Base number(1-9) : ");
	scanf("%d", &num);
    /* x1 ~ x9 までの計算結果を表示*/
	printf("%d x %d = %d\n", num, 1, num * 1);
	printf("%d x %d = %d\n", num, 2, num * 2);
	printf("%d x %d = %d\n", num, 3, num * 3);
	printf("%d x %d = %d\n", num, 4, num * 4);
	printf("%d x %d = %d\n", num, 5, num * 5);
	printf("%d x %d = %d\n", num, 6, num * 6);
	printf("%d x %d = %d\n", num, 7, num * 7);
	printf("%d x %d = %d\n", num, 8, num * 8);
	printf("%d x %d = %d\n", num, 9, num * 9);

	return (0);
}


本当は値のチェックが必要

このようなプログラムでは、本来なら、入力された値が1~9の範囲外だったときのために、以下のような値のチェック処理を挿入しておいた方がいいでしょう。が、ここではソースを分かりやすくするために、値のチェックを省略します。
printf("Input Base number(1-9) : ");
scanf("%d", &num);             /* 値を入力 */
if ((num < 1) || (num > 9)) {  /* 1~9以外なら終了 */
  printf("1~9までの値を入力してください。\n");
  return (-1);
}

forを使って書き直す

リスト1を見れば、
printf("%d x %d = %d\n", num, 1, num * 1);
printf("%d x %d = %d\n", num, 2, num * 2);
printf("%d x %d = %d\n", num, 3, num * 3);
              :
と、似たようなコードが9行続くことが分かります。入力された値を、それぞれ×1、×2、×3……と、順に計算して結果を表示している部分です。

この9行は、定数として用いている1~9の部分が異なるだけで、後はまったく同じ形式です。

forを使って反復の構造を作れば、この部分はリスト2のような単純なコードに書き換えられます。

リスト2:forを使って書き直した九九のプログラム(ex0802.cex0802.exe)
#include <stdio.h>

int	main(void)
{
	int i;
	int num;

	/* 基本の数値を受け取る */
	printf("Input Base number : ");
	scanf("%d", &num);

	/* x1 ~ x9 まで計算を繰り返す */
	for (i=1; i<=9; i++) {
		printf("%d x %d = %d\n", num, i, num*i);
	}
	return (0);
}