赞
踩
有坑!不少
题目:
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
1. 无论用户说什么,首先把对方说的话在一行中原样打印出来;
2. 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
3. 把原文中所有大写英文字母变成小写,除了 I;
4. 把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
5. 把原文中所有独立的 I 和 me 换成 you;
6. 把原文中所有的问号 ? 换成惊叹号 !;
7. 在一行中输出替换后的句子作为 AI 的回答
首先按照规则一对一的想出解决方案:
逻辑分析一波
执行顺序应该为1->2.1->2.2,3,6->4,5->7
#include <iostream> #include <cstdio> #include <string> using namespace std; //@date: 2020-02-01 11:58:40 //@state:YES int judge(char c) {//判断传入的字符是什么 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')) return 1;//字母 else if(c>='0'&&c<='9') return 2;//数字 else if(c==' ') return 0;//空格 else if(c>=33&&c<=126) return -1;//标点符号 return 99;//默认值 } string AI(string ask) {//返回处理结果 //删除行首空格 while(ask[0]==' ') ask.erase(ask.begin()); //删除行尾空格 while(ask[ask.size()-1]==' ') ask.erase(ask.end()-1); for(int i=0;i<ask.size();i++) { //大写变小写 if(ask[i]>='A'&&ask[i]<='Z'&&ask[i]!='I') ask[i]+=32; //?->! if(ask[i]=='?') ask[i]='!'; //删除多余空格 if(ask[i]==' ') { int j=i+1; while(ask[j]==' ') j++; ask.erase(ask.begin()+i+1,ask.begin()+j);//此处参数必须为迭代器,int不行 } } //替换字符串 for(int i=0;i<ask.size();i++) { if(i==0) { if(ask[i]=='I'&&(judge(ask[i+1])<=0||i+1==ask.size())) ask.replace(i,1,"you"); else if(ask.substr(i,2)=="me"&&(judge(ask[i+2])<=0||i+2==ask.size())) ask.replace(i,2,"you"); else if(ask.substr(i,7)=="can you"&&(judge(ask[i+7])<=0||i+7==ask.size())) ask.replace(i,7,"I can"); else if(ask.substr(i,9)=="could you"&&(judge(ask[i+9])<=0||i+9==ask.size())) ask.replace(i,9,"I could"); } if(judge(ask[i])<=0) { if(judge(ask[i+1])==1)//字母 { if(ask[i+1]=='I'&&(judge(ask[i+2])<=0||i+2==ask.size())) ask.replace(i+1,1,"you"); if(ask.substr(i+1,2)=="me"&&(judge(ask[i+3])<=0||i+3==ask.size())) ask.replace(i+1,2,"you"); if(ask.substr(i+1,7)=="can you"&&(judge(ask[i+8])<=0||i+8==ask.size())) ask.replace(i+1,7,"I can"); if(ask.substr(i+1,9)=="could you"&&(judge(ask[i+10])<=0||i+10==ask.size())) ask.replace(i+1,9,"I could"); } } } return ask; } int main() { int n; string ask,ans; cin>>n; cin.get(); while(n--) { getline(cin,ask); cout<<ask<<endl; ans=AI(ask); cout<<"AI: "; for(int i=0;i<ans.size();i++) { //判断符号+空格+符号的特殊情况 if(ans[i]==' '&&judge(ans[i+1])<=0) continue; else cout<<ans[i]; } cout<<endl; } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。