其他分享
首页 > 其他分享> > 第四章学习小结

第四章学习小结

作者:互联网

第四章学习小结

  上周一共有三道编程题,因为对于KMP算法理解得还不是很透彻,我就用AI核心代码作为例子。这道题是老师带着我们打的,所以这道题完成得比较轻松。

本题要求你实现一个简易版的 AI 英文问答程序,规则是:

  1. 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  2. 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  3. 把原文中所有大写英文字母变成小写,除了 I;
  4. 把原文中所有独立的 I 和 me 换成 you;
  5. 把原文中所有的问号 ? 换成惊叹号 !;
  6. 把原文中所有独立的 can you 换成 I can —— 这里“独立”是指被空格或标点符号分隔开的单词;
  7. 在一行中输出替换后的句子作为 AI 的回答。

按照老师的方法,我们先不用具体想怎样去实现,先想好用什么步骤

int main()
{
    int n;
    string s;
    cin >> n;
    getchar();            //吸收回车
    for(int i=1; i<=n; i++){
        getline(cin ,s);
        cout << s << endl;
        cout << "AI: ";
        go(s);            //根据s输出AI的回答 
    }     
    return 0;
} 
View Code

然后把所有的功能都用go函数去完成

void go(string s)
{
    char t[3003];
    int i,j=0;
    
    for(i=0; s[i]==' '; i++)            //删掉开头空格
        j=0;
    
    while(s[i]!='\0'){                                //连续的空格中只保留第一个空格 
        if(s[i]==' ' && s[i-1]==' '){
        i++;
        continue;
        } 
    
    if(s[i]=='?'){                                    //将?转换为! 
        t[j]='!';
        i++;
        j++;
        continue;
    } 
    
    if(s[i]!='I')                                    //将I以外的大写字母转换为小写 
        t[j++]=tolower(s[i++]);
    else
        t[j++]=s[i++];
    } 
    t[j] = '\0';
        
    //把原文中所有独立的 I 和 me 换成 you,所有独立的 can you 换成 I can
    j = 0;
    while(t[j]!='\0'){        //还未到结尾 
        if(t[j]=='I' && (j==0 || isDependent(t[j-1])) && isDependent(t[j+1])){  //I换成you 
            cout << "you";
            ++j;
            continue;
        }
        if(t[j]=='m' && t[j+1]=='e' && (j==0 || isDependent(t[j-1])) && isDependent(t[j+2])){    //me换成you 
            cout << "you";
            j+=2;
            continue; 
        }
        
        if(isCanyou(t,j) && isDependent(t[j-1]) && isDependent(t[j+7])){            //can you换成I can 
        
            cout << "I can";
            j+=7;
            continue;
        }
        
        if(t[j]==' ' && isDependent(t[j+1])){            
            ++j;
            continue;
        }
        cout << t[j];
        ++j;
    }
    cout << endl;
}
View Code

里面还包含了两个bool函数

bool isDependent(char ch)        //判断字符是否为除数字和字母以外的字符 
{
    ch=tolower(ch);
    if((ch>='0' && ch<='9') || (ch>='a' && ch<='z'))
        return false;
    else
        return true;
}
View Code
bool isCanyou(char t[],int j)            //判断一个独立的can you 
{
    if(t[j]=='c' && t[j+1]=='a' && t[j+2]=='n' && t[j+3]==' ' && t[j+4]=='y' && t[j+5]=='o' && t[j+6]=='u'){
        if((j==0 || isDependent(t[j-1]) ) && isDependent(t[j+7]))
            return true; 
    }
    else
        return false;
}
View Code

  以前打题的时候都喜欢想到哪打到哪,直接把问题很具体化,导致思绪很容易乱,容易漏细节,现在的方法就是像老师这样先打出大的步骤,然后再具体化,一个一个要求去实现过程就很清晰了

  还是想多打一点代码,先把这种方法用熟

标签:原文中,空格,ch,++,学习,isDependent,&&,小结,第四章
来源: https://www.cnblogs.com/zhongjieying/p/10706878.html