鱼C论坛

 找回密码
 立即注册
查看: 1910|回复: 22

[已解决]c语言课后作业19的最后一题

[复制链接]
发表于 2020-8-17 10:27:48 | 显示全部楼层 |阅读模式

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

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

x
V2Y4]GU_C~@%N@0ASM13[R1.png
#include <stdio.h>
#include <string.h>

#define NUM 128

int main()
{
        int ch, i, j = 0, max = 0;
        int input_num = 0;
        int ascii[NUM] = {0};
        char count[NUM] = "";

        printf("请输入英文文本:");

        while ((ch = getchar()) != '\n')
        {
                ascii[ch]++; // 字符对应的ASCII码加1
                input_num++;
        }

        for (i = 0; i < NUM; i++)
        {
                if (ascii[i])
                {
                        count[j++] = i;
                        if (ascii[i] > ascii[max])
                        {
                                max = i;
                        }
                }
        }

        printf("你总共输入了%d个字符,其中不同的字符个数有%d个。\n", input_num, strlen(count));
        printf("它们是:%s\n", count);
        printf("出现次数最多的字符是\'%c\',它总共出现了%d次。\n", max, ascii[max]);

        return 0;
}
那个对应字符码加一是对输入的字符的ascii序号加一还是数组加一用来存储输入的字符;
最佳答案
2020-8-17 10:46:57
加了一下注释
#include <stdio.h>
#include <string.h>

#define NUM 128

int main()
{
        int ch, i, j = 0, max = 0;
        int input_num = 0;//用于统计输入的字符的数目
        int ascii[NUM] = {0};//用于统计每个字符出现的次数
        char count[NUM] = "";

        printf("请输入英文文本:");

        while ((ch = getchar()) != '\n')//这里面的ch是一个字符一个字符读取的,如果遇到回车键,就停止循环,也就是按下ENTER,就停止输入了
        {
                ascii[ch]++; // 每个字符都有它自己的ASCII,字符对应的ASCII码加1,也就是对应的字符的数目加1
                input_num++;//字符的数目加1
        }

        for (i = 0; i < NUM; i++)
        {
                if (ascii[i])//如果说某一个字符出现了,就进入if循环
                {
                        count[j++] = i;//用来统计出现了几种不同的字符
                        if (ascii[i] > ascii[max])//找出出现次数最多的字符
                        {
                                max = i;
                        }
                }
        }

        printf("你总共输入了%d个字符,其中不同的字符个数有%d个。\n", input_num, strlen(count));
        printf("它们是:%s\n", count);
        printf("出现次数最多的字符是\'%c\',它总共出现了%d次。\n", max, ascii[max]);

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

使用道具 举报

发表于 2020-8-17 10:34:25 From FishC Mobile | 显示全部楼层
数组里面存储的数值加1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 10:46:57 | 显示全部楼层    本楼为最佳答案   
加了一下注释
#include <stdio.h>
#include <string.h>

#define NUM 128

int main()
{
        int ch, i, j = 0, max = 0;
        int input_num = 0;//用于统计输入的字符的数目
        int ascii[NUM] = {0};//用于统计每个字符出现的次数
        char count[NUM] = "";

        printf("请输入英文文本:");

        while ((ch = getchar()) != '\n')//这里面的ch是一个字符一个字符读取的,如果遇到回车键,就停止循环,也就是按下ENTER,就停止输入了
        {
                ascii[ch]++; // 每个字符都有它自己的ASCII,字符对应的ASCII码加1,也就是对应的字符的数目加1
                input_num++;//字符的数目加1
        }

        for (i = 0; i < NUM; i++)
        {
                if (ascii[i])//如果说某一个字符出现了,就进入if循环
                {
                        count[j++] = i;//用来统计出现了几种不同的字符
                        if (ascii[i] > ascii[max])//找出出现次数最多的字符
                        {
                                max = i;
                        }
                }
        }

        printf("你总共输入了%d个字符,其中不同的字符个数有%d个。\n", input_num, strlen(count));
        printf("它们是:%s\n", count);
        printf("出现次数最多的字符是\'%c\',它总共出现了%d次。\n", max, ascii[max]);

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

使用道具 举报

 楼主| 发表于 2020-8-17 10:51:23 | 显示全部楼层
本帖最后由 大学里的小菜鸡 于 2020-8-17 10:56 编辑


ascii[ch]++; // 每个字符都有它自己的ASCII,字符对应的ASCII码加1,也就是对应的字符的数目加1     请问这是用来对输入的字符进行存储的吗,加入输入四个a那么ascii是4还是存储的四个a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 10:55:38 | 显示全部楼层
大学里的小菜鸡 发表于 2020-8-17 10:51
ascii[ch]++; // 每个字符都有它自己的ASCII,字符对应的ASCII码加1,也就是对应的字符的数目加1      ...


不是的,就是为了统计出现的字符的数目
比如说A的ASCII是65,那么每输入一个A,ascii[65]就会加一,ascii[65]的值就是A出现的次数
这样统计是为了后面方便找到出现次数最多的字符
比如说找出现次数最多的字符的时候,只需要找到数组ascii中的最大值,最大值对应的下标就是出现次数最多的字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-17 11:01:16 | 显示全部楼层
本帖最后由 大学里的小菜鸡 于 2020-8-17 11:05 编辑
小甲鱼的铁粉 发表于 2020-8-17 10:55
不是的,就是为了统计出现的字符的数目
比如说A的ASCII是65,那么每输入一个A,ascii[65]就会加一,as ...


感谢,前面的那里懂了,后面的这个   if (ascii[i])//如果说某一个字符出现了,就进入if循环   的意思是什么呢,
是不是加入输入qwerq,w、e和r都是输入了一个,那么判断为1,还是说A的ascii是65,判断ascii[65]的时候检测到了有A,然后就判断为1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 11:03:03 From FishC Mobile | 显示全部楼层
大学里的小菜鸡 发表于 2020-8-17 11:01
感谢,前面的那里懂了,后面的这个   if (ascii)//如果说某一个字符出现了,就进入if循环   的意思是什么 ...

没有输入的字符的位置就为0,有输入的字符对应的if判断就为真
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 11:07:32 | 显示全部楼层
大学里的小菜鸡 发表于 2020-8-17 11:01
感谢,前面的那里懂了,后面的这个   if (ascii)//如果说某一个字符出现了,就进入if循环   的意思是什 ...

意思就是只要ascii[i]不是0,也就是之前输入过ASCII码为i的字符,这个字符是存在的,就进入了人if循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-17 11:08:11 | 显示全部楼层
本帖最后由 大学里的小菜鸡 于 2020-8-17 11:11 编辑
baige 发表于 2020-8-17 11:03
没有输入的字符的位置就为0,有输入的字符对应的if判断就为真


请问如果输入的是ABC,那么0到65之前的都判断为假吗,那个判断里面的i是ascii码吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-17 11:12:58 | 显示全部楼层
小甲鱼的铁粉 发表于 2020-8-17 11:07
意思就是只要ascii不是0,也就是之前输入过ASCII码为i的字符,这个字符是存在的,就进入了人if循环

意思是i是ascii码,假如之前输入了A,当i=65的时候就判断为真,进入循环了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 11:18:28 | 显示全部楼层
大学里的小菜鸡 发表于 2020-8-17 11:12
意思是i是ascii码,假如之前输入了A,当i=65的时候就判断为真,进入循环了吗

不是的,i是数组ascii的下标,比如说我输入ABBDE,然后进入循环,那么ascii[65] = 1, ascii[66] = 2
ascii[67] = 0, 因为没有输入C,所以它是0 , ascii[68] = 1, ascii[69] = 1, 那么在这里,当i = 65、66、68、69是数组ascii[i]的值都不是0,就可以进入if (ascii[i])语句,而i = 67时,ascii[i] = 0,不可以进入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-17 11:27:23 | 显示全部楼层
小甲鱼的铁粉 发表于 2020-8-17 11:18
不是的,i是数组ascii的下标,比如说我输入ABBDE,然后进入循环,那么ascii[65] = 1, ascii[66 ...

感谢,最后一个问题,请问   ascii[ch]++; // 每个字符都有它自己的ASCII,字符对应的ASCII码加1,也就是对应的字符的数目加1   这个读取的是输入字符的ascii码吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 11:33:35 | 显示全部楼层
大学里的小菜鸡 发表于 2020-8-17 11:27
感谢,最后一个问题,请问   ascii[ch]++; // 每个字符都有它自己的ASCII,字符对应的ASCII码加1,也就是 ...

ascii[ch]++,ch在这里面其实是一个数字,因为ASCII码是数字
比如说A吧,A的ASCII码是65,那么你每输入一个A,ascii[65]就会加一
每输入一个B,ascii[66]就会加一
这是ASCII码表,在评论区最下面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 11:34:16 | 显示全部楼层
timg.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-17 12:16:40 | 显示全部楼层

好的,谢谢,终于理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-20 10:33:46 | 显示全部楼层
感谢楼主和解答的大佬,来蹭了个答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-20 11:03:17 | 显示全部楼层
本帖最后由 毛驴子哈 于 2020-8-20 11:05 编辑


for循环是用户输入完毕才开始的嘛?
例如输入AABBCCC
ascii[65]=2,ascii[66]=2,ascii[67]=3;
for(i=0,;i<NUM;i++)开始循环
当i=65时,对应的ascii[65]=2,进入if循环
count[0]=65,  count[1]=66 , count[2] = 67(这里后面打印为它们的ascii对应的值)
然后下层if循环判断ascii[65] > ascii[0]   也就是2>0,  这里ascii[0]=0,
然后max被i(0被2)替换,下次与ascii[i] 也就是ascii[65]作比较
以此类推,最后输入次数最多的就是max
最后打印为max的ascii对应的值(66 / C),次数是ascii[max]的值(3)。

这道题是这样的逻辑嘛


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

使用道具 举报

 楼主| 发表于 2020-8-20 11:09:58 | 显示全部楼层
毛驴子哈 发表于 2020-8-20 11:03
for循环是用户输入完毕才开始的嘛?
例如输入AABBCCC
ascii[65]=2,ascii[66]=2,ascii[67]=3;

ascii[0]并不一定等于0,如果你输入了空格,那么就不为0,这个是用来比较出最大数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-20 15:55:24 | 显示全部楼层
大学里的小菜鸡 发表于 2020-8-20 11:09
ascii[0]并不一定等于0,如果你输入了空格,那么就不为0,这个是用来比较出最大数

那max其实初始化为多少都可以喽,只要不超过ascii码值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-20 16:50:12 | 显示全部楼层
毛驴子哈 发表于 2020-8-20 15:55
那max其实初始化为多少都可以喽,只要不超过ascii码值


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 07:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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