🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# **ACM题目中常用的输入输出方式** * 由于ACM竞赛题目的输入数据和输出数据一般有多组(不定),并且格式多种多样,所以,如何处理题目的输入输出是对编程者最基本的要求。 * 多组输入的意思是在代码运行完一组数据后,仍能继续运行下一组数据,直到文件内的数据运行完为止。下面会以a+b 为样例来讲解。 ## **输入** ### **第一类** 题目中告诉我们需要运行几组数据。如:<br> 输入数据有T组,每组占一行,有两个整数a, b。 你需要计算每组数据之和并输出。 原题:[链接](http://acm.hdu.edu.cn/showproblem.php?pid=1090) #### 代码 ``` C #include<stdio.h> int main() { int T; int a,b; scanf("%d",&T); while(T--) { scanf("%d %d",&a,&b); printf("%d\n",a+b); } return 0; } C++ #include <iostream> using namespace std; int main(){ int T,a,b; cin>>T; while(T--){ cin>>a>>b; cout<<a+b<<endl; } return 0; } ``` 上面代码中while(T--)我们也可以用for循环来写,如for( i=0; i<T; i++)。 ### **第二类** 题目中没有说明需要运行多少组数据,而是说要运行到文件结束,或者是要求以EOF为结尾,亦或者以某某数等于0为结尾。如:<br> 输入包含多个测试用例,一个包含一行。 每个案例以整数N开头,然后在同一行中跟随N个整数。 输出对于每一行N个整数之和。 例题:[链接](http://acm.hdu.edu.cn/showproblem.php?pid=1094)(以EOF为结尾) [链接](http://acm.hdu.edu.cn/showproblem.php?pid=1093)(以a和b都等于0为结尾) #### 代码 ``` C #include <stdio.h> int main() { int a,i,n,sum; while(scanf("%d",&n)!=EOF) /*还可以这样写while(~scanf("%d",&n)),但如果题目要求以EOF为结尾,则必须用EOF*/ { sum=0; /*sum不能在循环外进行处理*/ for(i=0;i<n;i++) { scanf("%d",&a); sum+=a; } printf("%d\n",sum); } return 0; } C++ #include<iostream> using namespace std; int main(){ int a,i,n,sum; while(cin>>n){ sum=0; for(i=0;i<n;i++){ cin>>a; sum+=a; } cout<<sum<<endl; } return 0; } ``` 以a和b都等于0为结束的代码就写个主要的while循环,while(cin >> a >> b && (a != 0 || b != 0)) 。 #### **字符串输入** 在学习时,我们经常会遇到关于字符串的应用,有的题目中会告诉你该字符串有几个字符组成,这样的输入很简单,我们不再做详解;我们在这里主要讲一下未知字符串的输入,也就是说不知道有几个字符。我们存储字符串时一般用字符数组,现在我们定义一个字符数组: `char ch[100] ;` 1. **字符串中没有空格** 当字符串中没有空格时,这样的输入就相对简单了,可以直接用 **%s**(以空格或回车为结束符) 去接收,或者用C++的**cin**(同样以空格或回车为结束符) 即可: `scanf("%s",ch); //(C++) cin>>ch;` 2. **字符串中有空格** 当字符串中有空格时,%s就不适用了,原因上面已讲明。当然,无论字符串中又没有空格都会以回车为结尾,所以我们可以循环接收**字符**并加以判断即可: ``` int x=0; char a; while(scanf("%c",&a)!=EOF&&a!='\n') ch[x++]=a; ``` 上面是C语言的写法,相比来说我更喜欢C++的方法,因为简单,只有一个函数**getline**。 `getline()的原型是istream& getline ( istream &is , string &str , char delim );` 其中 **istream &is** 表示一个输入流,譬如cin;**string &str**表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);**char delim**表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\\n',也就是回车换行符(遇到回车停止读入),如: `getline(cin, ch);`