《算法入门经典》笔记 2.4 算法竞赛中的输入输出框架

146 阅读2分钟

例题2-5 数据统计


输入一些整数,求出它们的最小值、最大值和平均值(保留3位小数)。输入保证这些 数都是不超过1000的整数。 样例输入: 2 8 3 5 1 7 3 6 样例输出: 1 8 4.375

当整数的个数是不确定的该怎么编写?

#include<stdio.h>
int main()
{
int x, n = 0, min, max, s = 0;
while(scanf("%d", &x) == 1)
{
s += x;
if(x < min) min = x;
if(x > max) max = x;
n++;
}
printf("%d %d %.3f\n", min, max, (double)s/n);
return 0;
}
  1. scanf函数有返回值,它返回的是成功输入的变量个数,当输入结束时,scanf函数无法再次读取x,将返回0。

  2. 输入“2 8 3 5 1 7 3 6”,按Enter键,但未显示结果。空格、TAB和回车符都是无关紧要的,所以按Enter键并不意味着输入的结束。那如何才能告诉程序输入结束了呢?

    • 提示2-19:在Windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再按Enter 键,即可结束输入。在Linux下,输入完毕后按Ctrl+D键即可结束输入。
  3. 输入终于结束了,但输出却是“1 2293624 4.375”?max未赋初值

    • 提示2-20:变量在未赋值之前的值是不确定的。特别地,它不一定等于0。
  4. 使用文件最简单的方法是使用输入输出重定向,只需在main函数的入口处加入以下两条 语句: freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); 上述语句将使得scanf从文件input.txt读入,printf写入文件output.txt。

数据统计(重定向版)


#define LOCAL
#include<stdio.h>
#define INF 1000000000
int main()
{
#ifdef LOCAL
freopen("[data.in](<http://data.in/>)", "r", stdin);
freopen("data.out", "w", stdout);
#endif
int x, n = 0, min = INF, max = -INF, s = 0;
while(scanf("%d", &x) == 1)
{
s += x;
if(x < min) min = x;
if(x > max) max = x;
/*
printf("x = %d, min = %d, max = %d\n", x, min, max);
*/
n++;
}
printf("%d %d %.3f\n", min, max, (double)s/n);
return 0;
}
  1. 重定向的部分被写在了#ifdef和#endif中。其含义是:只有定义了符号LOCAL,才编译两 条freopen语句。
  2. 上面的代码在程序首部就定义了符号LOCAL,因此在本机测试时使用重定向方式读写文 件。如果比赛要求读写标准输入输出,只需在提交之前删除#define LOCAL即可。