您的位置:首页 > 其它

打印输入中单词长度的直方图

2011-04-14 15:28 309 查看
源于《The C Programming Language》P17 pr1-13:

编写一个程序,打印输入中单词长度的直方图。

代码:

/**************************************************************
直方图定义:
n:某个长度单词出现的次数(长度为4的单词出现了9次,则n = 9)
M:出现最频繁的长度的次数
H:定义的直方图的最大长度(本例中为MAXHIST)
**************************************************************/

#include <stdio.h>

#define	MAXHIST	15		//直方图的最大长度
#define	MAXWORD	11		//单词的最大长度
#define	IN	1		//在单词中
#define	OUT	0		//在单词外

int main()
{

int c, i, nc, state;	//nc:单词的长度
int len;		//直方图中每个直方条的长度
int maxvalue;		//wl数组的最大值
int ovflow;		//长度大于或等于MAXWORD的单词的数量
int wl[MAXWORD];	//按单词长度值0~11,统计输入中各长度的单词数,存放在wl数组中

state = OUT;
nc = 0;
ovflow = 0;
for(i = 0; i < MAXWORD; ++i)
wl[i] = 0;

while((c = getchar()) != EOF)
if(c == ' ' || c == '/n' || c == '/t')
{
state = OUT;
if(nc > 0)
if(nc < MAXWORD)
++wl[nc];
else
++ovflow;
nc = 0;
}
else if(state == OUT)
{
state = IN;
nc = 1;
}
else
++nc;

maxvalue = 0;
for(i = 1; i < MAXWORD; ++i)
if(wl[i] > maxvalue)
maxvalue = wl[i];
for(i = 1; i < MAXWORD; ++i)
{
printf("%5d - %5d : ", i, wl[i]);
if(wl[i] > 0)
{
if((len = wl[i] * MAXHIST / maxvalue) <= 0)
len = 1;
}
else
len = 0;
while(len > 0)
{
putchar('*');
--len;
}
putchar('/n');
}
if(ovflow > 0)
printf("there are %d words >= %d/n", ovflow, MAXWORD);

return 0;

}


分析:

1, 费了点时间读懂了题目,本题中的单词长度直方图的理解:

错误:“单词 - 长度”模式

例如: fuck - ****

teaching - ********

i - *

good - ****

正确:用直方图表示长度为n的单词数占总单词数的比例

2, 用数组wl存储长度从1~10的单词的个数,如上例,wl[1] = 1, wl[4] = 2, wl[8] = 1

3, len = wl[i] * MAXHIST / maxvalue; len:表示长度为i的单词数占总单词数的比例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