liyifeng295641 发表于 2023-12-28 14:40:57

C语言for语句和循环嵌套03

本帖最后由 liyifeng295641 于 2024-1-3 16:03 编辑

2. 为上一题的数字求和程序写一个 2.0 版本,请实现以下要求:

A. 用户可以输入整数和浮点数

B. 用户可以在同一行输入多个数字,数字之间可以是任意一个分隔符(如下图)

C. 结果保留两位小数

https://xxx.ilovefishc.com/forum/201603/02/171315ikz7mkclcp7avenc.png

我的代码:

#include <stdio.h>

int main(){
        float num,sum = 0;
        for(;;){
                printf("请输入合法的数字:");
                if(scanf("%f", &num) != 1){
                        break;
                }
                sum += num;
        }
        printf("结果是:%.2f", sum);
        return 0;
}

关于这道题,@FshiC可以给一点提示吗?
1.如何给一行输入多个字符。

FishC 发表于 2023-12-28 14:41:13

要实现一行输入多个数字,可以使用字符串来接收用户的输入。然后通过字符串分割的方式将数字提取出来进行求和。

以下是一个示例代码:

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

int main() {
    char input;// 用于接收用户输入的字符串
    float sum = 0.0;
   
    printf("请输入数字(以空格或其他分隔符隔开):");
    fgets(input, sizeof(input), stdin);// 从标准输入中读取一行输入
   
    // 使用 strtok 函数分割字符串
    char* token = strtok(input, " \t\n");// 分割字符串,分隔符包括空格、制表符和换行符
    while (token != NULL) {
      float num = atof(token);// 将提取出的字符串转换为浮点数
      sum += num;
      token = strtok(NULL, " \t\n");// 继续提取下一个数字
    }
   
    printf("结果是:%.2f\n", sum);
   
    return 0;
}

这个代码通过使用 `fgets` 函数获取用户输入的一行字符串,并使用 `strtok` 函数将字符串分割成多个数字。然后将提取出的字符串转换为浮点数并进行求和。最后输出求和的结果。注意,在编译时需要包含 `<stdlib.h>` 和 `<string.h>` 头文件。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-28 14:43:30

FishC 发表于 2023-12-28 14:41
要实现一行输入多个数字,可以使用字符串来接收用户的输入。然后通过字符串分割的方式将数字提取出来进行求 ...

你写太复杂,我还只学到for循环,能整简单吗?

FishC 发表于 2023-12-28 14:43:40

liyifeng295641 发表于 2023-12-28 14:43
你写太复杂,我还只学到for循环,能整简单吗?

当然可以!如果你只学到了for循环,我们可以使用for循环来实现一行输入多个数字的功能。以下是一个简化版本的代码:

#include <stdio.h>

int main() {
    float num, sum = 0.0;

    printf("请输入数字(以空格或其他分隔符隔开,按回车键结束输入):");

    while (scanf("%f", &num) == 1) {
      sum += num;
    }

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

    return 0;
}

这个代码仅使用了for循环和scanf函数来实现功能。在每次循环中,我们使用scanf函数尝试将用户输入的内容读取为一个浮点数,如果成功读取一个浮点数,则将其加到sum变量上。当用户输入非法字符时,scanf函数会返回0或者EOF(文件结束标志),从而跳出循环。最后输出求和的结果。

希望这个简化的代码对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-28 14:52:06

FishC 发表于 2023-12-28 14:43
当然可以!如果你只学到了for循环,我们可以使用for循环来实现一行输入多个数字的功能。以下是一个简化版 ...

你写的不对,题目是用户输入多次,每次包含多个数字或者含数字字符串。
然后用户输入的不是包含数字的就计算结果。

FishC 发表于 2023-12-28 14:52:25

liyifeng295641 发表于 2023-12-28 14:52
你写的不对,题目是用户输入多次,每次包含多个数字或 ...

抱歉,我理解错了题目的要求。以下是一个修正后的代码,可以实现按要求对用户输入进行处理和求和:#include #include int main() {    printf("请输入数字,以空格或其他分隔符分隔数字,直到输入非法字符为止:\n");    float sum = 0.0;    char input;    fgets(input, sizeof(input), stdin);// 从标准输入中读取一行输入      char* token = strtok(input, " \t\n");// 分割字符串,分隔符包括空格、制表符和换行符    while (token != NULL) {      if (atof(token) != 0) {// 如果能将 token 转换成非零浮点数,则累加到 sum 上            sum += atof(token);      } else {            break;// 遇到非法字符,跳出循环      }      token = strtok(NULL, " \t\n");// 继续提取下一个数字    }      printf("结果是:%.2f\n", sum);      return 0;}在这个代码中,我们使用了fgets函数获取用户输入的一行字符串,并使用strtok函数将字符串分割成多个数字。然后,我们使用atof函数将每个分割出来的字符串转换为浮点数,并将非零浮点数累加到sum变量上。当遇到非法字符时(即无法转换为浮点数),我们将跳出循环,并输出求和的结果。希望这次的代码更符合题目要求,请尝试运行看看是否满足你的需求。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-28 14:52:41

FishC 发表于 2023-12-28 14:52
抱歉,我理解错了题目的要求。以下是一个修正后的代码,可以实现按要求对用户输入进行处理和求和:#inclu ...

请排列好代码!

