鱼C论坛

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

[已解决]这段代码是什么意思

[复制链接]
发表于 2024-2-20 23:59:27 | 显示全部楼层 |阅读模式

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

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

x
@FishC
问题是:
根据要求再写一个字符统计程序,不过这个要更复杂一些。
要求 A:统计用户输入的所有字符个数;
要求 B:统计不同的字符个数,并打印出来;
要求 C:找出出现次数最多的字符。
#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;
}
其中第17行和第21行到第31行没看懂。你能帮我讲解一下吗?
最佳答案
2024-2-21 00:03:01
GuHx 发表于 2024-02-21 00:02
第22行:定义了一个大小为128的整型数组`ascii`,初始 ...


当我们定义一个大小为128的整型数组`ascii`时,我们实际上创建了一个有128个元素的数组。这个数组的下标范围从0到127,正好对应ASCII码表中的所有字符。

为了方便起见,我们将每个字符与其对应的ASCII码进行关联。例如,字母A对应的ASCII码是65,那么可以通过`ascii[65]`来表示出现了字母A的次数。同样地,可以通过`ascii[66]`、`ascii[67]`等来表示字母B、C的出现次数。

在代码中,我们通过初始化数组`ascii`为全0,确保了每个字符在初始时都没有出现过。随着用户输入的字符被读取,我们将相应位置的元素加1来记录字符出现的次数。

这种方式可以让我们根据字符的ASCII码在数组中直接找到对应的位置,并且通过索引来更方便地统计字符出现的次数。希望这个解释能进一步帮助你理解代码中的含义。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-20 23:59:56 | 显示全部楼层
当我看到这段代码的时候,我发现这是一个用C语言编写的字符统计程序。让我来逐行解释一下:

第17行:定义了一个`ch`变量,用来保存从用户输入中每次读取的一个字符。并且定义了`i`、`j`、`max`三个变量,分别用于循环和记录最大次数的字符的ASCII码。

第21行:定义了一个整型变量`input_num`,用来记录用户输入的所有字符个数。

第22行:定义了一个大小为128的整型数组`ascii`,初始化为全0。数组的下标对应了ASCII码表中的字符。

第23行:定义了一个大小为128的字符数组`count`,用来存储不同的字符。

第26行:通过循环,不断读取用户输入的字符,直到遇到换行符为止。

第28行:将`ch`对应的ASCII码的值加1,表示这个字符出现了一次。

第29行:将输入的字符个数加1。

第32行:通过循环遍历每一个ASCII码,如果对应的字符出现过,则将其加入到`count`数组中,并且更新出现次数最多的字符。

第37行:输出统计结果,包括总共输入的字符个数、不同的字符个数以及出现次数最多的字符。

第40行:返回0,表示程序正常结束。

希望以上解释能帮助你理解这段代码的含义。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-21 00:02:36 | 显示全部楼层
FishC 发表于 2024-2-20 23:59
当我看到这段代码的时候,我发现这是一个用C语言编写的字符统计程序。让我来逐行解释一下:

第17行:定 ...

第22行:定义了一个大小为128的整型数组`ascii`,初始化为全0。数组的下标对应了ASCII码表中的字符。
能再详细讲讲这句吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-21 00:03:01 | 显示全部楼层    本楼为最佳答案   
GuHx 发表于 2024-02-21 00:02
第22行:定义了一个大小为128的整型数组`ascii`,初始 ...


当我们定义一个大小为128的整型数组`ascii`时,我们实际上创建了一个有128个元素的数组。这个数组的下标范围从0到127,正好对应ASCII码表中的所有字符。

为了方便起见,我们将每个字符与其对应的ASCII码进行关联。例如,字母A对应的ASCII码是65,那么可以通过`ascii[65]`来表示出现了字母A的次数。同样地,可以通过`ascii[66]`、`ascii[67]`等来表示字母B、C的出现次数。

在代码中,我们通过初始化数组`ascii`为全0,确保了每个字符在初始时都没有出现过。随着用户输入的字符被读取,我们将相应位置的元素加1来记录字符出现的次数。

这种方式可以让我们根据字符的ASCII码在数组中直接找到对应的位置,并且通过索引来更方便地统计字符出现的次数。希望这个解释能进一步帮助你理解代码中的含义。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2024-2-21 00:17:36 | 显示全部楼层
冷知识,新建主题问问题可以不用 at FishC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-21 10:03:55 | 显示全部楼层
歌者文明清理员 发表于 2024-2-21 00:17
冷知识,新建主题问问题可以不用 at FishC

