不枉风来水顺 发表于 2023-10-6 14:39:44

人傻了呀!!

小甲鱼的作业S1E14
#include <stdio.h>

int main()
{
      float num = 0;
      double sum = 0;
      int status;

      do
      {
                printf("请输入合法的数字:");
                do
                {
                        sum = sum + num;
                        status = scanf("%f", &num);
                        printf("%f",num);
                } while (getchar() != '\n' && status == 1);
      } while(status == 1);

      printf("结果是:%.2lf\n", sum);

      return 0;
}
为什么就可以做到
请输入合法的数字:11s22m33.000
请输入合法的数字:hk
结果是:66.00

isdkz 发表于 2023-10-6 14:40:29

这段代码可以实现输入一系列合法数字并计算它们的总和。以下是代码的解释:

1. 首先,定义了三个变量: num (用于存储输入的数字)、 sum (用于存储数字的总和)和 status (用于检查输入是否合法)。

2. 进入第一个循环 do...while ,该循环会一直执行直到输入的数字不合法。在每次循环开始时,会提示用户输入合法的数字。

3. 在内部的 do...while 循环中,会先执行 sum = sum + num ,将输入的数字加到总和上。然后使用 scanf 函数尝试读取一个浮点数,并将其赋值给 num 。 scanf 函数返回值为成功读取的变量个数,如果成功读取了一个数字, status 就会被赋值为1。

4. 如果 scanf 成功读取了一个数字,会输出该数字。如果输入的数字不合法(比如输入了字母), getchar() 函数会读取并丢弃输入缓冲区中的字符直到遇到换行符。此时, status 仍然为1,所以内部循环会继续执行。

5. 当用户输入不合法的数字或者按下回车键时,内部循环结束。此时,外部循环会判断 status 的值,如果为1,则继续执行内部循环,否则结束整个循环。

6. 最后,输出计算得到的总和 sum ,并使用 %.2lf 格式化输出为保留两位小数的浮点数。

所以,当输入 11s22m33.000 和 hk 时,程序会先将11加到总和上,然后尝试读取 s22m33.000 ,由于 s22m33.000 不是合法的浮点数,内部循环结束,外部循环也结束。最后输出结果为 66.00 。

Mike_python小 发表于 2023-10-6 14:41:12

请注意,我是一个AI语言模型,并非真实的人物。以下是对给出的代码进行解释和修改的回答:

问题:为什么输入"11s22m33.000"和"hk"时最终输出结果为"66.00"?

在给定的代码中,通过嵌套的循环来读取用户输入并计算数字的总和。主要逻辑如下:

1. 程序首先声明了一个浮点型变量num和一个双精度浮点型变量sum,以及一个整型变量status用于存储scanf函数的返回值。
2. 外部循环使用do-while结构,表示持续读取输入直到输入不再合法(即不是浮点数)。
3. 在每次外部循环迭代开始时,程序会打印提示信息:"请输入合法的数字:"。
4. 内部循环使用do-while结构,将输入的数字累加到sum中,并更新status为scanf函数的返回值。
5. 内部循环会检查用户输入是否为换行符或者status的值是否为1(表示成功读取一个浮点数)。如果条件满足,则继续内部循环;否则跳出内部循环,回到外部循环。
6. 在每次外部循环迭代结束后,会检查status的值。如果status为1,表示仍然成功读取到一个浮点数,说明输入不合法,需要继续循环;反之,跳出外部循环。
7. 最后,程序会打印输出结果,格式化输出累加和的双精度浮点数值。

根据给定的输入:"11s22m33.000"和"hk",程序的执行过程如下:

1. 输入 "11s22m33.000" 时,首先尝试将其转换为浮点数,成功读取到数字11.0。然后,内部循环继续执行累加操作,并更新status为1。
2. 输入 "22m33.000" 时,由于输入中包含非数字字符('m'),scanf函数无法成功将其转换为浮点数,因此返回值为0。此时,内部循环终止,外部循环继续执行。
3. 输出提示信息 "请输入合法的数字:"。
4. 输入 "hk" 时,同样由于输入中包含非数字字符,scanf函数无法成功将其转换为浮点数,返回值依然为0。内部循环终止,外部循环结束。
5. 程序打印输出结果,即最终的累加和66.00。

修改建议:

1. 考虑使用字符串来接收用户的输入,而不是直接使用浮点数变量num。这样可以更好地处理非法输入。
2. 使用strtod函数将字符串转换为浮点数,它可以返回转换后的值以及指示转换成功与否的指针。
3. 在累加之前,先确保用户输入的字符串中只包含合法的数字字符和小数点。

以下是对代码进行修改的示例:


#include <stdio.h>
#include <stdlib.h>

int main() {
    char input;// 声明一个字符数组来接收用户输入的字符串
    double sum = 0;
   
    printf("请输入合法的数字:");
    while (fgets(input, sizeof(input), stdin)) {// 使用fgets读取用户输入的一行
      char *endptr;// 指向转换结束位置的指针
      double num = strtod(input, &endptr);// 将输入字符串转换为浮点数

      if (endptr == input || *end

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

不枉风来水顺 发表于 2023-10-6 14:44:19

isdkz 发表于 2023-10-6 14:40
这段代码可以实现输入一系列合法数字并计算它们的总和。以下是代码的解释:

1. 首先,定义了三个变量:...


加到11的时候内外循环都结束了的话,怎么会得到66呢?
{:10_266:}

yinda_peng 发表于 2023-10-6 16:57:42

不枉风来水顺 发表于 2023-10-6 14:44

加到11的时候内外循环都结束了的话,怎么会得到66呢?

他们是GPT回答,加到11的时候status = 1,因为遇到了字母scanf读取被切断,然后getchar()会获取当前的一个字符即s,在缓冲区内因为s被getchar()获取,getchar()!='\n'满足内循环条件,同理到最后getchar() = '\n',退出内循环,因为最后结尾时是数字,所以此时status仍然为1,之后外循环判断继续进行内循环,所以有第二次输入,第二次输入连着两个字符,结束时status = 0,所以终止。

yinda_peng 发表于 2023-10-6 17:03:29

本帖最后由 yinda_peng 于 2023-10-6 17:04 编辑

不枉风来水顺 发表于 2023-10-6 14:44

加到11的时候内外循环都结束了的话,怎么会得到66呢?
这样可能更直观理解:
【1】num = 11.0000    status = 1   缓冲区: s22m33.000    getchar() = 's'    缓冲区:22m33.000   num:11.0000
【2】num = 22.0000    status = 1   缓冲区 : m33.000      getchar() = 'm'   缓冲区:33.000         num:22.0000
【3】num = 33.0000    status = 1   getchar() = '\n'

不枉风来水顺 发表于 2023-10-7 09:22:32

yinda_peng 发表于 2023-10-6 17:03
这样可能更直观理解:
【1】num = 11.0000    status = 1   缓冲区: s22m33.000    getchar() = 's'   ...

谢谢老师的耐心解释!
{:10_254:}懂了懂了!

yinda_peng 发表于 2023-10-7 09:41:47

不枉风来水顺 发表于 2023-10-7 09:22
谢谢老师的耐心解释!
懂了懂了!

都是坛友,不是什么老师啦{:10_302:}
页: [1]
查看完整版本: 人傻了呀!!