鱼C论坛

 找回密码
 立即注册
查看: 671|回复: 9

[已解决]S1E19课最后一题

[复制链接]
发表于 2020-2-13 18:25:53 | 显示全部楼层 |阅读模式

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

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

x
有没有大佬能不能帮我解释一下19课最后一题。。看不太懂。。


#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)
                {
                        count[j++] = i;
                        if (ascii > 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;
}
最佳答案
2020-2-13 19:10:59
去看了一下小甲鱼的答案代码,你这段代码有一个错误,我把答案代码重新贴出来
#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;
}

首先我解释各个变量的含义和用途:
int ch, i, j = 0, max = 0;  ch:输入字符的临时存储;i,j循环变量;max:存储出现次数最多的字母
int input_num = 0; 用处是统计输入字符个数
int ascii[NUM] = {0}; 用处是统计对应字符出现的次数,如ascii[97] = 5 意思是ASCII码为97的字符(‘a’)输入了5次
char count[NUM] = "";用处是存储所出现的所有字符

接下来是这段:
while ((ch = getchar()) != '\n')
{
       ascii[ch]++; // 字符对应的ASCII码加1
       input_num++;
}
每次读取一个字符直到读取到了换行符结束循环
循环的内容是将读到字符对应的ascii数组的值自增1
输入字符总数自增1

下面这段:
        for (i = 0; i < NUM; i++)
        {
                if (ascii[i])
                {
                        count[j++] = i;
                        if (ascii[i] > ascii[max])
                        {
                                max = i;
                        }
                }
        }
对于ascii的每一位进行遍历(因为ascii数组定义时的长度就是NUM)
如果ascii[i] 不等于 0 (ascii[i]=0意味着以i为ASCII码的字符没有输入)
那么说明出现了一个新的字符,将这个字符i存入count数组,然后把count数组的索引变量j自增1
如果字符i的个数大于数量最多的字符max的个数,那么用字符i代替max
说明此时字符个数最大的字母已经更新为i

最后的输出部分不再多说。
这个程序对新手的难点在于对ascii[]数组作用的理解
还有对C语言中的字符类型‘char’的理解
我在上面解释中使用了“字符i”、“字符max”
这一点我不知道小甲鱼前面的视频有没有说明,如果你能理解我就不说了,不能的话我再继续回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-13 19:10:59 | 显示全部楼层    本楼为最佳答案   
去看了一下小甲鱼的答案代码,你这段代码有一个错误,我把答案代码重新贴出来
#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;
}

首先我解释各个变量的含义和用途:
int ch, i, j = 0, max = 0;  ch:输入字符的临时存储;i,j循环变量;max:存储出现次数最多的字母
int input_num = 0; 用处是统计输入字符个数
int ascii[NUM] = {0}; 用处是统计对应字符出现的次数,如ascii[97] = 5 意思是ASCII码为97的字符(‘a’)输入了5次
char count[NUM] = "";用处是存储所出现的所有字符

接下来是这段:
while ((ch = getchar()) != '\n')
{
       ascii[ch]++; // 字符对应的ASCII码加1
       input_num++;
}
每次读取一个字符直到读取到了换行符结束循环
循环的内容是将读到字符对应的ascii数组的值自增1
输入字符总数自增1

下面这段:
        for (i = 0; i < NUM; i++)
        {
                if (ascii[i])
                {
                        count[j++] = i;
                        if (ascii[i] > ascii[max])
                        {
                                max = i;
                        }
                }
        }
对于ascii的每一位进行遍历(因为ascii数组定义时的长度就是NUM)
如果ascii[i] 不等于 0 (ascii[i]=0意味着以i为ASCII码的字符没有输入)
那么说明出现了一个新的字符,将这个字符i存入count数组,然后把count数组的索引变量j自增1
如果字符i的个数大于数量最多的字符max的个数,那么用字符i代替max
说明此时字符个数最大的字母已经更新为i

最后的输出部分不再多说。
这个程序对新手的难点在于对ascii[]数组作用的理解
还有对C语言中的字符类型‘char’的理解
我在上面解释中使用了“字符i”、“字符max”
这一点我不知道小甲鱼前面的视频有没有说明,如果你能理解我就不说了,不能的话我再继续回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 4 反对 0

使用道具 举报

 楼主| 发表于 2020-2-13 19:22:34 | 显示全部楼层
SHRS23 发表于 2020-2-13 19:10
去看了一下小甲鱼的答案代码,你这段代码有一个错误,我把答案代码重新贴出来

谢谢大佬这么费心了,我先自己康康,看不懂了再问你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 19:28:46 | 显示全部楼层
在C语言里 char 型存储的内容就是字符对应的ASCII码,你可以结合这个例子理解一下。
#include <stdio.h>

int main()
{
        int  i;
                char ch;
                
        ch = 'a';
        printf("%c %d\n\n", ch, ch);
        printf("%c %d\n\n", 100, 100);
        
        for(i = 97;i <= 'z';i++)
        {
                       printf("%d  %c\n", i, i);
                }
                
                if('a' == 97)
                {
                        printf("字符a与97完全相同");
                }
                else
                {
                        printf("字符a与97不完全相同");
                }       
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-13 19:47:29 | 显示全部楼层
SHRS23 发表于 2020-2-13 19:10
去看了一下小甲鱼的答案代码,你这段代码有一个错误,我把答案代码重新贴出来

看懂了,例子也看了,谢谢老哥这么细心
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 20:10:15 | 显示全部楼层
2646810570@qq.c 发表于 2020-2-13 19:47
看懂了,例子也看了,谢谢老哥这么细心

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

使用道具 举报

发表于 2020-2-17 11:53:44 | 显示全部楼层
SHRS23 发表于 2020-2-13 19:10
去看了一下小甲鱼的答案代码,你这段代码有一个错误,我把答案代码重新贴出来

int ascii[NUM] = {0}; 用处是统计对应字符出现的次数,如ascii[97] = 5 意思是ASCII码为97的字符(‘a’)输入了5次   请问这个次数是怎么记录的啊 假如我输入的是AAB这个程序怎么记录输入了两个A
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-18 09:33:15 | 显示全部楼层
rocketeer 发表于 2020-2-17 11:53
int ascii[NUM] = {0}; 用处是统计对应字符出现的次数,如ascii[97] = 5 意思是ASCII码为97的字符(‘a’ ...

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

这段程序
假设输入AABA
第一次循环 ascii['A'] = 1
第二次循环 ascii['A'] = 2
第三次循环 ascii['B'] = 1
第四次循环 ascii['A'] = 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-2-18 19:54:15 | 显示全部楼层
SHRS23 发表于 2020-2-18 09:33
while ((ch = getchar()) != '\n')
        {
                ascii[ch]++; // 字符对应的ASCII码加1
...


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

使用道具 举报

发表于 2020-2-18 19:57:26 | 显示全部楼层
SHRS23 发表于 2020-2-18 09:33
while ((ch = getchar()) != '\n')
        {
                ascii[ch]++; // 字符对应的ASCII码加1
...

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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