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

例题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

可以得到一样的结果。验证了正确性。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值