The C Programming Language 学习(4)——单词统计直方图

第一章练习1-13,输入一段文字,要求打印输入单词长度的直方图。定义MAXL为单词最大长度,MAXH为单词的最大出现次数;可以用数组nlen[MAXL+1]记录每种长度单词出现的次数,二维数组hist[MAXH][MAXL+1]记录直方图。

这里判断单词,采用了书中的弱规则,即空白符(空格、tab、回车)作为单词的分隔,其他符号都当作单词。完整的程序如下:

#include<stdio.h>
#define MAXH 15  //单词出现的最大次数 
#define MAXL 12  //单词的最大长度 
#define IN  1   //输入字符在单词内 
#define OUT 0   //输入字符在单词外 
int nlen[MAXL+1],hist[MAXH][MAXL+1];//单词出现次数,直方图二维数组 
main() {
/*循环控制变量,字符,字符数,单词状态,单词出现的最大次数*/	
	int i,j,c,nc,state,max;
	state=OUT;
	nc=0;
	while((c=getchar())!=EOF) {
		if(c==' '||c=='\t'||c=='\n') {
			if(state==IN) {
				++nlen[nc];//记录长度为nc的单词出现次数 
				nc=0;
			}
			state=OUT;
		} else {
			++nc;//记录单词的长度 
			if(state==OUT)
				state=IN;
		}
	}
	max=nlen[1];
	for(i=2; i<=MAXL; i++)
		if(max<nlen[i])
			max=nlen[i];//计算单词出现的最大次数 
	for(i=1; i<=MAXL; i++)//生成直方图 
		for(j=0; j<max; j++) {
			if(nlen[i]>j)
				hist[max-1-j][i]='*';//在单词出现的位置记* 
			else
				hist[max-1-j][i]=' ';//没有出现的位置记空格 
		}
	for(i=0; i<max; i++) {//输出直方图垂直方向 
		for(j=1; j<=MAXL; j++)
			printf("%c ",hist[i][j]);
		printf("\n");
	}
	for(i=1; i<=MAXL; i++)//输出水平坐标 
		printf("%i ",i);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值