ACM题目中输入数据的处理(C++版)
2015-10-11 10:23
417 查看
本文转载自:http://blog.csdn.net/sxhelijian/article/details/8978850
ACM题目中输入数据的处理(C语言版)见:http://blog.csdn.net/sxhelijian/article/details/8978794
ACM竞赛题目的输入数据常要求有多组,并且格式多种多样,这是初次登OJ平台的同学的一个障碍。实际上,这些格式可以归为固定的几种类型,本文介绍各种类型的处理方法,以帮助同学们克服这些障碍。
实际上,这些模式不仅是OJ平台上做题的需要。在平时的自由编程练习中,也可以自行使用这些模式,以提高调试程序的效率。对程序测试的意识也将在此过程中得到提升。
本文1-4部分介绍了几种类型输入的处理,第5部分介绍通过输入重定向提高调试程序效率的方法。
1. 最简单的输入
例1:
[plain] view
plaincopyprint?
Description
计算 a+b
Input
两个整数 a,b
Output
a+b的值
Sample Input
1 2
Sample Output
3
这种最简单的输入,接受一组输入,针对这组输入计算出值即可。这与平时的程序设计并无差异。解决办法是:
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a+b << endl; //对其他题目,换成要求的复杂处理与输出
return 0;
}
2. 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止
例2:
[plain] view
plaincopyprint?
Description
计算 a + b
Input
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行
Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
Sample Input
1 5
10 20
400 516
Sample Output
6
30
916
这种输入包含多对输入数据,需要构造一个循环读取。因为没有指出到底有多少对输入,要有办法判断输入何时结束。解决办法是:
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
int main()
{
int a,b;
while(cin >> a >> b)
{
cout << a+b << endl;
}
return 0;
}
说明1:当读到输入结束时,cin >> a >> b返回 0,循环也结束。
说明2:在调试程序时,键盘输入的数据,用CTRL-Z(即按住CTRL键不放,再按下Z)组合作为输入结束,此谓键盘输入设备的“文件末尾”。
3. 一次运行,要输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个N,接下来是N组数据)
例3:
[plain] view
plaincopyprint?
Description
计算 a + b
Input
第一行是数据的组数N,从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行
Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
Sample Input
2
1 5
10 20
Sample Output
6
30
需要先读入第一行确定组数N,而后写一次执行N次的循环进行处理即可。解决办法是:
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
int main() {
int a, b, n;
cin >> n;
for(i=0;i<n;i++)
{
cin >> a >> b;
cout << a + b << endl;
}
return 0;
}
4. 输入不说明有多少组数据,但以某个特殊输入为结束标志。平时做题中常见诸如“输入学生成绩,以-1结束”,没有学生得-1分的,这个结束数据可以要得。
例4:
[plain] view
plaincopyprint?
Description
计算 a + b
Input
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行。当输入为 0 0 时,输入结束。
Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行。
Sample Input
1 5
10 20
0 0
Sample Output
6
30
构造循环对数据进行处理,将是否遇到了要求结束的输入,作为循环是否结束的依据。解决办法是:
[cpp] view
plaincopyprint?
#include<iostream>
using namespace std;
int main()
{
int a ,b;
while(cin>>a>>b&&(a||b))
{
cout<<a+b<<endl;
}
return 0;
}
有关字符和字符串数据的输入,在此不再多讲,只要将相关的函数用好即可,也可以找到相关资料参考。
5. 利用文件重定向提高调试效率
编程得到正确结果前,往往需要多次运行程序,每次运行都需要花费不少的时间从键盘输入数据。每次输入的数据都是相同的时,会给人的心理带来不爽的感觉,并造成时间上的浪费。无论平时练习还是ACM竞赛实战,这些都是可以避免的。方法是,运用重定向。
用下面的形式调用函数freopen()会将标准输入stdin重定向到文件input.txt(这个名字可以自己定义)。
[cpp] view
plaincopyprint?
freopen("input.txt","r",stdin); //设置输入和输出文件
重定向后,原先从键盘(标准输入的默认设备)接受的输入,将统统从文件读取input.txt读取,这就是重定向。程序可以写作:
[cpp] view
plaincopyprint?
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
freopen("input.txt","r",stdin); //只加这一句输入将被重定向到文件input.txt
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
于是,在运行程序前,将本该由键盘输入的数据,写到文件input.txt中。而在运行程序时,数据将不再需要人去输入。那个快,很享受。
需要注意的是,调试通过的程序,千万不要直接提交到OJ平台上去。如果竞赛中这样做了,罚你的20分钟不要算到我的头上。提交的程序要把输入重定向的一行删除,这样才算是符合要求的,可以获得AC的程序。
除了删除那一行,还有一种简单的做法是,提交前将这一行前加上注释符"//",效果是一样的。
[cpp] view
plaincopyprint?
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
//freopen("input.txt","r",stdin); //只加这一句输入将被重定向到文件input.txt
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
还有用条件编译处理的方法,暂不讲了。
ACM题目中输入数据的处理(C语言版)见:http://blog.csdn.net/sxhelijian/article/details/8978794
ACM题目中输入数据的处理(C语言版)见:http://blog.csdn.net/sxhelijian/article/details/8978794
ACM竞赛题目的输入数据常要求有多组,并且格式多种多样,这是初次登OJ平台的同学的一个障碍。实际上,这些格式可以归为固定的几种类型,本文介绍各种类型的处理方法,以帮助同学们克服这些障碍。
实际上,这些模式不仅是OJ平台上做题的需要。在平时的自由编程练习中,也可以自行使用这些模式,以提高调试程序的效率。对程序测试的意识也将在此过程中得到提升。
本文1-4部分介绍了几种类型输入的处理,第5部分介绍通过输入重定向提高调试程序效率的方法。
1. 最简单的输入
例1:
[plain] view
plaincopyprint?
Description
计算 a+b
Input
两个整数 a,b
Output
a+b的值
Sample Input
1 2
Sample Output
3
这种最简单的输入,接受一组输入,针对这组输入计算出值即可。这与平时的程序设计并无差异。解决办法是:
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a+b << endl; //对其他题目,换成要求的复杂处理与输出
return 0;
}
2. 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止
例2:
[plain] view
plaincopyprint?
Description
计算 a + b
Input
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行
Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
Sample Input
1 5
10 20
400 516
Sample Output
6
30
916
这种输入包含多对输入数据,需要构造一个循环读取。因为没有指出到底有多少对输入,要有办法判断输入何时结束。解决办法是:
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
int main()
{
int a,b;
while(cin >> a >> b)
{
cout << a+b << endl;
}
return 0;
}
说明1:当读到输入结束时,cin >> a >> b返回 0,循环也结束。
说明2:在调试程序时,键盘输入的数据,用CTRL-Z(即按住CTRL键不放,再按下Z)组合作为输入结束,此谓键盘输入设备的“文件末尾”。
3. 一次运行,要输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个N,接下来是N组数据)
例3:
[plain] view
plaincopyprint?
Description
计算 a + b
Input
第一行是数据的组数N,从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行
Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
Sample Input
2
1 5
10 20
Sample Output
6
30
需要先读入第一行确定组数N,而后写一次执行N次的循环进行处理即可。解决办法是:
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
int main() {
int a, b, n;
cin >> n;
for(i=0;i<n;i++)
{
cin >> a >> b;
cout << a + b << endl;
}
return 0;
}
4. 输入不说明有多少组数据,但以某个特殊输入为结束标志。平时做题中常见诸如“输入学生成绩,以-1结束”,没有学生得-1分的,这个结束数据可以要得。
例4:
[plain] view
plaincopyprint?
Description
计算 a + b
Input
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行。当输入为 0 0 时,输入结束。
Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行。
Sample Input
1 5
10 20
0 0
Sample Output
6
30
构造循环对数据进行处理,将是否遇到了要求结束的输入,作为循环是否结束的依据。解决办法是:
[cpp] view
plaincopyprint?
#include<iostream>
using namespace std;
int main()
{
int a ,b;
while(cin>>a>>b&&(a||b))
{
cout<<a+b<<endl;
}
return 0;
}
有关字符和字符串数据的输入,在此不再多讲,只要将相关的函数用好即可,也可以找到相关资料参考。
5. 利用文件重定向提高调试效率
编程得到正确结果前,往往需要多次运行程序,每次运行都需要花费不少的时间从键盘输入数据。每次输入的数据都是相同的时,会给人的心理带来不爽的感觉,并造成时间上的浪费。无论平时练习还是ACM竞赛实战,这些都是可以避免的。方法是,运用重定向。
用下面的形式调用函数freopen()会将标准输入stdin重定向到文件input.txt(这个名字可以自己定义)。
[cpp] view
plaincopyprint?
freopen("input.txt","r",stdin); //设置输入和输出文件
重定向后,原先从键盘(标准输入的默认设备)接受的输入,将统统从文件读取input.txt读取,这就是重定向。程序可以写作:
[cpp] view
plaincopyprint?
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
freopen("input.txt","r",stdin); //只加这一句输入将被重定向到文件input.txt
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
于是,在运行程序前,将本该由键盘输入的数据,写到文件input.txt中。而在运行程序时,数据将不再需要人去输入。那个快,很享受。
需要注意的是,调试通过的程序,千万不要直接提交到OJ平台上去。如果竞赛中这样做了,罚你的20分钟不要算到我的头上。提交的程序要把输入重定向的一行删除,这样才算是符合要求的,可以获得AC的程序。
除了删除那一行,还有一种简单的做法是,提交前将这一行前加上注释符"//",效果是一样的。
[cpp] view
plaincopyprint?
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
//freopen("input.txt","r",stdin); //只加这一句输入将被重定向到文件input.txt
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
还有用条件编译处理的方法,暂不讲了。
ACM题目中输入数据的处理(C语言版)见:http://blog.csdn.net/sxhelijian/article/details/8978794
相关文章推荐
- C语言之转义字符、变量的内存机制
- 【LeetCode从零单刷】Ugly Number I, II & Super Ugly Number
- 【C语言】判断花括号{}是否匹配
- C++结构体内存对齐小结
- VS2010中“工具>选项中的VC++目录编辑功能已被否决”解决方法
- C++与类型转换相关的四个关键字及其特点
- [C/C++基础知识] 一篇就让你彻底搞懂qsort快速排序的文章
- Leetcode NO.125 Valid Palindrome
- C语言的标识符命名规则
- 熊猫阿波的故事及C++保留小数点的问题
- C++primer学习:关联容器练习(4)
- C++STL之string上
- 转载:读懂C/C++递归
- hdoj 2030 汉字统计 (汉字机内码特点) C++
- C语言的随机数
- C语言 用链表实现电话本的功能
- C语言 用顺序表实现电话本的功能
- C++ 中stringstream 的作用
- 带你玩转Visual Studio——带你理解微软的预编译头技术
- c++ primer学习笔记6_标准库string