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

本文介绍了如何使用C语言进行数据统计,包括计算整数的最大值、最小值和平均值,并探讨了不同比赛环境下文件读写的实现方法。此外,还提供了一些输出技巧和关于浮点数精度问题的警示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


果然。。。 很震惊! ---> 我必须专门花一天学习时间研究清楚浮点数问题,否则这家伙以后会很麻烦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值