鱼C论坛

 找回密码
 立即注册
查看: 2144|回复: 11

[已解决]有大佬能解释一下小甲鱼的课后作业吗

[复制链接]
发表于 2022-11-4 16:37:11 | 显示全部楼层 |阅读模式
60鱼币
本帖最后由 1613551 于 2022-11-4 16:37 编辑

主要有以下3个不懂

1.第1行的  count[num]="";是什么意思?是初始化吗?好像没见过这种用法

2.第17行的  ascii[ch]++是什么意思?getchar函数把值给了ch,可是ch的值是一个字符,数组的下标索引可以是一个字符吗?

3.第25行的  count[j++]=i; 问题和上面同样的,count是一个字符数组吧?为什么是把整形赋值过来了?
#include <stdio.h>
#include <string.h>
#include <stdlib.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]);
    system("pause");
    return 0;
最佳答案
2022-11-4 16:37:12
本帖最后由 jackz007 于 2022-11-4 18:39 编辑

       这题的依据是,ASCII 字符一共 128 个,字符编码为 0~127,任何从键盘输入的字母、数字、特殊符号等其 ASCII 编码都无法脱离这个范围,于是,可以设计一个有 128 个元素的一维整型数组 int ascii[NUM],先把所有元素初始化为 0 值,然后,开始循环从键盘读取字符 ch,只要这个字符不是换行符 '\n',那就以 ch 的值作为索引,将 ch 对应元素 ascii[ch] 的值加 1。这样,等到键盘输入完成的时候,只要扫描数组 ascii 128 个元素的值,就可以知道每个字符的输入计数。
       例如,如果 ascii['A'] = 5,ascii['a'] = 2 那就说明你曾经输入了 5个 'A' 和 2 个 'a'。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NUM 128

