不论是在ACM/ICPC这样类型的比赛中,还是在做项目中,对于输入输出的格式尤为重要,不可以想当然的按自己那一套走,我们需要根据题目要求进行操作,对于第一次接触这方面比赛的小白,最为常见的现象便是类似于下面这行代码
#include <stdio.h>
int main()
{
int a, b;
printf("请输入整数 a 和 b\n");
scanf("%d%d",&a, &b);
printf("a和b的和为%d的",a + b);
return 0;
}
倘若题目没有要求你,千万不要有多余的输出,虽然在测试的时候方便自己,但也麻烦在提交运行时注释掉,因为电脑可没有你的大脑那样灵活,他要对比的数据很死板,多一个空格少一个空格都不行,所以,在这一块的处理一定要 细心!细心!再细心! 下面我们来看下常见的输入输出格式有哪些
1. 单组数据输入输出
题目要求输入一组整数a和b,然后输出a和b的和
C++
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}
C
#include <stdio.h>
int main()
{
int a, b;
scanf("%d%d",&a, &b);
printf("%d\n", a + b);
return 0;
}
2. T组数据输入输出
题目要求输入T组整数a和b,然后对于每组的输入,分别输出对应a和b的和。常见的有两种方法,分别是while循环和for循环。
while循环方式
C++
#include <iostream>
using namespace std;
int main()
{
int t, a, b;
cin >> t;
while(t--)
{
cin >> a >> b;
cout << a + b << endl;
}
}
C
#include <stdio.h>
int main()
{
int t, a, b;
scanf("%d", &t);
while(t--)
{
scanf("%d%d",&a, &b);
printf("%d\n", a + b);
}
}
for循环方式
C++
#include <iostream>
using namespace std;
int main()
{
int t, a, b;
cin >> t;
for(int i = 0; i < t; i++)
{
cin >> a >> b;
cout << a + b << endl;
}
}
C
#include <stdio.h>
int main()
{
int t, a, b;
scanf("%d", &t);
for(int i = 0; i < t; i++)
{
scanf("%d%d",&a, &b);
printf("%d\n", a + b);
}
}
3. 多组数据的输入输出(具体有几组不告诉你,而竞赛中最常见的就是这种方式)
题目要求输入多组整数a和b,然后对于每组的输入,分别输出对应a和b的和。
不告诉你究竟有几组数组,该如何处理这种情况呢?首先说一下评测系统是如何判断你的程序是否正确的
实际上评测系统是把程序的标准输入输出数据都是放在文本文件里,你提交的程序会先经过编译,然后运行,从输入文件中
读取数据,然后把结果输出到一个文本文件中,评测系统再把标准的输出文件和你提交的程序运行的结果的输出文件进行对
比,从而判断你提交的程序的正确与否。既然是这样,要判断提交的程序的正确性就依赖于系统的测试数据,这时就不可能
只是用一组测试数据来判断程序的正确性,需要有很多组测试数据,而国际ACM比赛标准的评测系统是PC2,它只支持一个题
目一个输入数据文件、一个输出数据文件。所以这时候就得把多组测试数据放在一个文件里,提交的程序必须把这个文件里
的多组输入数据都得出结果。
现在我们了解了评测系统是把测试数据放在文件中的,既然这样我们就可以通过判断是否已经到了文件尾部来判断有多少组
数据,判断文件尾的方法如下:
C++
#include <iostream>
using namespace std;
int main()
{
int a, b;
while(cin >> a >> b)//C++把cin语句放在while循环中。
{
cout << a + b << endl;
}
}
C
#include <stdio.h>
int main()
{
int a, b;
//一共有三种方式
while(scanf("%d%d",&a, &b) != EOF)//EOF的值为-1,而scanf当没有输入的时候会返回 - 1
{
printf("%d\n", a + b);
}
while(scanf("%d%d",&a, &b) == 2)//有几个输入,那么scanf就返回几,所以说这样写也可以
{
printf("%d\n", a + b);
}
/*对scanf的返回值取按位反,-1按位取反会变为0,只要返回值不为-1,就一直读下去,如果到了-1,则说明到了文件
尾了。*/
while(~scanf("%d%d",&a, &b))
{
printf("%d\n", a + b);
}
}
有没有发现,对于多组输入的a和b,是边输入边输出,而不是将这些数存到某数组里面,在输入结束时,再对其进行分别
输出。 如果你还是小白,千万不要忽视这一点,兴许你现在还没不以为然,但一定要有这个思维。
4. 多组数据的输入输出,以某种标志结束输入
题目要求输入多组整数a和b,然后对于每组的输入,分别输出对应a和b的和,当a, b同时为0时结束
C++
#include <iostream>
using namespace std;
int main()
{
int a, b;
while(cin >> a >> b)
{
if(a == 0 && b == 0)
break;
cout << a + b << endl;
}
}
C
#include <stdio.h>
int main()
{
int a, b;
while(scanf("%d%d",&a, &b) != EOF)
{
if(a == 0 && b == 0)
break;
printf("%d\n", a + b);
}
}