第四章学习小结
第四章学习了串和数组的相关内容,以及学习了BF算法和KMP算法。AI这道题好难啊 ,看懂一点点后面的又接不上。求我的神仙室友手把手教我写代码。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string.h>
using namespace std;
#include<cstring>
#include<cstdio>
#include<string.h>
using namespace std;
//1、删除空格(删除前后空格,删除中间连续的空格保留一个,删除符号后的空格
//后面的条件依靠空格标准化
bool isIndepent(char ch)
{
ch = tolower(ch);
if(ch>='0'&&ch<='9'||ch>='a'&&ch<='z'||ch=='I')
{
return false;
}else
return true;
}
bool isPunctuation(char ch)
{
if(ch>='0'&&ch<='9'||ch>='a'&&ch<='z'||ch=='I'||ch==' ')
return false;
else
return true;
}
//后面的条件依靠空格标准化
bool isIndepent(char ch)
{
ch = tolower(ch);
if(ch>='0'&&ch<='9'||ch>='a'&&ch<='z'||ch=='I')
{
return false;
}else
return true;
}
bool isPunctuation(char ch)
{
if(ch>='0'&&ch<='9'||ch>='a'&&ch<='z'||ch=='I'||ch==' ')
return false;
else
return true;
}
void go(string s)
{// 根据s输出AI的回答
//定义辅助变量t,来copy s的字符串
char t[3001];
int i , j; //定义两个下表; i :定义到s的第一个非空; j : 定义t
for(i = 0 ; s[i]!= '\0' && s[i] == ' ' ; i++); //全为空格的时候会将s的最后一个字符‘\0’存储
//保证每次往后扫一次用for,往后扫的次数要跳跃无规律用while
j = 0;
while(s[i] != '\0'){ //把s串copy到t,但是连续的空格只copy一次
if(s[i] == ' ' && s[i-1] ==' ')//连续的空格第一个要,后面的都不要
{ //一个一个copy到t字符串同时判断
i++;
continue;
}
if(s[i] == '?')
{
t[j] = '!';
j++;
i++;
continue; //回到循环开头
}
if( s[i] != 'I')
{
t[j] = tolower(s[i]);
i++;
j++;
continue;
}
t[j] = s[i];
i++;
j++;
//不能copy连续的空格 ,先读变量值,为下一轮循环做准备
//此时t没有处理'\0' 后面读出字符串会出错
}
t[j] = '\0';//给t补上结尾符;
j = 0 ;
while(t[j]!='\0')
{
if(t[j]=='I'&&(j==0||isIndepent(t[j-1]))&&isIndepent(t[j+1]))
{
cout<<"you";
j++;
continue;
}else
if(t[j]=='m'&&t[j+1]=='e'&&(j==0||isIndepent(t[j-1]))&&isIndepent(t[j+2]))
{
cout<<"you";
j += 2;
continue;
}else
if(t[j]==' '&&isPunctuation(t[j+1]))
{
j++;
}else
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'&&(j==0||isIndepent(t[j-1])&&isIndepent(t[j+7])))
{
cout<<"I can";
j += 7;
}
else
{
cout<<t[j];
j++;
}
}
cout<<endl;
}
//主函数
int main()
{
int n;
string s;
cin >>n;
getchar();// 吸收回车 《cstdio>
for ( int i=0; i<n ; i++)
{
getline(cin , s);
cout << s << endl ;
cout << "AI: ";
go(s); // 根据s输出AI的回答
}
return 0;
}
{// 根据s输出AI的回答
//定义辅助变量t,来copy s的字符串
char t[3001];
int i , j; //定义两个下表; i :定义到s的第一个非空; j : 定义t
for(i = 0 ; s[i]!= '\0' && s[i] == ' ' ; i++); //全为空格的时候会将s的最后一个字符‘\0’存储
//保证每次往后扫一次用for,往后扫的次数要跳跃无规律用while
j = 0;
while(s[i] != '\0'){ //把s串copy到t,但是连续的空格只copy一次
if(s[i] == ' ' && s[i-1] ==' ')//连续的空格第一个要,后面的都不要
{ //一个一个copy到t字符串同时判断
i++;
continue;
}
if(s[i] == '?')
{
t[j] = '!';
j++;
i++;
continue; //回到循环开头
}
if( s[i] != 'I')
{
t[j] = tolower(s[i]);
i++;
j++;
continue;
}
t[j] = s[i];
i++;
j++;
//不能copy连续的空格 ,先读变量值,为下一轮循环做准备
//此时t没有处理'\0' 后面读出字符串会出错
}
t[j] = '\0';//给t补上结尾符;
j = 0 ;
while(t[j]!='\0')
{
if(t[j]=='I'&&(j==0||isIndepent(t[j-1]))&&isIndepent(t[j+1]))
{
cout<<"you";
j++;
continue;
}else
if(t[j]=='m'&&t[j+1]=='e'&&(j==0||isIndepent(t[j-1]))&&isIndepent(t[j+2]))
{
cout<<"you";
j += 2;
continue;
}else
if(t[j]==' '&&isPunctuation(t[j+1]))
{
j++;
}else
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'&&(j==0||isIndepent(t[j-1])&&isIndepent(t[j+7])))
{
cout<<"I can";
j += 7;
}
else
{
cout<<t[j];
j++;
}
}
cout<<endl;
}
//主函数
int main()
{
int n;
string s;
cin >>n;
getchar();// 吸收回车 《cstdio>
for ( int i=0; i<n ; i++)
{
getline(cin , s);
cout << s << endl ;
cout << "AI: ";
go(s); // 根据s输出AI的回答
}
return 0;
}