一道天梯赛搞得全场人崩溃的题,几乎现场就没几个人AC,现在回头看看,真的很考细节耐心地题目。
-----------------------------题目-----------------------------
- 无论用户说什么,首先把对方说的话在一行中原样打印出来;
- 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
- 把原文中所有大写英文字母变成小写,除了 I;
- 把原文中所有独立的 I 和 me 换成 you;
- 把原文中所有的问号 ? 换成惊叹号 !;
- 把原文中所有独立的 can you 换成 I can —— 这里“独立”是指被空格或标点符号分隔开的单词;
- 在一行中输出替换后的句子作为 AI 的回答
输入样例:
6 Hello ? Good to chat with you can you speak Chinese? Really? Could you show me 5 What Is this prime? I,don 't know
输出样例:
Hello ? AI: hello! Good to chat with you AI: good to chat with you can you speak Chinese? AI: I can speak chinese! Really? AI: really! Could you show me 5 AI: could you show you 5 What Is this prime? I,don 't know AI: what Is this prime! you,don't know
-----------------------------题目-----------------------------
一、正式题解:
1* 函数原型声明:
void deleteSymbolSpace(); void deleteSpace(); void bigToSmall(); void changePersonY(); void changePersonI(); void changeQ(); bool isIndenpend(char temp);
deleteSymbolSpace —— 删除符号前的空格
deleteSpace —— 删除多余空格
bigToSmall —— 将大写转小写
changePersonY —— 改变人称You
changePersonI —— 改变人称I me
changeQ —— 问号改为感叹号
isIndenpend —— 判断是否独立函数
2* 主函数框架构建:
int main() { scanf("%d",×); getchar(); while(times--) { memset(temp,0,sizeof(temp)); memset(tMark,0,sizeof(tMark)); cin.getline(temp,2000); puts(temp); changeQ(); bigToSmall(); deleteSpace(); changePersonY(); changePersonI(); deleteSpace(); deleteSymbolSpace(); printf("AI: "); puts(temp); } return 0; }
抛开细节的实现方式,从大局角度思考程序的运行方式。
3*deleteSymbolSpace的实现:
void deleteSymbolSpace() { memset(dealing,0,sizeof(dealing)); count = 0; for(int i = 0;i<strlen(temp);i++) { if(temp[i] == 32) { int flag = 0; if(temp[i+1]>=33 && temp[i+1]<=47) flag = 1; else if(temp[i+1]>=58 && temp[i+1]<=64) flag = 1; else if(temp[i+1]>=91 && temp[i+1]<=96) flag = 1; else if(temp[i+1]>=123 && temp[i+1]<=126) flag = 1; if(flag == 1) { dealing[count] = temp[i+1]; count++; i=i+1; } else { dealing[count] = temp[i]; count++; } } else { dealing[count] = temp[i]; count++; } } dealing[count] = '