[NBOJ0061][Sapphire的反转文]

[题目要求]

http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=61

[题目设计的相关理论与算法]
C++中string处理,包括find的方法,几种初始化方法
反转文的理解
宏定义

[题目中需要注意的地方]
题目中说到的,每个单词遇到“#”号结束,只是说遇到井号把之前的所有符号保留顺序,但是不包括#号,#号该怎么处理就怎么处理。
与此同时,如果单词一直输入到末尾,也就是说即使没有#号,我们也要将其归入到一个单词中,这时前面的find函数查找“#”会返回npos,这时要单独作为一个情况处理,具体见代码。

[思路过程]
将一整行读入,然后遍历,遇到字符是字母的就检测后面的#号,并把之间的所有内容加入到一个string数组中,其他的符号都是单独成一个string加入到数组。
两个小时左右,按理说也是一道水题,但是谁让咱基础不过硬,许多string中的方法和参数还是查的书,才正确使用。希望以后慢慢熟悉,越来越快。

[代码]

#include<iostream>
#include<string>
int const MAX = 1200;
#define ALP (sAll[i] <= 90 && sAll[i]>=65) || (sAll[i]<=122 && sAll[i]>=97) 
//这里使用宏定义简写对字母查找的代码,但是实际上后面也只用了一次= =,想起来就用一下哈
using namespace std;
int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);	
	string sAll;		//这里输入的原始数据,包括各种符号和单词
	getline(cin,sAll);
	string sTable[MAX];	//建立一个string列表,用来对最后的提取单词之后的列表翻转。最坏情况是全部都是单字符。
	int k=0;			//用来记录
	string::size_type i=0,first=0,last=0;//注意类型,貌似是unsigned,但是这么写肯定不会错。
	while(i < sAll.length())
	{
		if(ALP)
		{		
			first =i;					//其实每次只用i作为查找起始点就可以了,这里只是便于理解。
			last = sAll.find('#',first);//查找遇到字母后的“#”号
			if(last == string::npos)	//如果没有查到,说明一直到结尾都是单词的内容,那么就全部算作一个对象
			{
				string s(sAll,first);	//注意这个初始化方法。不写长度参数,就是到结尾都算进来。
				sTable[k++] = s;
			}
			else 
			{
				string s(sAll,first,last-first);//last-first就是长度。注意不包括#号
				sTable[k++] = s;
			}			
			i=last;					//下次遍历的七点。
		}
		else
		{
			sTable[k++] = sAll[i++];//如果不是字母,那么每一个都是单独的对象来处理。
		}
	}
	for(int i = 0;i<k/2;i++)	//翻转过程。
	{
		string s = sTable[i];
		sTable[i] = sTable[k-i-1];
		sTable[k-i-1] = s;
	}
	for(int i=0;i<k;i++)		//将翻转后的结果输出。
		cout<<sTable[i];
	cout<<endl;
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}

[尾声]
题目做得很顺利,还是觉得这题比较水。我现在也会跳一些题了=。=,哎。。畏难情绪了。。我现在遇到北邮这些题一方面也查一下pku有没有,如果pku有,即使难我也做,因为感觉北邮做的人好少=。=,遇到点问题都不知道和谁讨论下。。继续努力!

你可能感兴趣的:(String类,ACM,Sapphire的反转文,字符反转处理)