鱼C论坛

 找回密码
 立即注册
查看: 749|回复: 5

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

[复制链接]
回帖奖励 10 鱼币 回复本帖可获得 10 鱼币奖励! 每人限 1 次(中奖概率 80%)
发表于 2020-1-10 04:21:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>

  2. #define OUT 0
  3. #define IN 1

  4. int main()
  5. {
  6.         int i, ch, quantity, j, k, state;
  7.         int number[10];
  8.        
  9.         for(i = 0; i < 10; ++i)
  10.                 number[i] = 0;
  11.        
  12.         quantity = 0;
  13.         state = OUT;
  14.         while((ch = getchar()) != EOF){
  15.                 if(ch != ' ' || ch != '/n' || ch != '/t'){
  16.                         state = IN;                                               
  17.                         quantity++;                                        //统计单词字符数
  18.                 }
  19.                 else
  20.                         state = OUT;                                                        //一个单词结束
  21.                 if(state == OUT){
  22.                         if(quantity >= '0' && quantity <= '9')        //将单词字符数储存在数组里
  23.                                 ++number[quantity-'0'];
  24.                                 quantity = 0;
  25.                 }
  26.         }
  27.                 printf("digits =");
  28.                 for (i = 0; i < 10; ++i)
  29.                         printf(" %d", number[i]);

  30. }
复制代码
最佳答案
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,直接跳出循环了,不会进入   将单词字符数储存在数组里   这个循环。
帮你修改了一下不知道是否是你需要的功能,你也没说清你的要求。。。
  1. #include <stdio.h>
  2. #define OUT 0
  3. #define IN 1

  4. int main()
  5. {
  6.     int i, quantity, j, k, state;
  7.     char ch;
  8.     int number[10];
  9.         
  10.     for(i = 0; i < 10; ++i)
  11.         number[i] = 0;
  12.     quantity = 0,j = 0;
  13.     state = IN;
  14.     while((ch = getchar()) != EOF and j<10){
  15.         if(ch != ' ' && ch != '\n' && ch != '\t'){
  16.             quantity++;                             //统计单词字符数
  17.         }
  18.         else
  19.             state = OUT;                            //一个单词结束
  20.         if(state == OUT){
  21.             number[j++]=quantity;           //将单词字符数储存在数组里
  22.             quantity = 0;
  23.             state = IN;
  24.         }
  25.     }
  26.     if(j<=10)
  27.         number[j]=quantity;
  28.     printf("digits =");
  29.     for (i = 0; i < 10; ++i)
  30.         printf(" %d", number[i]);
  31.     return 0;
  32. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-10 09:53:35 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +10 鱼币

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

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

  4. int main()
  5. {
  6.     int i, quantity, j, k, state;
  7.     char ch;
  8.     int number[10];
  9.         
  10.     for(i = 0; i < 10; ++i)
  11.         number[i] = 0;
  12.     quantity = 0,j = 0;
  13.     state = IN;
  14.     while((ch = getchar()) != EOF and j<10){
  15.         if(ch != ' ' && ch != '\n' && ch != '\t'){
  16.             quantity++;                             //统计单词字符数
  17.         }
  18.         else
  19.             state = OUT;                            //一个单词结束
  20.         if(state == OUT){
  21.             number[j++]=quantity;           //将单词字符数储存在数组里
  22.             quantity = 0;
  23.             state = IN;
  24.         }
  25.     }
  26.     if(j<=10)
  27.         number[j]=quantity;
  28.     printf("digits =");
  29.     for (i = 0; i < 10; ++i)
  30.         printf(" %d", number[i]);
  31.     return 0;
  32. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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表里得特殊符号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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]是不够的,长度超过10的单词也是有的。我一会儿帮你看看怎么写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-10 16:11:36 | 显示全部楼层
本帖最后由 sunrise085 于 2020-1-10 16:14 编辑
WwangHB 发表于 2020-1-10 14:02
谢谢大佬啦,是我没说清楚,我想用number储存每个长度得单词分别有几个,还有个问题,我在看c程序设计里 ...

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

  5. int main()
  6. {
  7.     int i, quantity, max, j, k, state;
  8.     char ch;
  9.     int* number = (int*)malloc(sizeof(int)*2);//不知道数组长度,动态创建数组,数组下标= 单词长度-1
  10.     max=2;
  11.     for(i = 0; i < max; i++)
  12.         *(number+i) = 0;
  13.     quantity = 0;
  14.     state = IN;
  15.     while((ch = getchar()) != EOF){
  16.         if(ch != ' ' && ch != '\n' && ch != '\t'){
  17.             quantity++;                             //统计单词字符数
  18.         }
  19.         else
  20.             state = OUT;                            //一个单词结束
  21.         if(state == OUT){
  22.             if(quantity>max){           //该单词太长,原数组长度不够,动态扩充数组长度
  23.                 number==(int *)realloc(number,max*sizeof(int));
  24.                 for(i = max; i < quantity;i++)  //扩充的部分数组赋初值
  25.                     number[i] = 0;
  26.                 max=quantity;
  27.             }
  28.             number[quantity-1]++;           //数组中对应长度的计数值+1
  29.             quantity = 0;
  30.             state = IN;
  31.         }
  32.     }
  33.     //以下几行是将最后统计的一个单词添加到对应的计数值中。这几行代码和上面 if(state == OUT)模块中的基本一样
  34.     if(quantity>max){
  35.         number==(int *)realloc(number,max*sizeof(int));
  36.         for(i = max; i < quantity;i++)
  37.             number[i] = 0;
  38.         max=quantity;
  39.     }
  40.     number[quantity-1]++;
  41.    
  42.     printf("统计结果:\n");
  43.     for (i = 0; i < max; ++i)
  44.         printf("长度为%d的单词有 %d个.\n", i+1,number[i]);
  45.     return 0;
  46. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
WwangHB + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-11-3 13:50:18 | 显示全部楼层

回帖奖励 +10 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-16 23:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表