1613551 发表于 2022-11-4 16:37:11

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

本帖最后由 1613551 于 2022-11-4 16:37 编辑

主要有以下3个不懂

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

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

3.第25行的count=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 = {0};
    char count = "";

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

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

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

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

jackz007 发表于 2022-11-4 16:37:12

本帖最后由 jackz007 于 2022-11-4 18:39 编辑

       这题的依据是,ASCII 字符一共 128 个,字符编码为 0~127,任何从键盘输入的字母、数字、特殊符号等其 ASCII 编码都无法脱离这个范围,于是,可以设计一个有 128 个元素的一维整型数组 int ascii,先把所有元素初始化为 0 值,然后,开始循环从键盘读取字符 ch,只要这个字符不是换行符 '\n',那就以 ch 的值作为索引,将 ch 对应元素 ascii 的值加 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 = {0};                     // 定义 ascii[] 为 128 个元素的一维整型数组,并初始化每一个元素的值为 0 值
    char count = "";                     // 定义 count 为拥有 128 个字符的字符串空间,并初始化 count = '\0'

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

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

    for (i = 0; i < NUM; i++)                // 循环扫描一维整型数组 ascii 128 个元素
    {
      if (ascii)                        // 如果字符 i 有计数值
      {
            count = i;                  // 把字符 i 写入字符集 count,同时,字符集 count 不同字符计数值 j (初始值为 0)增加 1
            if (ascii > ascii)       // 如果字符 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);
    system("pause");
    return 0;
}

1613551 发表于 2022-11-4 16:38:01

这是题目

1613551 发表于 2022-11-4 16:39:06

{:10_245:}

tommyyu 发表于 2022-11-4 16:47:12

在C里,字符是可以当作数字使用的,会把字符转化为ASCII码
ASCII码对照表 -> http://c.biancheng.net/c/ascii/
char count = ""; 就是把 count 初始为空字符串

jhq999 发表于 2022-11-4 17:12:02

“”='\0'

1613551 发表于 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++=ascii一直到ascii++=ascii吗?
那不是无法进入第23行的if判断吗?它是从ascii到ascii这里面的数值都是空的吧

1613551 发表于 2022-11-4 17:28:31

{:10_302:}我知道可以转换,但是好像转换后逻辑也不通的样子

tommyyu 发表于 2022-11-4 17:37:19

1613551 发表于 2022-11-4 17:26
那这样的话,假设我输入的是ABCDE,那相对应的就是ascii++=ascii一直到ascii++=ascii ...

当 i 是65、66、67、68、69的时候,就可以进入 if 判断了啊

tommyyu 发表于 2022-11-4 17:41:03

本帖最后由 tommyyu 于 2022-11-4 17:42 编辑

1613551 发表于 2022-11-4 17:26
那这样的话,假设我输入的是ABCDE,那相对应的就是ascii++=ascii一直到ascii++=ascii ...
那一句 if(ascii)就是为了在 ascii 不是 0 的时候进入判断

(我上面的字怎么自动变成斜体了{:10_277:} )

1613551 发表于 2022-11-4 18:57:50

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

{:10_275:}好牛,我一眼就看懂了

jackz007 发表于 2022-11-4 19:08:04

1613551 发表于 2022-11-4 18:57
好牛,我一眼就看懂了

      很高兴,说明没有白忙活!
页: [1]
查看完整版本: 有大佬能解释一下小甲鱼的课后作业吗