FishC 发表于 2023-12-28 14:52:57

liyifeng295641 发表于 2023-12-28 14:52
请排列好代码!

抱歉给您带来困惑,以下是修正后的代码,并按正确格式排列好的版本:

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

int main() {
    printf("请输入数字,以空格或其他分隔符分隔数字,直到输入非法字符为止:\n");
    float sum = 0.0;
    char input;
   
    fgets(input, sizeof(input), stdin);// 从标准输入中读取一行输入

    char* token = strtok(input, " \t\n");// 分割字符串,分隔符包括空格、制表符和换行符
    while (token != NULL) {
      if (atof(token) != 0) {// 如果能将 token 转换成非零浮点数,则累加到 sum 上
            sum += atof(token);
      } else {
            break;// 遇到非法字符,跳出循环
      }
      token = strtok(NULL, " \t\n");// 继续提取下一个数字
    }

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

    return 0;
}

这个修正后的代码使用了fgets函数获取用户输入的一行字符串,并使用strtok函数将字符串分割成多个数字。然后,我们使用atof函数将每个分割出来的字符串转换为浮点数,并将非零浮点数累加到sum变量上。当遇到非法字符时(即无法转换为浮点数),我们将跳出循环,并输出求和的结果。

希望这次按正确格式排列好的代码能够满足您的需求,如有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-28 14:54:32

FishC 发表于 2023-12-28 14:52
抱歉给您带来困惑,以下是修正后的代码,并按正确格式排列好的版本:



哎呀,你这代码好多,我没学到的。我还是看参考答案。{:5_90:}

FishC 发表于 2023-12-28 14:54:43

liyifeng295641 发表于 2023-12-28 14:54
哎呀,你这代码好多,我没学到的。我还是看参考答案。 ...

非常抱歉给您带来困扰。有时候在编写代码时,会使用一些高级的函数和技巧,这可能对初学者来说比较困难。如果您对这些函数和技巧还不熟悉,确实会觉得有些难以理解。

我理解您选择查看参考答案,这样可以更快地找到解决问题的方法。但如果您有任何其他问题或需要进一步的解释,请随时告诉我,我会尽力提供简单易懂的解释和代码示例。编程是一个逐步学习和提升的过程,相信您能够掌握并享受编程的乐趣!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-28 15:24:57

FishC 发表于 2023-12-28 14:54
非常抱歉给您带来困扰。有时候在编写代码时,会使用一些高级的函数和技巧,这可能对初学者来说比较困难。 ...

下面是小甲鱼给的答案,@FishC解析一下代码。
#include <stdio.h>

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

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

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

      return 0;
}

FishC 发表于 2023-12-28 15:25:13

liyifeng295641 发表于 2023-12-28 15:24
下面是小甲鱼给的答案,@FishC解析一下代码。
#inclu ...

这段代码是一个使用do-while循环实现的求和程序。以下是对代码的解析:

1. 在程序开始处,我们定义了两个变量`num`和`sum`,用于存储用户输入的数字和计算求和结果。`num`是浮点数类型,`sum`是双精度浮点数类型。

2. 程序进入主循环`do-while`,首先会执行一次循环体内的代码。

3. 在循环体内部,首先会提示用户输入一个合法的数字。

4. 然后,使用内层的do-while循环来获取用户输入的数字。在内层循环中,我们首先将当前的`num`值加到`sum`中,然后使用`scanf`函数尝试读取一个浮点数,并将读取的结果存储到`num`中。

5. 然后,我们检查`getchar`函数的返回值是否为换行符('\n'),以及`scanf`函数的返回值是否为1。如果不是,说明用户输入的数字无效或输入结束,内层循环将会停止。

6. 外层循环使用`status`的值来判断是否继续进行下一次循环。如果`status`为1,则表示继续循环;否则,停止循环。

7. 最后,我们输出求和的结果并返回0,表示程序正常结束。

这段代码的逻辑比较简单,通过嵌套的do-while循环和条件判断,可以接收用户输入的多个数字,并计算它们的和。输出结果时使用了`%.2lf`格式化输出保留两位小数。

希望这样解析对您有帮助!如果还有其他问题,请随时提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-28 15:27:09

FishC 发表于 2023-12-28 15:25
这段代码是一个使用do-while循环实现的求和程序。以下是对代码的解析:

1. 在程序开始处,我们定义了两 ...

在代码上给点注释

FishC 发表于 2023-12-28 15:27:21

liyifeng295641 发表于 2023-12-28 15:27
在代码上给点注释

好的,以下是给代码加上注释的版本:

#include <stdio.h>

int main(){
    float num = 0;            // 用户输入的数字
    double sum = 0;             // 求和结果
    int status;               // scanf 函数的返回值

    do {
      printf("请输入合法的数字:");

      do {
            sum = sum + num;                  // 将当前的 num 值加到 sum 中
            status = scanf("%f", &num);         // 尝试读取一个浮点数,并将结果存储到 num 中
      } while (getchar() != '\n' && status == 1);   // 检查输入是否结束或者输入的数字无效

    } while(status == 1);                        // 如果上一次的 scanf 成功,则继续循环

    printf("结果是:%.2lf\n", sum);                // 输出求和的结果
    return 0;
}

希望这样清晰明了的注释可以帮助你更好地理解代码的含义。如果还有疑问,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: C语言for语句和循环嵌套03