12323sd 发表于 2023-3-29 22:37:06

新手课后作业求助

请教一下这个代码错在那里了,为啥它会多算一次我输入的值呢,而且我发现把b=scanf和sum=a +sum那段代码换个位置,就能正常编译,这是为什么

陌黎城 发表于 2023-3-30 10:09:25

输入A的时候scanf读取失败,没有对a进行赋值,但是a在上一次循环已经被赋值为4了,所以后面sum=sum+a的时候相当于4+4了,看起来就像是加了两次值

myd0311 发表于 2023-4-1 16:12:05

本帖最后由 myd0311 于 2023-4-1 16:13 编辑

一个有效的改法:
#include <stdio.h>

int main() {
        double a = 0, sum = 0;
        int b = 1;
        do {
               
                sum += a;
               
                printf("输入一个数字:");
               
                b = scanf("%lf", &a);
               
        } while (b == 1);
        printf("结果是:%lf", sum);
        return 0;
}

A 不是数字,所以读入失败,返回 -1,但 scanf 没有操作 a 的值,a 还是原来的 a,也就是 4,所以,你应该先判断,再 sum += a

二拾三 发表于 2023-4-1 17:41:20

代码未调换顺序前:
第一次执行do语句:
4(a) + 0(sum) = 4(sum)
因为输入的数字是4,b的值等于1;
故再一次执行do语句:
(A不是数字,故a仍等于4,但现在b等于-1)
4(a) + 4(sum) = 8(sum);
b等于-1,跳出循环,最终sum等于8。

代码调换顺序后:
第一次执行do语句:
0(a) + 0(sum) = 0(sum)
接着a才被赋值为4;
b值为1,第二次执行do语句:
4(a) + 0(sum) = 4(sum)
接着a被赋值为A(不合法数字),故b值为-1,循环结束,sum值为4

都是两次执行do语句,只是调换代码顺序前是先给a赋值再求和,调换代码顺序后就变成了先求和再给a赋值
(本人水平暂低,有可能理解错了)
页: [1]
查看完整版本: 新手课后作业求助