WwangHB 发表于 2020-1-10 04:21:25

编写一个程序,打印输入中单词长度直方图第一部分统计单词长度

#include <stdio.h>

#define OUT 0
#define IN 1

int main()
{
        int i, ch, quantity, j, k, state;
        int number;
       
        for(i = 0; i < 10; ++i)
                number = 0;
       
        quantity = 0;
        state = OUT;
        while((ch = getchar()) != EOF){
                if(ch != ' ' || ch != '/n' || ch != '/t'){
                        state = IN;                                               
                        quantity++;                                        //统计单词字符数
                }
                else
                        state = OUT;                                                        //一个单词结束
                if(state == OUT){
                        if(quantity >= '0' && quantity <= '9')        //将单词字符数储存在数组里
                                ++number;
                                quantity = 0;
                }
        }
                printf("digits =");
                for (i = 0; i < 10; ++i)
                        printf(" %d", number);

}

sunrise085 发表于 2020-1-10 09:53:35

本帖最后由 sunrise085 于 2020-1-10 12:24 编辑

不知道你要完成什么功能。数组number中存储的是每个单词的字符数,还是不同长度的单词个数。反正不管是哪一种,你的程序都完成不了这项功能。
1、将单词字符数储存在数组里,这个if模块有很大的问题。quantity是一个单词的长度,你拿它和‘0’以及‘9’比较深什么鬼?‘0’的值是48,‘9’的值58,很少有这么长的单词吧。你是要达到什么目的?
2、统计单词字符数的if判断条件应该用与(&&)而不是或(||),另外,回车和tab中的斜杠写错了。
3、你的程序不会将最后一个单词统计进去,以你为最后一个单词结束的时候,getchar()获得的值是EOF,直接跳出循环了,不会进入   将单词字符数储存在数组里   这个循环。
帮你修改了一下不知道是否是你需要的功能,你也没说清你的要求。。。
#include <stdio.h>
#define OUT 0
#define IN 1

int main()
{
    int i, quantity, j, k, state;
    char ch;
    int number;
      
    for(i = 0; i < 10; ++i)
      number = 0;
    quantity = 0,j = 0;
    state = IN;
    while((ch = getchar()) != EOF and j<10){
      if(ch != ' ' && ch != '\n' && ch != '\t'){
            quantity++;                           //统计单词字符数
      }
      else
            state = OUT;                            //一个单词结束
      if(state == OUT){
            number=quantity;         //将单词字符数储存在数组里
            quantity = 0;
            state = IN;
      }
    }
    if(j<=10)
      number=quantity;
    printf("digits =");
    for (i = 0; i < 10; ++i)
      printf(" %d", number);
    return 0;
}

WwangHB 发表于 2020-1-10 14:02:08

sunrise085 发表于 2020-1-10 09:53
不知道你要完成什么功能。数组number中存储的是每个单词的字符数,还是不同长度的单词个数。反正不管是哪一 ...

谢谢大佬啦,是我没说清楚,我想用number储存每个长度得单词分别有几个,还有个问题,我在看c程序设计里有一个例子其中解释是这样的:

if (c >= '0' && c <= '9')
用于判断c中得字符是否为数字。如果他是数字,那么该数字对应的值是c-'0'

这里得'0'到'9'为什么能代表数字而不是被翻译到ASCII表里得特殊符号

sunrise085 发表于 2020-1-10 15:03:37

WwangHB 发表于 2020-1-10 14:02
谢谢大佬啦,是我没说清楚,我想用number储存每个长度得单词分别有几个,还有个问题,我在看c程序设计里 ...

判断c中的字符是否为数字,首先c要是字符char类型。你的程序中quantity是整型int啊!
若c是char类型,if (c >= '0' && c <= '9')是能够判断c是否为数字。
你需要统计每个长度的单词的个数,用number是不够的,长度超过10的单词也是有的。我一会儿帮你看看怎么写

sunrise085 发表于 2020-1-10 16:11:36

本帖最后由 sunrise085 于 2020-1-10 16:14 编辑

WwangHB 发表于 2020-1-10 14:02
谢谢大佬啦,是我没说清楚,我想用number储存每个长度得单词分别有几个,还有个问题,我在看c程序设计里 ...

#include <stdio.h>
#include <malloc.h>   //这个头文件必须要有,动态创建数组需要用到
#define OUT 0
#define IN 1

int main()
{
    int i, quantity, max, j, k, state;
    char ch;
    int* number = (int*)malloc(sizeof(int)*2);//不知道数组长度,动态创建数组,数组下标= 单词长度-1
    max=2;
    for(i = 0; i < max; i++)
      *(number+i) = 0;
    quantity = 0;
    state = IN;
    while((ch = getchar()) != EOF){
      if(ch != ' ' && ch != '\n' && ch != '\t'){
            quantity++;                           //统计单词字符数
      }
      else
            state = OUT;                            //一个单词结束
      if(state == OUT){
            if(quantity>max){         //该单词太长,原数组长度不够,动态扩充数组长度
                number==(int *)realloc(number,max*sizeof(int));
                for(i = max; i < quantity;i++)//扩充的部分数组赋初值
                  number = 0;
                max=quantity;
            }
            number++;         //数组中对应长度的计数值+1
            quantity = 0;
            state = IN;
      }
    }
    //以下几行是将最后统计的一个单词添加到对应的计数值中。这几行代码和上面 if(state == OUT)模块中的基本一样
    if(quantity>max){
      number==(int *)realloc(number,max*sizeof(int));
      for(i = max; i < quantity;i++)
            number = 0;
      max=quantity;
    }
    number++;
   
    printf("统计结果:\n");
    for (i = 0; i < max; ++i)
      printf("长度为%d的单词有 %d个.\n", i+1,number);
    return 0;
}

心驰神往 发表于 2020-11-3 13:50:18

{:10_254:}
页: [1]
查看完整版本: 编写一个程序,打印输入中单词长度直方图第一部分统计单词长度