//字符串
//PTA 天梯 L1-064 估值一亿的AI核心代码
//无论用户说什么,首先把对方说的话在一行中原样打印出来;
//-直接输出 cout
//消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
//-两个循环 去首尾空格,【i,j】 判断空格符 留一个 若后一个为符号 则覆盖空格符
//把原文中所有大写英文字母变成小写,除了 I;
//-判断是否为大写字母(除I) str[i]+32;
//把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
//-独立! 判断前后是否为空或者符号 i=0判断后一位为空或者符号 i=le判断前一位为空或者符号 中间判断前后是否为空或符号
//-作一个check() 来判断
/*
bool check(int x,int y,int len) //x为判断单词前一位 y为单词后一位 len为字符串的长度
if((x<0||str[x]==' '||ispunct(str[x]))&&(y>=len&&str[y]==' '||ispunct(str[y])))
return true;
return false;
*/
//把原文中所有独立的 I 和 me 换成 you;
//-独立! 判断前后是否为空或者符号 i=0判断后一位为空或者符号 i=le判断前一位为空或者符号 中间判断前后是否为空或符号
//把原文中所有的问号 ? 换成惊叹号 !;
//-判断是否为? 替换为! if() str[i]='!';
//在一行中输出替换后的句子作为 AI 的回答。
//-cout<<"AI: ";
//采用存放输出的形式 存放修改的字符串在goal中
#include<iostream>
#include<algorithm>
#include<cctype>
using namespace std;
string str;
bool check(int x,int y,int len) //x为判断单词前一位 y为单词后一位 len为字符串的长度
{
if((x<0||str[x]==' '||ispunct(str[x]))&&(y>=len||str[y]==' '||ispunct(str[y])))
return true;
return false;
}
int main()
{
int T;cin>>T;
getchar();
while(T--)
{
getline(cin,str);
//输出原话
cout<<str<<endl;
int i=0,j=str.length()-1;
//去掉首、尾空格
while(str[i]==' ') i++;
while(str[j]==' ') j--;
//对str字符串进行规整化
int cot=0;
for(;i<=j;i++,cot++)
{
if(isupper(str[i])&&str[i]!='I') //大写非I
str[cot]=str[i]+32;//转小写 +32
else if(str[i]=='?')//修改?为!
str[cot]='!';
else if(str[i]==' ')//去多余的空格
{
str[cot]=' ';
while(str[++i]==' ');//判断下一个是否为空格
if(ispunct(str[i]))//若为符号 覆盖空格
cot--;
i--;
}
else//不修改
str[cot]=str[i];
}
string goal="";
for(int i=0;i<cot;i++)
{
if(str[i]=='I'&&check(i-1,i+1,cot))
goal+="you";
else if(str.substr(i,2)=="me"&&check(i-1,i+2,cot))
goal+="you",i+=1;
else if(str.substr(i,7)=="can you"&&check(i-1,i+7,cot))
goal+="I can",i+=6;
else if(str.substr(i,9)=="could you"&&check(i-1,i+9,cot))
goal+="I could",i+=8;
else
goal+=str[i];
}
//输出AI的话
goal="AI: "+goal;
cout<<goal<<endl;
}
return 0;
}
/* 反思:
刚摸到这个题目的时候,感觉不是很难的啊,然后就埋头写了起来,写着写着发现情况越来越多,需要考虑的东西也越来越多
并没有一个很好的解决思路,在模棱两可、充满不确定的情况下写程序,最终的结果也能看出来!失败失败 lose
写到最后,也选择了放弃,最主要的原因就是,思路太乱,情况太多,考虑不全,程序的容错性太差
总结:本题 我感觉是字符串
对于这类题目(文字很多,要求很多) 细节很重要,一个细节不注意 可能就是不断的查 不断的查 最后也不一定能做出来
最好的办法就是,在写之前拟一条完整的思路,在满足容错性的情况下 再展开去写程序
记住!当代码重复出现的时候 去多写一个函数来减少冗余代码 增添可读性
这道题目也让我对字符串的使用有了一个深入的认识
*/
版权声明:本文为ZzzhuiyizzZ原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。