例题2-4 数据统计(续)
输入一些整数,求出它们的最小值,最大值和平均值(保留3位小数)。输入保证这些数都是不超过1000整数。
自己增加一个输出和的功能 这样平时可以用来记分。
并不是所有比赛都允许用重定向方式访问文件。
比赛前需要了解文件读写的相关规定:是标准输入输出(也就是标准I/O),还是文件输入输出?如果是文件输入输出,是否禁止用重定向方式访问文件?
如果比赛要求用文件输入输出,但是禁止使用重定向方式。
1 #include<stdio.h>
2 #define INF 1000000000
3 int main()
4 {
5 FILE *fin, *fout;
6 fin=fopen("exa2-4.data.in","rb");
7 fout=fopen("exa2-4.data.out","wb");
8 int x, n =0, min =INF, max =-INF, s=0;
9 while(fscanf(fin,"%d",&x)==1)
10 {
11 s+=x;
12 if(min>x)min=x;
13 else if(max<x)max=x;
14 n++;
15 }
16
17 fprintf(fout, "%d %d %.3lf\n",min,max,(double)s/n );
18 fclose(fin);
19 fclose(fout);
20 return 0;
21 }
~
对比之前的重定向程序,代码如下:
1 #include<stdio.h>
2 #define INF 1000000000
3 int main()
4 {
5 #ifdef LOCAL
6 freopen("exa2-4.data.in","r",stdin);
7 freopen("exa2-4.data.out","w",stdout);
8 #endif
9 int x, n =0, min =INF, max =-INF, s=0;
10 while(scanf("%d",&x)==1)
11 {
12 s+=x;
13 if(min>x)min=x;
14 else if(max<x)max=x;
15 n++;
16 }
17
18 printf("%d %d %.3lf\n",min,max,(double)s/n );
19 return 0;
20 }
~
可看到一些直观的改变,已用红色标明。
重定向和fopen方法各有优劣。重定向的方法写起来简单,但是不能同时读写文件和标准输入输出;fopen写法比较繁琐,但是灵活性好(可以反复打开并读写文件)。
输出技巧 编号q2-1
1 #include<stdio.h>
2 int main()
3 {
4 int i, n;
5 scanf("%d", &n);
6 for(i=1;i<=n;i++)
7 printf("%d\n",i);
8 return 0;
9 }
为了输出2,4,6,8...2n, 每个一行。试通过修改下列程序来实现
任务1修改第7行,不修改第6行
显然应该改为 printf("%d\n",2*i);
任务2 修改第6行, 不修改第7行
改为 for(i=2;i<=2*n;i+=2)
浮点数陷阱 编号q2-2
运行下面的程序,看看结果是不是和想象的一样。
1 #include<stdio.h>
2 int main()
3 {
4 double i;
5 for(i=0;i!=10;i+=0.1)
6 printf("%.1lf\n",i);
7 return 0;
8 }
果然。。。 很震惊! ---> 我必须专门花一天学习时间研究清楚浮点数问题,否则这家伙以后会很麻烦!