第一章练习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);
}