[ACM_1] 输入输出 | 多行 | 多组 | getline(cin,s) | cin处理
1. 多⾏输⼊,每⾏两个整数
错误:
#include<bits/stdc++.h>
using namespace std;
int a=0,b=0;
int main()
{
while(1)
{
cin>>a>>b;
cout<<a+b<<endl;
}
return 0;
}
正确:
#include<bits/stdc++.h>
using namespace std;
int a=0,b=0;
int main()
{
while(cin>>a>>b)
{
cout<<a+b<<endl;
}
return 0;
}
多行输入,直接将输入流,放为循环条件
2. 多组数据,每组第⼀⾏为n, 之后输⼊n⾏两个整数
错误
#include<bits/stdc++.h>
using namespace std;
long long n=0,a=0,b=0;
int main()
{
cin>>n;
while(n--)
{
cin>>a>>b;
cout<<a+b<<endl;
}
}
注意:多组数据,n 也要循环输入
#include<bits/stdc++.h>
using namespace std;
long long n=0,a=0,b=0;
int main()
{
while(cin>>n)
{
while(n--)
{
cin>>a>>b;
cout<<a+b<<endl;
}
}
return 0;
}
3. 若⼲⾏输⼊,每⾏输⼊两个整数,遇到特定条件终⽌
#include<bits/stdc++.h>
using namespace std;
long long a,b;
int main()
{
while(cin>>a>>b)
{
if(a==0 && b==0) break;
cout<<a+b<<endl;
}
return 0;
}
4. 若⼲⾏输⼊,遇到0终⽌,每⾏第⼀个数为N,表示本⾏后⾯ 有N个数
正确:
注意:如何实现累加 同行输入
#include<bits/stdc++.h>
using namespace std;
long long n=0,a=0,ret=0;
int main()
{
while(cin>>n)
{
ret=0; //初始化
if(n==0) break;
while(n--)
{
cin>>a;
ret+=a;
}
cout<<ret<<endl;
}
return 0;
}
✔️这个地方 cin a,n 的输入 什么时候通过 换行,什么时候通过' '来实现,系统是怎么识别的
- 空格和换行符对整数
cin >>
是等效的,均被视为分隔符 - getline(cin,s) 空格不起作用,要通过换行符
5. 若⼲⾏输⼊,每⾏包括两个整数a和b,由空格分隔,每⾏输出 后接⼀个空⾏
正确:
#include<bits/stdc++.h>
using namespace std;
long long a,b;
int main()
{
while(cin>>a>>b)
{
cout<<a+b<<endl;
cout<<endl;
}
return 0;
}
⭕6. 多组n⾏数据,每⾏先输⼊⼀个整数N,然后在同⼀⾏内输⼊ M个整数, 每组输出之间输出⼀个空⾏
错误
#include<bits/stdc++.h>
using namespace std;
int N=0,n=0,a=0,ret=0;
int main()
{
while(cin>>N)
{
while(N--)
{
cin>>n;
int ret=0;
while(n--)
{
cin>>a;
ret+=a;
}
cout<<ret<<endl;
cout<<endl;
}
}
return 0;
}
多组数据之间也错误的换行了
正确
#include<bits/stdc++.h>
using namespace std;
int N=0,n=0,a=0,ret=0;
int main()
{
while(cin>>N)
{
while(N--)
{
cin>>n;
int ret=0;
while(n--)
{
cin>>a;
ret+=a;
}
cout<<ret<<endl;
if(N!=0) cout<<endl;
}
}
return 0;
}
加个判断就好啦~
⭕7. 多组样例,每组输入字符串,字符⽤空格分隔 ,输出 为⼩数点后两位
格式:
string s;
while (getline(cin, s)) { // 接受⼀整⾏字符串
for(int i = 0; i < s.size();i++) { // 遍历字符串
cout << fixed << setprecision(2) << ans << endl;
//!!!! 两位小数格式输出
正确
#include <bits/stdc++.h>
using namespace std;
double ret = 0.00, ans = 0.00;
string s;
int main() {
while (getline(cin, s)) {
int count = 0;
double ret = 0.00;
if(s.empty()) return 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] != ' ') {
count++;
if (s[i] == 'A')
ret += 4.00;
if (s[i] == 'B')
ret += 3.00;
if (s[i] == 'C')
ret += 2.00;
if (s[i] == 'D')
ret += 1.00;
if (s[i] == 'F')
ret += 0.00;
if (s[i] == 'E' || s[i] >= 'G')
ret = -1.00;
}
if (ret == -1.00)
break;
}
if (ret == -1.00)
cout << "Unknown" << endl;
else {
ans = ret / (double)count;
cout << fixed << setprecision(2) << ans << endl;
//!!!! 两位小数格式输出
}
}
return 0;
}
8. 多组测试⽤例,第⼀⾏为正整数n, 第⼆⾏为n个正整数,n=0 时,结束输⼊,每组输出结果的下⾯都输出⼀个空⾏
错误
#include<bits/stdc++.h>
using namespace std;
int n=0;
int main()
{
while(cin>>n)
{
if(n==0) break;
int sum=0,count=0;
vector<int> nums(n);
int a=0;
while(n--)
{
cin>>a;
sum+=a;
nums.push_back(a);
}
int ans=sum/nums.size();
for(int& n:nums)
{
count+=abs(n-ans);
}
cout<<count/2<<endl<<endl;
//积木移动 要除以2
}
return 0;
}
正确
9. 多组测试数据,每组数据只有⼀个整数,对于每组输⼊数据, 输出⼀⾏,每组数据下⽅有⼀个空⾏
正确·
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
while(getline(cin,s))
{
int ret=0;
for(char& c:s)
{
int n=c-'0';
if(c%2==0) ret+=n;
}
cout<<ret<<endl<<endl;
}
}
在C++11及以前中,整数和字符串互相转化的api
oj url :卡码网KamaCoder