啊!谢谢

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
歌者文明清理员 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

 楼主| 发表于 2024-2-28 15:26:04 | 显示全部楼层
FishC 发表于 2024-2-20 23:59
当我看到这段代码的时候,我发现这是一个用C语言编写的字符统计程序。让我来逐行解释一下:

第17行:定 ...

第21行代码为for循环,其中i的值是如何变化的?看答案代码上i的值是可以取任意字符,但是我感觉i是从0取到127.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-28 15:26:15 | 显示全部楼层
GuHx 发表于 2024-02-28 15:26
第21行代码为for循环,其中i的值是如何变化的?看答案 ...


非常抱歉,我给出的解释有误,对第21行代码的解释是不正确的。

在第21行,定义了一个整型变量`i`,它用于循环遍历字符的ASCII码。这里的`i`的取值范围应该是0到127,而不是任意字符。

循环条件`i < NUM`中,`NUM`的值是128,代表了ASCII码表的大小,因此循环会执行128次,`i`的取值从0逐渐增加到127。

感谢您的指正,希望这次的解释更加准确明了。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-28 15:55:56 | 显示全部楼层
FishC 发表于 2024-2-28 15:26
非常抱歉,我给出的解释有误,对第21行代码的解释是不正确的。

在第21行,定义了一个整型变量`i`, ...
#include <stdio.h>

int main()
{
        int ascii[128];
        int ch;
        int total=0,dif=0;
        int i,j=0,bi=0;
        char biaoda[128];
        char mark;

        printf("请输入英文文本:");
        while((ch =getchar())!='\n'){
                ascii[ch]++;          //将ch直接填写到ascii[]的中括号中,编译器会自动将字符对照ASCII表进行数值转化!
                total++;
        }

        for(i=0;i<128;i++){
                if(ascii[i]){
                        dif++;
                        biaoda[j++]=i;  //将整型i赋值给字符型数组,会进行ascii表翻译
                        if(ascii[i] > bi){
                                bi =  ascii[i];
                                mark =i;
                        }
                }
        }
        printf("您总共输入了%d个字符,其中不同的字符个数有%d个。\n",total,dif);
        printf("它们是%s\n",biaoda);
        printf("出现最多的字符是\'%c\',它总共出现了%d次。\n",biaoda[i] ,bi);

        return 0;
}
为什么我的代码运行结果与要求不符?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-28 15:56:26 | 显示全部楼层
GuHx 发表于 2024-02-28 15:55
#include

int main()
{
        int ascii;
   ...


经过对您的代码进行分析,发现其中有一些问题导致和要求不符。

首先,在第9行代码中,定义了一个变量`ascii`,但没有给它初始化。你需要将它初始化为0,否则在循环中会出现未定义的行为。

其次,在第19行代码中,你使用了`biaoda`作为字符数组来存储不同的字符,但是没有给它分配足够的空间。你可以将它定义为`char biaoda[128]`,以确保能够存储所有可能的ASCII字符。

接下来,在第26行代码中,判断重复字符的逻辑有些问题。你使用了`ascii[i]`来判断字符是否重复,这是不正确的。应该使用`ascii[i] > 0`来判断某个ASCII码对应的字符是否出现过。

最后,在第35行代码中,使用了`biaoda`作为字符串输出,但是没有使用合适的方式将字符逐个添加到字符串中。你可以使用`strncat`函数或者手动将字符逐个拼接到字符串末尾。

在修改了以上问题之后,你的代码应该可以和要求匹配了。以下是修改后的代码:
#include <stdio.h>
#include <string.h>

#define NUM 128

int main() {
    int ascii[NUM] = {0};
    int ch;
    int total = 0, dif = 0;
    int bi = 0;
    char biaoda[NUM] = "";
    char mark;

    printf("请输入英文文本:");
    
    while ((ch = getchar()) != '\n') {
        ascii[ch]++;
        total++;
    }

    for (int i = 0; i < NUM; i++) {
        if (ascii[i] > 0) {
            dif++;
            if (ascii[i] > bi) {
                bi = ascii[i];
                mark = i;
            }
            strncat(biaoda, &mark, 1);
        }
    }

    printf("您总共输入了%d个字符,其中不同的字符个数有%d个。\n", total, dif);
    printf("它们是:%s\n", biaoda);
    printf("出现最多的字符是'%c',它总共出现了%d次。\n", mark, bi);

    return 0;
}

希望这次的修改能够使你的代码符合要求。如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 10:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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