《C程序设计语言》Brain&Dennis著 练习1-13

控制台打印垂直直方图


代码附上:


/* P15 1.6 数组*/
#include <stdio.h>

#define IN 1	/* 在单词内 */
#define OUT 0	/* 在单词外 */
#define ASCII_SIZE 127	/* ascii字符个数 */

void print_all_char_times(){
	/* 统计 数字、空白符、其他字符出现的次数 */
	int c, nwhite, nother;
	int ndigital[10];

	for(int i = 0 ; i < 10; i++)
		ndigital[i] = 0;
	nwhite = nother = 0;

	while( (c = getchar()) != EOF){
		if( c >= '0' && c <= '9')
			++ndigital[c-'0'];
		else if( c == '\t' || c == ' ' || c == '\n')
			++nwhite;
		else
			++nother;
	}

	printf("digitals = ");
	for (int i = 0; i < 10; ++i)
	{
		printf("%d ", ndigital[i]);
	}
	printf(", white space = %d , other = %d \n", nwhite,nother);
}

/* 练习1-13 */
void print_word_len_hist(){
	/* 打印单词长度的直方图 
	   假设单词长度不超过15个字符
	*/

	int c, len, state, minLen,maxLen,maxNum;	/* len存储每个单词的长度 */
	int nw[16];		/* nw[0]不存有效数据 */

	maxNum = 0;		/* 最多的长度个数 */
	maxLen = len = 0;
	minLen = 16;
	state = OUT;
	for(int i = 0 ; i < 16; i++){
		nw[i] = 0;
	}

	while(( c = getchar()) != EOF){
		if( c != ' ' && c != '\t' && c != '\n'){
			if(state == OUT){
				state = IN;
				len = 0;	/* 从新单词开始 */
			}
			if(state == IN)
				len++;		/* len <= 15 */
		}else{
			if(state == IN){
				state = OUT;
				nw[len]++;	/* 对应长度的单词个数加1 */
				if(maxNum < nw[len])
					maxNum = nw[len];
				if(len < minLen)
					minLen = len;
				else if(len > maxLen)
					maxLen = len;
			}
		}
	}
	
	printf("\n===================水平直方图=====================\n");
	/* 绘制水平方向的直方图,只绘制最小长度到最大长度之间的直方图 */
	for (int i = minLen; i <= maxLen ; ++i)
	{
		int num = nw[i];	/* 同一长度的单词数 */
		printf("%3d  ", i);		/* 纵坐标:单词长度 */
		for (int j = 0; j < num; ++j)
		{
			putchar('#');
		}
		putchar('\n');
	}

	printf("\n===================垂直直方图=====================\n");

	for(int i = maxNum; i > 0; i--){
		/* 从长度计数最多的(maxNum)开始,从上往下扫描。当前行i代表了,当前单词的长度个数,可理解为 值为i的一条水平扫描线
		   若某一个单词的计数大于等于i,说明该单词的个数超过了i的值,则打印‘  #’,否则说明计数没有达到i这条线,故输出空格
		 */
		for (int j = minLen; j <= maxLen; ++j)
		{/* 每一行从最小的长度开始到最大的长度,进行判断,该长度的单词计数,是否超过或达到了当前的线i */
			if(nw[j] >= i)
				printf("  #");
			else
				printf("   ");
		}
		putchar('\n');
	}

	/* 打印横坐标 */
	for (int j = minLen; j <= maxLen; ++j)
	{
		printf("%3d",j);
	}
	putchar('\n');
}

/* 练习1-14 */
void print_char_freq(){
	/* 打印各个字符出现频率的直方图 */

	int c;
	int num[ASCII_SIZE];	/* ascii总共有127个字符 */

	for (int i = 0; i < ASCII_SIZE; ++i)
	{
		num[i] = 0;
	}

	while((c = getchar()) != EOF){
		num[c]++;
	}

	/* 水平直方图,垂直直方图参照练习1-13 */
	/* 只打印有计数的字符 */
	for (int i = 0; i < ASCII_SIZE; ++i)
	{
		if(num[i] > 0){
			if( i == '\t')	/* 显示制表符与换行符 */
				printf(" \\t ");
			else if( i == '\n')
				printf(" \\n ");
			else printf("%3c ", i);
			for(int j = 0; j < num[i]; j++)
				printf("#");
			putchar('\n');
		}
	}
}

void main(){
	// print_all_char_times();
	print_word_len_hist();
	// print_char_freq();
}

效果如下(请忽略乱码问题):
运行截图

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本书是由C语言的设计者Brian W. Kernighan和Dennis M. Ritchie编写的一部介绍标准C语言及其程序设计方法的权威性经典作。全面、系统地讲述了C语言的各个特性及程序设计的基本方法,包括基本概念、类型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口、标准库等内容。   本书的讲述深入浅出,配合典型例证,通俗易懂,实用性强,适合作为大专院校计算机专业或非计算机专业的C语言教材,也可以作为从事计算机相关软硬件开发的技术人员的参考书。 在计算机发展的历史上,没有哪一种程序设计语言C语言这样应用如此广泛。   本书原 即为C语言的设计者之一Dennis M.Ritchie和名的计算机科学家Brian W.Kernighan合的 一本介绍C语言的权威经典作。我们现在见到的大量论述C语言程序设计的教材和专均以 此书为蓝本。原第1版中介绍的C语言成为后来广泛使用的C语言版本—— 标准C的基础。人们熟知的“hell, World”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设 计语言入门的第一课。 原第2版根据1987年制定的ANSIC标准做了适当的修订.引入了最新的语言形式,并增加了新的示例,通过简洁的描述、典型的示例,作者全面、系统、准确地讲述了C语言的各 个特性以及程序设计的基本方法。对于计算机从业人员来说,本书是一本必读的程序设计语 言方面的参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值