SP1163 题解

题目传送门

小学生又来写题解啦!

本题显然是字符串模拟,认真维护好每个要求即可。

首先先判断是情况一还是情况二,如果同时出现,输出报错信息。

我们可以用一个函数实现上述功能。

若是情况一,枚举下划线位置,再加以判断是否报错。

若是情况二,枚举大写字母位置

若什么情况都不是,直接输出原字符串。

其中关于报错的细节在代码中会说明。

满分代码:

#include <iostream>
#include <cstdio>
using namespace std;
string s;
int len;
int find_op() //寻找属于哪种情况。 
{
	bool a = false, b = false;  
	for (int i = 0; i < len; i++) 
		if (s[i] == '_') //有情况一。 
		{
			a = true;
			break;
		}
	for (int i = 0; i < len; i++) 
		if ('A' <= s[i] && s[i] <= 'Z')  //有情况二。 
		{
			b = true;
			break;
		}
	if (a && b) return -1;  //情况共存,爆掉。 
	if (a) return 1;
	if (b) return 2;
	return 3;  //啥情况都没有。 
}
void calc(int t)
{
	if (t == -1) 
	{
		printf("Error!\n");
		return;
	}
	else if (t == 1)
	{
		if (s[0] == '_' || s[len-1] == '_')     //若首尾是下划线,爆掉。 
		{
			printf("Error!\n");
			return;
		}
		string ans = ""; 
		for (int i = 0; i < len; i++)
		{
			if (s[i] == '_')
			{
				if ('a' <= s[i+1] && s[i+1] <= 'z') //后一个得是小写字母。 
				{
					ans += s[i+1] - 'a' + 'A';
					i++;	//作用为跳过下一个字符。 
				}
				else
				{
					printf("Error!\n");      //不是小写字母,爆掉。 
					return;
				}
			}
			else ans += s[i];
		}
		cout << ans << endl;
	}
	else if (t == 2)
	{
		if ('A' <= s[0] && s[0] <= 'Z')        //首位是大写字母,爆掉。 
		{
			printf("Error!\n");
			return;
		}
		for (int i = 0; i < len; i++)
		{
			if ('A' <= s[i] && s[i] <= 'Z') cout << "_" << (char)(s[i] - 'A' + 'a');  //大写转小写。 
			else cout << s[i];
		}	
		cout << endl;
	}
	else if (t == 3) cout << s << endl; 	//什么情况都没有。 
}
int main()
{
	while (cin >> s)   //处理多组数据。 
	{
		len = s.length();
		int t = find_op();
		calc(t);
	}
	return 0;
}

首发:2022-01-29 09:57:57

posted @ 2022-08-25 00:00  liangbowen  阅读(11)  评论(0编辑  收藏  举报