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

スポンサーリンク

鍛錬 171

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

「入力中の異なる文字の頻度をヒストグラムにプリントするプログラムを書け」という問題です。
 
プログラム

以下は、入力中の異なる文字の頻度をヒストグラムにプリントするプログラム kr_1_14.c です。

#include <stdio.h>

int main(void)
{
	int list[256];  // リスト
	int view[256];  // 表示用
	int c;
	int state;      // 状態
	int exist;
	int not_exist;
	int list_count;
	int i, n, m;
	
	// 初期化(配列)
	for (i = 0;i < 256; ++i)
		list[i] = 0;
	for (i = 0;i < 256; ++i)
		view[i] = 0;
	
	// 初期化(リストの存在確認)
	exist = 1;      // リストに存在する
	not_exist = 0;  // リストに存在しない
	
	list_count = 0;
	while ((c = getchar()) != EOF) {
		// '@' は入力終了とみなす
		if (c == '@')
			break;
		
		// ' ' , '\n' , '\t' はカウントしない
		if (c == ' ' || c == '\n' || c == '\t') {
			;
		}
		else {
			// 状態を[リストに存在しない]に設定
			state = not_exist;
			
			for (i = 0; i < list_count; ++i) {
				// 入力した文字がリストに存在する場合
				if (c == list[i]) {
					// リストに格納されている文字の頻度を更新
					++view[i];
					
					printf("\n");
					printf("--------------------\n");
					for (n = 0; n < list_count; ++n) {
						c = list[n];
						printf(" ");
						putchar(c);
						printf(" |");
						for (m = 0; m < view[n]; ++m)
							printf("*");
						printf("\n");
					}
					printf("--------------------\n");
					printf("\n");
					
					// 状態を[リストに存在する]に設定
					state = exist;
					
					break;
				}
			}
			// 状態が[リストに存在しない]の場合
			if (state == not_exist) {
				// リストに文字を格納
				list[list_count] = c;
				
				// リストに格納した文字の頻度を更新
				++view[list_count];
				
				++list_count;
				
				printf("\n");
				printf("--------------------\n");
				for (n = 0; n < list_count; ++n) {
					c = list[n];
					printf(" ");
					putchar(c);
					printf(" |");
					for (m = 0; m < view[n]; ++m)
						printf("*");
					printf("\n");
				}
				printf("--------------------\n");
				printf("\n");
			}
		}
	}
	
	return 0;
}

 
実行結果

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

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

入力した文字

入力順序 文字
1 a
2 b
3 c
4 c
5 c
6 =
7 #
8 (
9 (
10 (
11 )
12 ?
13 ABC
14 ABC
15 ABC
16 @

 

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_1_14.c -o kr_1_14
***@ubuntu:~/***/test/c$ ./kr_1_14
a

--------------------
 a |*
--------------------

b

--------------------
 a |*
 b |*
--------------------

c

--------------------
 a |*
 b |*
 c |*
--------------------

c

--------------------
 a |*
 b |*
 c |**
--------------------

c

--------------------
 a |*
 b |*
 c |***
--------------------

=

--------------------
 a |*
 b |*
 c |***
 = |*
--------------------

#

--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
--------------------

(

--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |*
--------------------

(

--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |**
--------------------

(

--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
--------------------

)

--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
--------------------

?

--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
--------------------

ABC

--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
 A |*
--------------------


--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
 A |*
 B |*
--------------------


--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
 A |*
 B |*
 C |*
--------------------

ABC

--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
 A |**
 B |*
 C |*
--------------------


--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
 A |**
 B |**
 C |*
--------------------


--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
 A |**
 B |**
 C |**
--------------------

ABC

--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
 A |***
 B |**
 C |**
--------------------


--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
 A |***
 B |***
 C |**
--------------------


--------------------
 a |*
 b |*
 c |***
 = |*
 # |*
 ( |***
 ) |*
 ? |*
 A |***
 B |***
 C |***
--------------------

@
タイトルとURLをコピーしました