输入和输出处理
试题一般采用标准输入和输出方式读取输入和产生输出,在题目中会详细描述输入和输出的格式和值域范围,所写的程序一定要严格遵守题目指定的输入输出格式。
数据之间有空行
对于这种输出,有时候还会告诉你有几组输入,这样你就可以自己判断一下是不是最后一组。是就不输出空行,否则多输出一个空行。而有时候连共有几组数据都不会告诉你。其实不论知不知道有几组数据,我们都可以这样处理。 第一组数据后面不加空行。第二组开始,每组前面加空行。
试题一般采用标准输入和输出方式读取输入和产生输出,在题目中会详细描述输入和输出的格式和值域范围,所写的程序一定要严格遵守题目指定的输入输出格式。
在比赛试题的输入和输出处理上,针对一些常见的情形,有一些常用的方法。
1、输入输出的重定向
一般用下面两种方法
c++常用:
#include<fstream.h>
ifstreamfilein("data.in"); // 定义一个文件输入流
ofstreamfileout("data.out"); //cout<< --> fileout<<
filein.eof() //文件到末尾,返回非零值
data.in表示输入的数据文件
本地测试的话本来输入的数据就要在这个文件里面测试了
建一个本地的文本data.in,可以用记事本的方式打开
注意:文件输入的话,以后的cin>>都要改成filein>>, cout<<都要改成fileout<<
由于ACM竞赛题目的输入数据和输出数据一般有多组(不定),并且格式多种多样,所以,如何处理题目的输入输出是对大家的一项最基本的要求。这也是困扰初学者的一大问题。ACM的输入输出要求严格按照规定来,所以你不需要输出像"Pleaseinput the data"这类的提示语。否则将会被判Wrong Answer。
2、输入
初学者一般有个误区:如果题目包含多组测试数据,他们就会把输入的内容全部保存起来,然后再依次处理。其实程序的输入\输出是相互独立的,因此,每当处理完一组测试数据,就应当按题目要求进行相应的输出操作。而不必将所有结果储存起来一起输出。
下面来介绍一下ACM中常见的一些输入情况。
只有一组测试数据,这类题目是最简单的,参考代码:
#include<iostream>
using namespace std;
int main()
{
int a, b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
没有明确指出输入什么时候结束,如果是这种情况,我们默认是以“文件结束”(EOF)为结束标志。这是ACM的默规,参考代码:
#include<iostream>
using namespace std;
int main()
{
int a, b;
while(cin>>a>>b)
cout<<a+b<<endl;
return 0;
}
指定数据量 ,有时会在数据的第一行提供数据量大小,比如第一行是100,则表示有100组数据。参考代码:
#include<iostream>
using namespace std;
int main()
{
int n,a,b;
cin>>n;
while(n--)
{
cin>>a>>b;
cout<<a+b<<endl;
}
return 0;
}
以特定元素作结束符 ,这种输入和第一种类似。常见的是规定以0作为结束符。参考代码:
#include<iostream>
using namespace std;
int main()
{
int a, b;
while(cin>>a>>b, a||b)
{
cout<<a+b<<endl;
}
return 0;
}
3、输出
输出格式统一,这种比较简单,只要按要求来就没问题的。比如每组输出占一行,或者每组输出后面加一个空行。数据之间有空行
对于这种输出,有时候还会告诉你有几组输入,这样你就可以自己判断一下是不是最后一组。是就不输出空行,否则多输出一个空行。而有时候连共有几组数据都不会告诉你。其实不论知不知道有几组数据,我们都可以这样处理。 第一组数据后面不加空行。第二组开始,每组前面加空行。
关于C++的输入输出处理:
cin读字符串时遇到空白符(空格,换行等)结束char str[BUFFER];
while (cin >> str) {
}
getline读字符串时遇到换行符结束,用于读一整行
char str[BUFFER];
while (cin.getline(str, BUFFER)) {
}
string str;
while (getline(cin, str)) {
}
cin/cout要比scanf/printf慢一些,尽可能使用scanf/printf以避免测试大量数据时因为输入输出慢而导致TLE.putchar/getchar要比scanf/printf更快