输入一些整数,求出它们的最大值、最小值、平均值(保留三位小数)。输入保证这些数都是不超过1000的整数。
样例输入:
2 8 3 5 1 7 3 6
样例输出:
1 8 4.375
基于文件重定向:
#define LOCAL //作用:仅在本机使用重定向,提交时将其删掉
#include <stdio.h>
const int INF=10000;
int main(){
#ifdef LOCAL // 只有在定义了LACAL的情况下才编译下面两条freopen语句
freopen("datain.txt","r",stdin);
freopen("dataout.txt","w",stdout);
#endif
int n=0,x,sum=0,max=-INF,min=INF;//允许这样子定义和赋值交错;不是max=INF,min=-INF
while(scanf("%d",&x)==1){
sum+=x;
n++;
if(max<x) max=x;
if(min>x) min=x;
}
printf("%d %d %.3f\n",min,max,(double)sum/n);//若sum=6,n=4,(sum和n均为int) 答案为1.500 而非1.000
return 0;
}
注意点:1.#ifdef #endif 是写在main函数里面
2.当把freopen语句删掉之后,就是很普通的标准输入输出了
基于fopen:
#include <stdio.h>
const int INF=10000;
int main(){
FILE *fin,*fout; //声明变量
fin=fopen("datain.txt","rb");
fout=fopen("dataout.txt","wb");
int n=0,sum=0,max=-INF,min=INF,x;
while(fscanf(fin,"%d",&x)==1){
sum+=x;
n++;
if(max<x) max=x;
if(min>x) min=x;
}
fprintf(fout,"%d %d %.3f\n",min,max,(double)sum/n);
fclose(fin); //关闭文件
fclose(fout);
return 0;
}
注意点:1.fscanf 和fprintf 只是在scanf和printf中添加了一个目标文件参数而已。
备注:上面代码跑不出来,并没有成功读取文件。
关于输入方式的总结:
标准输入输出:即读键盘、写屏幕
文件输入输出:
- 重定向
注意的问题:遵循比赛中的文件名规定(程序文件名、输入输出文件名)、注意大小写、不要拼错文件名、不要使用相对路径或者绝对路径、、
使用特定方法使得只在本地进行文件重定向 - fopen
使用框架:
① File *fin,*fout; (定义)
fin=fopen(“data.in”,”rb”);
fout=fopen(“data.out”,”wb”);
② fscanf(fin,”%d”,&x); (输入输出)
fprintf(fout,”%d”,x);
③ fclose(fin); (关闭)
fclose(fout); - 优劣比较
重定向:简单,但是不可以同时读写文件和标准输入输出
fopen:复杂,但是灵活度较大(如可以反复打开并读写文件)
其中,如果想要把fopen版的程序改写为标准输入输出型,只需赋值fin=stdin,fout=stdout, 并且不需要调用fopen 和 fclose。