【再思考】PATBasic——1033. 旧键盘打字(20)

1033. 旧键盘打字(20)

时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

输入格式:

输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过105个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。

注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出格式:

在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。

输入样例:
7+IE.
7_This_is_a_test.
输出样例:

_hs_s_a_tst

#include<vector>
#include <sstream>
#include<cmath>
#include<iomanip>
#include<iostream>
#include <ctype.h>
#include <stdlib.h>

using namespace std;

int main()
{
	string a, b;
	cin >> a >> b;
	//a = "7IE.";
	//b = "7_This_is_a_test.";
	int ifcap= a.find('+');
	vector<char> outputs;
	if (ifcap >= 0)//如果字符串中包含加号
	{
		for (int i = 0; i < b.length(); i++)
		{
			char bi = b[i];
			if (!isupper(bi))//如果不是大写字母,进行以下操作
			{
				int flag = 0;
				for (int j = 0; j < a.length(); j++)
				{
					if (bi == a[j])
					{
						break;
					}					
					else if ((isalpha(bi)) && (abs(bi - a[j]) == 32))//判断是否为字母,且不区分大小写
					{
						break;
					}
					else//注意这里不能直接push_back,应该是与a中字符都对应判断过了,没有出现,再放入容器中
					{
						flag++;						
					}
				}
				if (flag == a.size())
				{
					outputs.push_back(bi);
				}
			}
			else//如果是大写字母,直接跳到下一字符
			{
				continue;
			}			
		}
	}
	else//如果不包含加号
	{		
		for (int i = 0; i < b.length(); i++)
		{
			char bi = b[i];
			int flag = 0;
			for (int j = 0; j < a.length(); j++)
			{
				if (bi == a[j])
				{
					break;
				}
				else if ((isalpha(bi)) && (abs(bi - a[j]) == 32))
				{
					break;
				}
				else
				{
					flag++;
				}
			}
			if (flag == a.size())
			{
				outputs.push_back(bi);
			}			
		}
	}
	if (outputs.size() == 0)
	{
		cout << endl;
	}
	else
	{
		for (int i = 0; i < outputs.size(); i++)
		{
			cout << outputs[i];
		}
	}	
	return 0;
}

第二版本,得分20分。回头想想,这题真的不难,居然还能把我纠结这么久!总结经验:
1、读题,理解清楚题意很重要!每个题拿到后,认真读题,分析,在纸上写下思路,然后才开始写代码;
2、用if-else的时候,要注意,考虑了if,就要对应到else,不要想当然的以为是自己考虑的那些情况,其实很多时候,都会漏掉边界条件
#include<vector>
#include <sstream>
#include<cmath>
#include<iomanip>
#include<iostream>
#include <ctype.h>
#include <stdlib.h>
#include <algorithm>

using namespace std;

bool IfinAstr(char c, string a)//函数判断字符c是否在字符串a中,返回bool型的变量
{
	bool temp = false;
	for (int i = 0; i < a.length(); i++)
	{
		if (c == a[i])
		{
			temp = true;
		}
	}
	return temp;
}


int main()
{
	string a, b;
	getline(cin, a);
	getline(cin, b);
	
	if (a == "")//一定要注意这里,a有可能是空
	{
		cout << b;
	}
	else
	{
		bool ifupper = false;//默认大写键是好的。可以输出大写字母

		int num = a.find('+');

		if (num >= 0)
		{
			ifupper = true;
		}
		for (int i = 0; i < b.length(); i++)
		{
			char c = b[i];
			if (isalpha(c))//如果是字母
			{
				if (isupper(c))//如果是大写字母
				{
					if ((ifupper == false) && (!IfinAstr(c, a)))//如果上档键没坏,且该字符不在a里
					{
						cout << c;
					}
					else
					{
						continue;
					}
				}
				else//如果是小写字母
				{
					if (!IfinAstr(toupper(c), a))//判断其对应的大写字母是否在其中
					{
						cout << c;
					}
					else
					{
						continue;
					}
				}
			}
			else//如果不是字母
			{
				if (!IfinAstr(c, a))
				{
					cout << c;
				}
				else
				{
					continue;
				}
			}
		}
	}
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值