题意简述
- 先输入一些单词并告诉你这是什么语言。
- 然后再给你几段句子,让你找出句子中单词的语言。
题目分析
思路:
看到这种字符串与其他东西一一对应的题,就能想到用 map
。
我们令 dict["key"]
表示 key
单词所属语言的编号。
要用的东西:
map<string, int> dict;
string lans[101];
int n;//语言数量
char c;//读入用字符
string m;//单词字符串
首先,读入 n 行。 对于每一行:
- 将单词字符串
m
初始化为空。 - 如果读到字母,就把字母加在
m
后面。 - 如果读到空格,将
m
作为键存入map
中,值为这个单词所属语言的下标。
(注意单词统一转为小写形式,因为不区分大小写)
for(int i=1; i<=n; i++){
cin>>lans[i];
m="";
cin.get(c);
while(1){
cin.get(c);
if(c==' '){//一个单词结束
if(m=="") continue;//单词为空,舍去
dict[m]=i;//存储单词所属语言的下标
m="";//清空单词
continue;
}
if(c=='\n' || c=='\r'){//一行结束(当前语言读完了)
dict[m]=i;//存储
m="";//清空单词
break;
}
//转换大小写
if(c>='a' && c<='z') m+=c;
else if(c>='A' && c<='Z') m+=(c-'A'+'a');
else m+=c;
}
}
然后,读入若干行(注意行中可能有空格,所以要用 getline
)
每行以"." "," "?" "!" ";" "(" ")" 空格和换行作为分隔符分出单词(用 check
函数实现)。
bool check(char x){
if(x!=' ' && x!='!' && x!='.' && x!='?' && x!=',' && x!=';' && x!='(' && x!=')') return true;//注意!要按题目所给方式分割字符
return false;
}
然后在 map
里查找,如果找到,那就输出语言并换行,再读下一行。
string inp="",t="";
while(getline(cin, inp)){
if(inp==string()) continue;//读入空行,舍去
if(inp[inp.length()-1]=='\r') //有奇怪的字符,舍去
inp.erase(inp.length()-1);
for(int i=0; i<inp.length() && inp.length(); i++){//开始搜了
t="";//初始化
while(check(inp[i]/*检验分隔符*/)&& i<inp.length()){
if(inp[i]>='a' && inp[i]<='z') t+=inp[i];
else if(inp[i]>='A' && inp[i]<='Z') t+=(inp[i]-'A'+'a');
else t+=inp[i];//转换大小写
i++;
}
if(t=="") continue;//空单词,舍去
if(dict[t]!=0){//搜到了
cout<<lans[dict[t]]<<endl;//输出语言并换行
break;//读下一行
}
}
}