第9回
制御構造と変数(5)~forとwhileに関するあれこれ

九九プログラムと入出力の切り替え

forやwhileで構成した繰り返し構造──ループは、入れ子(ネスト)にできます。これを使って、九九をすべて表示するプログラムを作ってみましょう。結果が1画面を超えてしまうため、それへの対処も考えてみます。

ループの入れ子構造

前回はユーザーの入力した値に対して×1~×9までの計算を繰り返すようにしていましたが、ここでは1の段から9の段までまとめて計算するプログラムを作ってみます。

まず、入力された値をforを使って9回計算を繰り返す、前回のサンプルを見ておきましょう(第8回のリスト2~ex0802.c)。

以下のforループで変数numの値に対して9回の乗算を行っています。カウンタ変数iの値が乗数となり、1~9まで1ずつ増加する仕組みです。
for (i=1; i<=9; i++) {
	printf("%d x %d = %d\n", num, i, num*i);
}

九九をすべて表示するには、この計算をさらに9回繰り返さなければなりません。その代わり、ユーザーに入力を求めてその値を変数numに保存する処理(scanf関数を使った処理)は不要になります。

繰り返しが二重になるのでforループを入れ子にし、リスト2のようにすれば実現します。

リスト1:forを使って書き直した九九のプログラム(前回紹介したex0802.c)
#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);
}

リスト2:1の段から9の段まで九九を計算するプログラム(ex0901.cex0901.exe)
#include <stdio.h>

int	main(void)
{
	int i, j;

	for (i = 1; i <= 9; i++) {
	  printf("◆ %d の段\n", i);
	  for (j=1; j<=9; j++) {
		printf("%d x %d = %d\n", i, j, i * j);
	  }
	  printf("----------------\n", i);
	}
	return (0);
}

結果をファイルに書き出す

ex0901.cをコンパイルしてでき上がった実行形式ファイル(DOS版ではex0901.exe)を実行すると、画面表示はあっという間に上にスクロールして見えなくなり、最後の8の段と9の段あたりだけが残された状態になります。

これではプログラムが正常に動作したかどうか分からないので、以下のようにして処理結果をテキストファイルに保存してみましょう。
C:\>ex0901.exe > kuku.txt

アンダーラインの箇所で、ex0901.exeの出力(九九の表示)をカレントディレクトリ(現在起点としているフォルダ)のkuku.txtというテキストファイルに保存しています。kuku.txtの中には、リスト3のような形で九九が記録されています。

リスト3:リダイレクトによって保存したkuku.txtの中身(一部)
◆ 1 の段
1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
1 x 5 = 5
1 x 6 = 6
1 x 7 = 7
1 x 8 = 8
1 x 9 = 9
----------------
◆ 2 の段
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
----------------
◆ 3 の段
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
----------------
◆ 4 の段
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
    :

スクロールを一時停止する

この他、表示行が画面いっぱいになったら表示を一時停止し、何らかのキー(スペースやEnterなど)を押すとまた1画面分表示して停止……という形で、長い処理結果を画面単位で区切って表示する方法もあります。

C:\>ex0901.exe | more
moreはディスプレイに送られるデータをディスプレイの表示行(一般には25行)単位で区切って一時停止するプログラムで、DOSやUNIX系OSには標準で備わっています。もちろん、Windowsのコマンド プロンプトでも使えます。

1画面分表示すると最下行に“-- More --”と表示されて停止するので、ここでスペースキーなどを押すと画面がスクロールアップして次の画面が表示されます。最後まで表示されたらプログラムが終了します。