有坑!不少
题目:
本题要求你实现一个稍微更值钱一点的 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;
}
原文:https://www.cnblogs.com/AllenMi/p/12257632.html