代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int sum = 0;
double ave = 0;
double sum2 = 0;
int qua = 0;
int tri ;
printf("请输入一个整数:");
tri = scanf_s("%d", &a);
while (tri ==1)
{sum = sum + a;qua = qua + 1;sum2 = (double)sum;ave = sum2 / qua;printf("已输入的所有整数之和=%d\n", sum);printf("已输入的所有整数的平均值=%5.2f\n", ave);printf("您是否想继续下去?是请继续输入其他整数,否请输入f。\n");printf("请输入一个整数:");tri = scanf_s("%d", &a);
}return 0;
}
运行结果:
用户每键入一个整数都会输出一次求和和平均值,并且本次输入的内容,会为下一次循环是否开启提供触发。
逻辑框图:
这里可能犯一个经典错误,请看以下代码:
int a = 0;int sum = 0;double ave = 0;int qua = 0;int tri = 1;while(tri!=0){printf("请输入一个整数:");tri=scanf_s("%d", &a);sum = sum + a;qua = qua + 1;ave = sum / qua;printf("已输入的所有整数之和=%d\n", sum);printf("已输入的所有整数的平均值=%5.2f\n", ave);printf("您是否想继续下去?是请继续输入其他整数,否请输入0。\n");
代码原本希望实现:键入其他整数,都可以完成计算,键入0即停止循环。但是犯了错。
错误一:while(tri!=0)的含义是,只要触发值非0那么这个循环就可以继续下去。原始的触发int tri = 1,触发开始。但是循环体内 tri=scanf_s("%d", &a);这行代码使得即使键入0,循环也会继续。因为只要键入成功,scanf()的返回值永远是1,即tri==1恒成立。只有键入非十进制整数时,返回值才是0。
错误二:这样写,平均值的小数部分被完全忽略了。
错误三:如果我第一次输入整数10,第二次输入11,那么原本我应该得到的是和为21,平均值为10.50.但是运行之后发现,11被多加了一次才停止。如下图所示。
这是由于:tri=scanf_s("%d", &a);代码执行的太超前了。虽然已经键入了f,下一次循环被中止了,但是tri=scanf_s("%d", &a);语句后面还有
sum = sum + a;qua = qua + 1;ave = sum / qua;
这样的加和动作,键入f未能成功放进a地址,于是a地址内存的还是上一次键入的11,于是sum=sum+11又被多执行了一次。
循环体内如果要赋值下一轮循环的触发,必须要放在循环体的最后一句。防止其后的语句被多执行一次。