鱼C论坛

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

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

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

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

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

x
#include <stdio.h>

#define OUT 0
#define IN 1

int main()
{
        int i, ch, quantity, j, k, state;
        int number[10];
        
        for(i = 0; i < 10; ++i)
                number[i] = 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'];
                                quantity = 0;
                }
        }
                printf("digits =");
                for (i = 0; i < 10; ++i)
                        printf(" %d", number[i]);

}
最佳答案
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[10];
        
    for(i = 0; i < 10; ++i)
        number[i] = 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[j++]=quantity;           //将单词字符数储存在数组里
            quantity = 0;
            state = IN;
        }
    }
    if(j<=10)
        number[j]=quantity;
    printf("digits =");
    for (i = 0; i < 10; ++i)
        printf(" %d", number[i]);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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,直接跳出循环了,不会进入   将单词字符数储存在数组里   这个循环。
帮你修改了一下不知道是否是你需要的功能,你也没说清你的要求。。。
#include <stdio.h>
#define OUT 0
#define IN 1

int main()
{
    int i, quantity, j, k, state;
    char ch;
    int number[10];
        
    for(i = 0; i < 10; ++i)
        number[i] = 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[j++]=quantity;           //将单词字符数储存在数组里
            quantity = 0;
            state = IN;
        }
    }
    if(j<=10)
        number[j]=quantity;
    printf("digits =");
    for (i = 0; i < 10; ++i)
        printf(" %d", number[i]);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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表里得特殊符号
想知道小甲鱼最近在做啥?请访问 -> 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的单词也是有的。我一会儿帮你看看怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i] = 0;
                max=quantity;
            }
            number[quantity-1]++;           //数组中对应长度的计数值+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[i] = 0;
        max=quantity;
    }
    number[quantity-1]++;
    
    printf("统计结果:\n");
    for (i = 0; i < max; ++i)
        printf("长度为%d的单词有 %d个.\n", i+1,number[i]);
    return 0;
}

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 17:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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