c语言:计算输入字符个数

近日再看《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();
}

不擅长写作,文章仅供参考,如有错误请指正。

posted @ 2011-10-27 15:39  fhefh  阅读(11325)  评论(2编辑  收藏  举报