原题链接:
http://newoj.acmclub.cn/problems/1690
题目描述:
小安很喜欢英语,她渴望有一本自己独特的字典,但写一本字典并不容易,所以她想出了一个办法:从她最喜欢的一本书中挑出所有不同的单词,按照字典序排列一下就完成了字典的雏形啦。可是,这是一个很大的工程量,为了不让妹子失望,你打算写个程序来完成她的梦想。
你的程序要求按字典序列举出给定输入文本中的所有单词,这个问题中,一个单词的定义是一连串大写或小写字母,单词也可能只有一个字母。同时你还要注意大小写问题,比如“Apple”,“apple” 或 “APPLE”是一样的。
输入:
输入不超过5000行的文本(英文),每行不超过200个字母,输入以EOF终止
输出:
输出文本中出现的不同单词的列表,按字典序排列,一行一个单词,并且都是小写,可以确定的是文本中的单词不超过5000个。
Adventures in Disneyland
Two blondes were going to Disneyland when they came to a fork in the road. The sign read: "Disneyland Left."
So they went home.
a
adventures
blondes
came
disneyland
fork
going
home
in
left
read
road
sign
so
the
they
to
two
went
were
when
在这个过程中,需要一个一个字符的接收数据,使用getchar()函数,直到接收到的数据为EOF为止,windows下的EOF就是新行按下ctrl+z,
判断接收到的是不是字母,如果是小写字母的话,就直接连接到一个字符串上,如果是大写字母的话,就先转换成小写字母,再连接到字符串上,
如果不是字母的话,就将字符串插入到set中,并将字符串初始化为"".
需要注意的是,set中的第一个元素是"",所以要从第二个元素开始遍历。
原因:“”的ascii值要比字母的小,而且在程序运行过程中将字符串初始化成了"",如果下一个字符不是字母的话,那“”就会被插入到set中
代码:
#include <bits/stdc++.h>
//大小写字母的转换 大写字母+32=小写字母 小写字母-32=大写字母
using namespace std;
int main(){
set<string> s1;
set<string>::iterator t1,t2;
char s2;
string s3;
while((s2=getchar()) != EOF){
if(s2 >= 'a'&&s2 <= 'z'){
s3=s3+s2;
}
else if(s2 >= 'A'&&s2 <= 'Z'){
s2+=32;
s3=s3+s2;
//cout<<s3<<endl;
}
else{
//cout<<s3<<endl;
s1.insert(s3);//set集合中不允许有重复元素,所以这样存储是不会出现问题的
s3="";
// cout<<s3;
}
}
// cout<<"yes";
// int count=s1.size();
//cout<<count;
t1 = s1.begin();
t2 = s1.end();
for(t1 = ++t1;t1 != t2;t1++)
cout<<*t1<<endl;
return 0;
}