观前提醒:为了避免可能的争议,本系列文章只在当周实验截止后更新,仅用于作者做题时思考的记录和经验分享。希望不仅对我自己,也能够对看到这篇文章的各位有所帮助。
此外,题目中的思路仅为我个人能够想出来的解法,如果有不足还请谅解,若有更好的解法还请斧正,欢迎讨论。
【山东大学程序设计】IO方式专项训练
A. 两数相加,以EOF终止
Input
多行数据,每行两个整数 A A A和 B B B。
Output
每行一个整数,代表 A + B A+B A+B。
Input Sample
1 5
10 20
Output Sample
6
30
Code & Tips
这一类的输入输出,实际上是以输入流的结束符EOF为标志,实现终止的。EOF(End of File)是文件结束的标志符,在输入流中也意味着输入流的结束。
cin >> a
的返回值是cin
对象,表示了输入流的有效与否。当输入结束后遇到EOF的时候,输入流无效,自然while循环条件就会为假而终止。于是可以利用这个特点实现输入输出。
#include<iostream>
using namespace std;
int main()
{
int a, b;
while(cin >> a)
{
cin >> b;
cout << a + b << endl;
}
return 0;
}
B. 多行求和,以EOF终止
Input
多组数据,每组数据占一行,每行多个整数。
Output
每行一个整数,代表这若干个数字之和。
Input Sample
1 2 3 4
1 2 3 4 5
Output Sample
10
15
Code & Tips
稍微有点意思了。因为是一行结算一次,而且每行有多少个数字是不确定的,所以我们可以使用string读取一行,读取方式则是使用getline()函数。
其中,getline()的返回值和cin一样,都是输入流对象,所以输入结束时流失效,while条件为假退出循环。
此外,关于如何处理读取到的字符串:
- 反向读取,从最后一个数的个位开始读取,这是因为从个位开始便于读取高位。
- 数位为x,初始时x=1代表个位,每再读取一位,x就乘10。数位与字符串代表的数字相乘就可以加入到答案变量ans中。
- 每遇到一个空格就重置x为1,为读取下一个数做准备。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
while(getline(cin, s))
{
int ans = 0;
int x = 1;
int len = s.size();
for(int i = len - 1; i >= 0; --i)
{
if(s[i] <= '9' && s[i] >= '0')
{
ans += x * (s[i] - '0');
x *= 10;
}
else
{
x = 1;
}
}
if(s != "") cout << ans << endl;
}
return 0;
}
C. 两个十六进制数相加,以EOF终止
Input
多组数据,每组数据占一行,包含两个十六进制整数 a a a和 b b b。
十六进制数字可能含有大写字母或小写字母。
Output
每行一个十进制整数,代表 a + b a+b a+b。
Input Sample
1 9
A B
a b
Output Sample
10
21
21
Code & Tips
在上一题的基础上稍作了修改,虽然固定是每行2个数据,但这个程序也可以处理多个数据的情况。
关键在于十六进制与十进制的转换,以及大写与小写的统一,这里统一为小写。
这里仍然用x表示数位并反向扫描字符串,初始时x=1代表个位,但每再读取一位,x就乘16而不是10。注意将小写字母转换为10~15的数字,然后数位与字符串代表的数字相乘后加入到答案变量ans中。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
while(getline(cin, s))
{
int ans = 0;
int x = 1;
int len = s.size();
for(int i = len - 1; i >= 0; --i)
{
if(s[i] >= 'A' && s[i] <= 'Z')
s[i] = s[i] - 'A' + 'a';
}
for(int i = len - 1; i >= 0; --i)
{
if(s[i] <= '9' && s[i] >= '0')
{
ans += x * (s[i] - '0');
x *= 16;
}
else if(s[i] >= 'a' && s[i] <= 'z')
{
ans += x * (s[i] - 'a' + 10);
x *= 16;
}
else
{
x = 1;
}
}
if(s != "") cout << ans << endl;
}
return 0;
}