例题2-4 数据统计
输入一些整数,求出它们的最小值,最大值和平均值(保留3位小数)。输入保证这些数都是不超过1000整数。
自己增加一个输出和的功能 这样平时可以用来记分。
1 #include<stdio.h>
2 int main()
3 {
4 int x, n =0, min=0, max=0, s=0;
5 while(scanf("%d",&x)==1)
6 {
7 s+=x;
8 if(min>x)min=x;
9 else if(max<x)max=x;
10 n++;
11 }
12 printf("%d %d %.3lf\n",min,max,(double)s/n );
13 printf("%d\n",s);
14 return 0;
15 }
~
注意:
1. 程序输入的个数是不确定的,所以无法确定读取的个数,这时候借助 scanf的返回值!
scanf返回当前的语句中成功输入的变量个数。输入结束时无法再获得x的值,将返回0.
2.输入完了之后,如何告诉程序输入结束呢?
windows下数输入完 Enter , Ctrl+Z 没有测试
linux下输入完后 Enter, Ctrl +D
3.注意变量未赋值之前的值是不确定的,此时进行比较会产生各种奇怪的事情。
4.变量输入完再告诉编译器比较麻烦,可以直接用管道符号解决。
echo 1 2 22 3 3 145 45 1 321 54 2 2 1 5 45 6 45 | ./exa2-4
0 321 41.353
703
但是仍然不够方便!
5.将输入输出都保存在文件中才是最方便的!
但是并不是所有比赛都允许用重定向方式访问文件。
比赛前需要了解文件读写的相关规定:是标准输入输出(也就是标准I/O),还是文件输入输出?如果是文件输入输出,是否禁止用重定向方式访问文件?
应严格遵守比赛的文件名规定,包括程序文件名或输入输出文件名(不要弄错大小写,拼错文件名,使用绝对或相对路径)。
有一种方法可以在本机测试时候使用文件重定向,但一旦提提交到比较就自动“删除”重定向语句。
1 #define LOCAL
2 #include<stdio.h>
3 #define INF 1000000000
4 int main()
5 {
6 #ifdef LOCAL
7 freopen("exa2-4.data.in","r",stdin);
8 freopen("exa2-4.data.out","w",stdout);
9 #endif
10 int x, n =0, min =INF, max =-INF, s=0;
11 while(scanf("%d",&x)==1)
12 {
13 s+=x;
14 if(min>x)min=x;
15 else if(max<x)max=x;
16 n++;
17 }
18
19 printf("%d %d %.3lf\n",min,max,(double)s/n );
20 return 0;
21 }
如果比赛中要求写标准输入输出,只要在提交前把#define LOCAL删除即可。
一个更好的方法是在编译选项中定义LOCAL符号,这样提交之前就完全不用更改代码,大大降低出错的可能!
把exa2-4.redirect.c中的 #define LOCAL 删除,然后编译的时候加上 -DLOCAL选项!
edward@edward:~/Desktop/Algorithm$ gcc -o exa2-4.redirect exa2-4.redirect.c -DLOCAL
edward@edward:~/Desktop/Algorithm$ ./exa2-4.redirect
edward@edward:~/Desktop/Algorithm$ cat exa2-4.data.out
2 423 97.900
可以得到一样的结果。验证了正确性。