K&R 演習1-13 解答 (プログラミング言語C 第2版)

スポンサーリンク

鍛錬 166

K&R 演習1-13 解答 (プログラミング言語C 第2版)

「入力した単語の長さをヒストグラム(度数分布図)にしてプリントするプログラムを書け」という問題です。
 
プログラム

以下は、入力した単語の長さをヒストグラム(度数分布図)にしてプリントするプログラム kr_1_13.c です。

#include <stdio.h>

#define MAX_LEN 16  // 入力可能な単語の最大長

int main(void)
{
	int list[256];          // リスト
	int view[MAX_LEN + 1];  // 表示用
	int max_len;
	int len;
	int c;
	int list_count;
	int i, n;
	
	// 入力可能な単語の長さを 0 ~ MAX_LEN の範囲にするため
	max_len = MAX_LEN + 1;
	
	// 初期化
	for (i = 0;i < 256; ++i)
		list[i] = 0;
	for (i = 0;i < max_len; ++i)
		view[i] = 0;
	
	// 単語を入力してリストに格納
	len = 0;
	list_count = 0;
	while ((c = getchar()) != EOF) {
		if (c == ' ' || c == '\n' || c == '\t' || c == '@') {
			// '@' は入力終了とみなす
			if (c == '@')
				break;
			list[list_count] = len;
			++list_count;
			len = 0;
		}
		else {
			// 単語の長さが指定した範囲を超過する場合
			if (len >= MAX_LEN) {
				printf("ERROR,単語の長さは %d 文字以下で入力してください\n", MAX_LEN);
				// ストリームに存在する残りの文字を破棄
				while ((c = getchar()) != EOF) {
					if (c == ' ' || c == '\n' || c == '\t' || c == '@')
						break;
				}
				len = 0;
			}
			else
				++len;
		}
	}
	
	// 表示用配列を操作
	for (i = 0; i < list_count; ++i) {
		c = list[i];
		++view;
	}
	
	printf("\n");
	printf("------------------------------------------\n");
	for (i = 0; i < max_len; ++i) {
		printf("%3d |", i);
		for (n = 0; n < view[i]; ++n)
			printf("*");
		printf("\n");
	}
	printf("------------------------------------------\n");
	
	return 0;
}

 
実行結果

以下は、プログラム kr_1_13.c を実行し、次に示す順序で単語を入力しています。

※ 本プログラム kr_1_13.c では ‘@’ が入力されると、入力終了とみなされます(Ctrl+d で EOF が入力された場合も、入力終了とみなされます)。

※ 入力可能な単語の最大長さを、プログラム中にて 16 に設定しているため、17 文字以上が入力されるとエラーとなり、その単語はカウントされません。

入力した単語

入力順序 単語 文字数
1 apple 5
2 orange 6
3 grape 5
4 egg 3
5 strawberry 10
6 civilization 12
7 改行のみ 0
8 congratulations 15
9 extracurriculars 16
10 demineralizations 17
11 peach 5
12 melon 5
13 @  

 

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_1_13.c -o kr_1_13
***@ubuntu:~/***/test/c$ ./kr_1_13
apple
orange
grape
egg
strawberry
civilization

congratulations
extracurriculars
demineralizations
ERROR,単語の長さは 16 文字以下で入力してください
peach
melon
@

------------------------------------------
  0 |*
  1 |
  2 |
  3 |*
  4 |
  5 |****
  6 |*
  7 |
  8 |
  9 |
 10 |*
 11 |
 12 |*
 13 |
 14 |
 15 |*
 16 |*
------------------------------------------

 
上記に示した通り、単語の長さによる分類は以下の通りです。

単語の長さ 個数
0 1
1 0
2 0
3 1
4 0
5 4
6 1
7 0
8 0
9 0
10 1
11 0
12 1
13 0
14 0
15 1
16 1
タイトルとURLをコピーしました