int main()
{
    int ch, i, j = 0, max = 0;
    int input_num = 0;
    int ascii[NUM] = {0};                     // 定义 ascii[] 为 128 个元素的一维整型数组,并初始化每一个元素的值为 0 值
    char count[NUM] = "";                     // 定义 count 为拥有 128 个字符的字符串空间,并初始化 count[0] = '\0'

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

    while ((ch = getchar()) != '\n')          // 循环从键盘读入一个字符存入 ch,如果 ch 不是 '\n' 就进入循环
    {
        ascii[ch]++;                          // ch ASCII 码对应的 ascii 数组元素 ascii[ch] 的值增加 1 
        input_num++;                          // 输入字符数增加 1
    }

    for (i = 0; i < NUM; i++)                // 循环扫描一维整型数组 ascii 128 个元素 
    {
        if (ascii[i])                        // 如果字符 i 有计数值
        {
            count[j++] = i;                  // 把字符 i 写入字符集 count,同时,字符集 count 不同字符计数值 j (初始值为 0)增加 1
            if (ascii[i] > ascii[max])       // 如果字符 i 的统计值大于字符 max(max 初始值为 0),那么,max 就更新为字符 i
            {
                max = i;
            }
        }
    }                                        // 循环结束后,max 是出现次数最多的那个字符,count 中记录了所有出现过的字符,j 为字符集中的不同字符的数量

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

最佳答案

查看完整内容

这题的依据是,ASCII 字符一共 128 个,字符编码为 0~127,任何从键盘输入的字母、数字、特殊符号等其 ASCII 编码都无法脱离这个范围,于是,可以设计一个有 128 个元素的一维整型数组 int ascii[NUM],先把所有元素初始化为 0 值,然后,开始循环从键盘读取字符 ch,只要这个字符不是换行符 '\n',那就以 ch 的值作为索引,将 ch 对应元素 ascii[ch] 的值加 1。这样,等到键盘输入完成的时候,只要扫描数组 ascii 128 个元 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-4 16:37:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-4 18:39 编辑

       这题的依据是,ASCII 字符一共 128 个,字符编码为 0~127,任何从键盘输入的字母、数字、特殊符号等其 ASCII 编码都无法脱离这个范围,于是,可以设计一个有 128 个元素的一维整型数组 int ascii[NUM],先把所有元素初始化为 0 值,然后,开始循环从键盘读取字符 ch,只要这个字符不是换行符 '\n',那就以 ch 的值作为索引,将 ch 对应元素 ascii[ch] 的值加 1。这样,等到键盘输入完成的时候,只要扫描数组 ascii 128 个元素的值,就可以知道每个字符的输入计数。
       例如,如果 ascii['A'] = 5,ascii['a'] = 2 那就说明你曾经输入了 5个 'A' 和 2 个 'a'。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NUM 128

int main()
{
    int ch, i, j = 0, max = 0;
    int input_num = 0;
    int ascii[NUM] = {0};                     // 定义 ascii[] 为 128 个元素的一维整型数组,并初始化每一个元素的值为 0 值
    char count[NUM] = "";                     // 定义 count 为拥有 128 个字符的字符串空间,并初始化 count[0] = '\0'

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

    while ((ch = getchar()) != '\n')          // 循环从键盘读入一个字符存入 ch,如果 ch 不是 '\n' 就进入循环
    {
        ascii[ch]++;                          // ch ASCII 码对应的 ascii 数组元素 ascii[ch] 的值增加 1 
        input_num++;                          // 输入字符数增加 1
    }

    for (i = 0; i < NUM; i++)                // 循环扫描一维整型数组 ascii 128 个元素 
    {
        if (ascii[i])                        // 如果字符 i 有计数值
        {
            count[j++] = i;                  // 把字符 i 写入字符集 count,同时,字符集 count 不同字符计数值 j (初始值为 0)增加 1
            if (ascii[i] > ascii[max])       // 如果字符 i 的统计值大于字符 max(max 初始值为 0),那么,max 就更新为字符 i
            {
                max = i;
            }
        }
    }                                        // 循环结束后,max 是出现次数最多的那个字符,count 中记录了所有出现过的字符,j 为字符集中的不同字符的数量

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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
1613551 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2022-11-4 16:38:01 | 显示全部楼层
这是题目
长图_2022-11-04.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-4 16:39:06 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-4 16:47:12 | 显示全部楼层
在C里,字符是可以当作数字使用的,会把字符转化为ASCII码
ASCII码对照表 -> http://c.biancheng.net/c/ascii/
char count[NUM] = ""; 就是把 count 初始为空字符串

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
1613551 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

发表于 2022-11-4 17:12:02 | 显示全部楼层
“”='\0'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-4 17:26:28 | 显示全部楼层
本帖最后由 1613551 于 2022-11-4 17:27 编辑
tommyyu 发表于 2022-11-4 16:47
在C里,字符是可以当作数字使用的,会把字符转化为ASCII码
ASCII码对照表 -> http://c.biancheng.net/c/as ...


那这样的话,假设我输入的是ABCDE,那相对应的就是ascii[65]++=ascii[66]一直到ascii[69]++=ascii[70]吗?
那不是无法进入第23行的if判断吗?它是从ascii[0]到ascii[4]这里面的数值都是空的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-4 17:28:31 | 显示全部楼层
我知道可以转换,但是好像转换后逻辑也不通的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-4 17:37:19 | 显示全部楼层
1613551 发表于 2022-11-4 17:26
那这样的话,假设我输入的是ABCDE,那相对应的就是ascii[65]++=ascii[66]一直到ascii[69]++=ascii[70] ...

当 i 是65、66、67、68、69的时候,就可以进入 if 判断了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-4 17:41:03 | 显示全部楼层
本帖最后由 tommyyu 于 2022-11-4 17:42 编辑
1613551 发表于 2022-11-4 17:26
那这样的话,假设我输入的是ABCDE,那相对应的就是ascii[65]++=ascii[66]一直到ascii[69]++=ascii[70] ...

那一句 if(ascii[i])就是为了在 ascii[i] 不是 0 的时候进入判断

(我上面的字怎么自动变成斜体了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-4 18:57:50 | 显示全部楼层
jackz007 发表于 2022-11-4 16:37
这题的依据是,ASCII 字符一共 128 个,字符编码为 0~127,任何从键盘输入的字母、数字、特殊符号等 ...

好牛,我一眼就看懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-4 19:08:04 From FishC Mobile | 显示全部楼层
1613551 发表于 2022-11-4 18:57
好牛,我一眼就看懂了

        很高兴,说明没有白忙活!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 14:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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