1. 最简单的输入
Description 计算 a+b Input 两个整数 a,b Output a+b的值 Sample Input 1 2 Sample Output 3
C
#include <stdio.h> int main() { int a,b; scanf("%d %d",&a, &b); printf("%d\n",a+b); //对其他题目,换成要求的复杂处理与输出 return 0; }
C++:
#include <iostream> using namespace std; int main() { int a,b; cin >> a >> b; cout << a+b << endl; //对其他题目,换成要求的复杂处理与输出 return 0; }
2. 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止
Description 计算 a + b Input 多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行 Output 每组的两个整数(a和b)求和并输出,每组的求和结果独占一行 Sample Input 1 5 10 20 400 516 Sample Output 6 30 916
C:
#include <stdio.h> int main() { int a,b; while(scanf("%d %d",&a, &b) != EOF) // 输入结束时,scanf函数返回值为EOF(-1),即没有数据输入时会退出while循环 { printf("%d\n",a+b); } return 0; }
说明:scanf函数返回值就是读出的变量个数,如果一个都没有,则返回值是-1。EOF是一个预定义的常量,等于-1。
C++:
#include <iostream> using namespace std; int main() { int a,b; while(cin >> a >> b) { cout << a+b << endl; } return 0; }
说明:当读到输入结束时,cin >> a >> b返回 0,循环也结束
3. 一次运行,要输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个N,接下来是N组数据)
Description 计算 a + b Input 第一行是数据的组数N,从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行 Output 每组的两个整数(a和b)求和并输出,每组的求和结果独占一行 Sample Input 2 1 5 10 20 Sample Output 6 30
C:
#include<stdio.h> int main() { int n,i; int a,b; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&a,&b); printf("%d\n",a+b); } return 0; }
C++:
#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分的,这个结束数据可以要得。
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
C:
#include <stdio.h> int main() { int a,b; while(scanf("%d %d",&a, &b) &&(a||b)) { printf("%d\n",a+b); } return 0; }
C++:
#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(这个名字可以自己定义)。
重定向后,原先从键盘(标准输入的默认设备)接受的输入,将统统从文件读取input.txt读取,这就是重定向。
C:
#include<stdio.h> int main() { freopen("input.txt","r",stdin); //只加这一句输入将被重定向到文件input.txt int a,b; scanf("%d%d",&a,&b); printf("%d\n",a+b); return 0; }
C++:
#include<iostream> #include<fstream> using namespace std; int main() { ifstream fin("input.txt"); //只加这一句输入将被重定向到文件input.txt int a,b; fin>>a>>b; cout<<a+b<<endl; fin.close(); //记得关掉 return 0; }
于是,在运行程序前,将本该由键盘输入的数据,写到文件input.txt中。而在运行程序时,数据将不再需要人去输入。那个快,很享受。
需要注意的是,调试通过的程序,千万不要直接提交到OJ平台上去。如果竞赛中这样做了,罚你的20分钟不要算到我的头上。提交的程序要把输入重定向的一行删除,这样才算是符合要求的,可以获得AC的程序。
除了删除那一行,还有一种简单的做法是,提交前将这一行前加上注释符"//",效果是一样的。
文章来源:
ACM题目中输入数据的处理(C++版),见:http://blog.csdn.net/sxhelijian/article/details/8978850
ACM题目中输入数据的处理(C语言版)见:http://blog.csdn.net/sxhelijian/article/details/8978794