呼市做无痛人流z首大网站,html5 制作手机网站,成都网站建设选择到访率,做网站怎么开发客户源【题目描述】
输入一些整数#xff0c;求出它们的最小值、最大值和平均值#xff08;保留3位小数#xff09;。输入保证这些数都是不超过1000的整数。
【样例输入】
2 8 3 5 1 7 3 6
【样例输出】
1 8 4.375
【题目来源】
刘汝佳《算法竞赛入门经典 第2版》 例题2-5…【题目描述】
输入一些整数求出它们的最小值、最大值和平均值保留3位小数。输入保证这些数都是不超过1000的整数。
【样例输入】
2 8 3 5 1 7 3 6
【样例输出】
1 8 4.375
【题目来源】
刘汝佳《算法竞赛入门经典 第2版》 例题2-5 数据统计 【解析】
本题的难点在于输入整数的个数是不确定的。因为不知道会输入多少个整数程序只能通过循环不断要求用户输入直到用户发出“输入结束”信号。
循环输入的代码很简单但是用户的“输入结束”信号是什么呢程序怎么接收这个信号呢
按我们以前的经验都是输入后按Enter键后开始输出比如求两个整数的和。
#includestdio.h
int main(){int a,b;scanf(%d %d, a, b);printf(%d\n, ab);return 0;
}
输入两个整数后按Enter程序就会输出结果看起来Enter键就是“输入结束”信号。但是假如我们在输入第一个数后就直接按Enter呢你发现程序并没有输出任何结果它依然在等着你输入由此可见Enter并不是“输入结束”信号。
Enter发出的是“提交”信号。输入一个数按Enter相当于对scanf说老哥给你交1个数
但scanf要的是两个数回答老弟你只交了1个还差1个继续
所以当你欠scanf老哥数字债时不管按多少个Enter都无法结束输入。
如果输入9 5 2 7后按Enter就是对scanf说老哥给你交4个数。
scanf老哥一看要求满足了也不贪心只取前两个后面赠送的忽略不计。
那用什么发出“输入结束”信号之前的文章“用恋爱脑搞懂scanf的返回值”已有介绍在Windows下输入完毕后按Enter键然后按CtrlZ键再按Enter键即可结束输入。在Linux下输入完毕后按CtrlD键即可结束输入。
显然Windows下“CtrlZ”就是“输入结束”信号为什么输入这个信号后还要加上一个Enter呢别忘了Enter的作用是“提交”它得把这个“输入结束”信号“提交”给程序。
注意使用这个“输入结束”信号有两个条件
①“输入结束”信号只是对当前的scanf老哥发出的并不是对整个程序发出因而它只能结束当前的scanf输入。
②“输入结束”信号要正常发挥作用必须是在当前scanf语句未输入任何数据前按CtrlZ。
换句话说上面的代码要想使用CtrlZ结束输入只能在程序运行后在未输入任何数据时就先按CtrlZ然后程序就会在没有输入任何数据的情况下结束输入。
所以准确地说CtrlZ发出的“输入结束”信号是没有任何输入的“输入结束”信号。
这么看这个CtrlZ根本没个鸟用。
事实并非如此因为当CtrlZ在发出“输入结束”信号的同时scanf()函数会返回EOF实际值为-1咱们可以利用这个返回值再借助于循环实现有数据输入的“输入结束”。
代码如下
#includestdio.h
#define INF 1000000000
int main(){int x, n 0, min INF, max -INF, s 0;while(scanf(%d, x) 1){s x;if(x min) min x;if(x max) max x;n;}printf(%d %d %.3f\n, min, max, (double)s/n);return 0;
}
当输入完数据后按Enter键再按下CtrlZ然后再按下Enter就会向当前正在执行scanf函数发出“输入结束”信号当前scanf函数在没有任何有效输入的情况下结束输入。此时scanf返回EOF致使循环条件不成立结束循环。
为什么输入数据后要先按下Enter键再按CtrlZ呢因为这样才能满足上面说的第②个条件。
不过上述代码不先按Enter键也是能正常运行的甚至在输入完数据后按任何一个字母都能输出正确结果。这是因为当输入的不是整数时匹配失败scanf函数会返回0同样能结束循环。注意此时CtrlZ只被当作字符串处理而不会被scanf视为“输入结束”信号。