您的位置:首页 > 其它

『算法学习笔记』10th day. 文件操作<1>

2014-02-26 21:06 423 查看
例题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

可以得到一样的结果。验证了正确性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: