【PTA-天梯赛】【 L1-064】【估值一亿的AI核心代码(20分)】

  • Post author:
  • Post category:其他


//字符串 

//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 版权协议,转载请附上原文出处链接和本声明。