第四章学习小结

本章学习了两种算法,BF算法和KMP算法
BF算法就是暴力匹配,非常好理解
KMP算法的优点是,与BF算法相比,消除了回溯,大大提高了效率
缺点是,好难理解。。。
本章除了新学习了两种算法,我还看到了上学期所学的线性代数知识矩阵在编程上的应用(以前我总是不理解我一个计算机专业的学线性代数有什么用)
以及稀疏矩阵的十字链表表示
这周印象最深的就是实践题AI代码啦
要是没有老师带着我做,我都不知道何从下手。。。
实践题AI核心代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
bool isSeparator(char ch)
{//判断ch是否分隔符
//ch可能是:数字、字母、标点、空格、\0
//分隔符:!(数字、小写字母、I)
    ch = tolower(ch);
    if(ch>='0' && ch<='9' || ch>='a' && ch<='z' || ch=='I')
        return false;
    else
        return true;   
}
bool ispunctuation(char dh)
{  //判断后一个是否为标点符号
    dh=tolower(dh); 
    if(dh>='0'&&dh<='9' || dh>='a'&&dh<='z' || dh=='I' || dh==' ')  
    return false;
    else
    return true;
}
bool iscanyou(char t[],int j)
{
    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||isSeparator(t[j-1]) )&&isSeparator(t[j+7]))
            return true;
    }
    else  
    return false;
           
}


void go(string s)
{
    char t[3001];//注意输入全部是I的时候,输出长度是输入的三倍
    //string t; 

    int i, j;//i,j分别为s,t的下标
   
    //i定位到s的第一个非空字符
    for(i=0; s[i]!='\0'&&s[i]==' '; ++i);//循环体为空

    j = 0;     //j的初值为0
   
    //从s的第一个非空字符开始,逐个扫描,分情况复制到t
    while(s[i]!='\0'){
        if(s[i]==' ' && s[i-1]==' '){
            ++i; //如果漏了这句,有连续空格时会死循环
            continue;
        }           
        if(s[i]=='?'){
            t[j++] = '!';
            ++i;
            continue;
        }
        if(s[i]!='I'){
            t[j] = tolower(s[i]);
          ++i;++j;
            continue;
        }
        t[j++] = s[i++];
     } 
    
     t[j] = '\0';

  j = 0;
     while(t[j]!='\0'){
         if(t[j]=='I' && (j==0 || isSeparator(t[j-1])) && isSeparator(t[j+1])){
             cout << "you";
             ++j;
             continue;
         }
          if(t[j]=='m' && t[j+1]=='e' && (j==0 || isSeparator(t[j-1])) && isSeparator(t[j+2])){
             cout << "you";
             j += 2;
             continue;
         }
if(t[j]==' '&& ispunctuation(t[j+1]))
         { 
             ++j;
             continue;
         }
         if(iscanyou(t,j))
         {
             cout<<"I can";
             j+=7;
             continue;
         }
if(s[j]==' '&&s[j+1]=='\0')
        {
               ++j;
            continue;
        }  
        cout<<t[j++];
    }

             cout<<endl;
       
         }
int main()
{
    string s;
    int n, i;
    cin >> n;
    getchar(); //吸收回车符
    for(i=1; i<=n; i++){
        getline(cin, s);
        cout << s << endl;
        cout << "AI: ";
        go(s);//AI根据s输出对话   
    }
    return 0;
}
posted @ 2019-04-15 00:26  kwli  阅读(110)  评论(1编辑  收藏  举报