0
点赞
收藏
分享

微信扫一扫

【山东大学程序设计】IO方式专项训练

捡历史的小木板 2022-03-30 阅读 104

观前提醒:为了避免可能的争议,本系列文章只在当周实验截止后更新,仅用于作者做题时思考的记录和经验分享。希望不仅对我自己,也能够对看到这篇文章的各位有所帮助。

此外,题目中的思路仅为我个人能够想出来的解法,如果有不足还请谅解,若有更好的解法还请斧正,欢迎讨论。

【山东大学程序设计】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;
}
举报

相关推荐

0 条评论