输入一些整数,求出它们的最小值,最大值与平均值(平均值带三位小数点),输入的整数保证要小于1000。
样例输入:2 8 3 5 1 7 3 6
样例输出:1 8 4.375
分析:难点是输入一些整数,如果是输入五个六个数字那可能大部分读者都会写,下面给出初步的程序:
#include<Stdio.h>
int main(){
int max,min,n = 0,x, s = 0;
//scanf函数的返回值是输入整形数字的个数。
while (scanf("%d", &x) == 1){ //错误想法:输入一个数如果等于1就进循环,否则就不进
s = s + x; //正确想法:只要输入一个int型整数就能进,如果输入字符或者符号就不进入循环。
if (x > max){
max = x;
}
if (x < min){
min = x;
}
n++;
}
printf("%d %d %.3lf", max, min, (double)s/n); //平均数可以在printf函数里面
// 这样表示:(double)s/n .很奇妙。
return 0;
}
注意:在Windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再按Enter键,即可结束输入。此程序没有赋予max与min的值,所以需要解决:第一种解决方法是在开头定义一个很大的数比如INF = 1000000,而min的值开始应该是很大的,反过来max的值应该是很小的。min = INF, max = -INF。
另一种方法是先读取第一个整数x ,然后令max =min =x 。这样的好处是避免了人为的“假想无穷大”值,程序更加优美;而
I NF这样的常数有时还会引起其他问题,如“无限大不够大”,或者“运算溢出”,后面还会继续讨论这个问题。
上面的程序并不是很方便:每次测试都要手动输入许多数。尽管可以用前面讲的管道的方法,但数据只是保存在命令行中,仍然不够方便。一个好的方法是用文件——把输入数据保存在文件中,输出数据也保存在文件中。这样,只要事先把输入数据保存在文件中,就不必每次重新输入了;数据输出在文件中也避免了“输出太多,一卷屏前面的就看不见了”这样的尴尬,运行结束后,慢慢浏览输出文件即可。如果有标准答案文件,还可以进行文件比较,而无须编程人员逐个检查输出是否正确。事实上,几乎所有算法竞赛的输入数据和标准答案都是保存在文件中的。使用文件最简单的方法是使用输入输出重定向,只需在m ain 函数的入口处加入以下两条语句:
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
下面是程序:进阶版。
#define LOCAL //只有定义了LOCAL才能使用下面的freopen语句。
#include<Stdio.h>
#define INF 100000000
int main(){
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
int max = -NIF,min = NIF,n = 0,x, s = 0;
//scanf函数的返回值是输入整形数字的个数。
while (scanf("%d", &x) == 1){ //错误想法:输入一个数如果等于1就进循环,否则就不进
s = s + x; //正确想法:只要输入一个int型整数就能进,如果输入字符或者符号就不进入循环。
if (x > max){
max = x;
}
if (x < min){
min = x;
}
n++;
}
printf("%d %d %.3lf", max, min, (double)s/n); //平均数可以用printf函数里面
// 这样表示:(double)s/n .很奇妙。
return 0;
}