近日再看《c语言程序设计第二版》,做了一下上面的习题。
1.编写程序,打印出输入中单词长度的直方图。
先来说第一题,没输入一个一个单词后,你就要出入一个空格,接着输入一个单词,在输入一个空格,依此循环输入。当一个句子输入完了,就需要隔行另起一段。
例:
i am a studen
第1个单词长度为1
第2个单词长度为2
第3个单词长度为1
第4个单词长度为6
但是,当每输入完一个单词的时候需要用空格隔开,然后在输入,编写的过程,要判断,详情看代码。
通过维基百科查询,目前最长单词的长度为30,有个很长的大概是225多个字母,不过我向我们一般也用不着它。
将最长字母长度MAXWORD设置为30,如果你喜欢你可以设置成任意长度
建立单词长度数组word length,简称为wl[].
数组最大为wl[MAXWORLD]
将单词长度数组中的值全部值为0
int i;
for(i = 1; i <= MAXWORD; i++)
wl[i] = 0;
为什么要这样做?
我遇到这个题目的时候是这么想的,每输入一个单词,将其长度放入数组中保存着。
于是,我就写呀写呀,写了好长时间。
后来我就没写了,翻了下原来的笔记,看看了,原来可以这么想,一下子事情变得简单多了。
我将长度为1~30的字母,分别归类长度为1的、长度为2、长度为3等等,然后将其放入数组,让它们保存着。
例:
internet 这个单词长度为8,我就将其放入数组wl[8],
如果还有相同长度放入wl[8]中,wl[8]的值就得+1啦。
所以该写成++wl[8]。
现在思路明白了,我们可以这么写了。
#include <stdio.h>
#define MAXWORD 30 //单词的最大长度
#define IN 1 //在单词内,即没有遇到空格
#define OUT 0 //在单词外,即遇到了空格
/*word length ==> wl单词长度简称*/
int wl()
{
char c;
int i;
int nc;
int state; //state为单词的状态:IN或OUT;
int overflow; //操过MAXWORD的单词个数
int wl[MAXWORD]; //长度为1~30的的字符长度统计
state = OUT;
nc = 0;
overflow = 0;
for(i = 1; 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
++overflow;
nc = 0;
}
else if(state == OUT)
{
state = IN;
nc = 1;
}
else
++nc;
for(i = 1; i < MAXWORD; ++i)
printf("长度为:%d的单词个数为:%d : \n\n", i, wl[i]);
return 0;
}
main()
{
wl();
}
不擅长写作,文章仅供参考,如有错误请指正。