AI核心代码

PTA 04:(天梯赛)AI核心代码

一、题目

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

无论用户说什么,首先把对方说的话在一行中原样打印出来;
消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
把原文中所有大写英文字母变成小写,除了 I;
把原文中所有独立的 I 和 me 换成 you;
把原文中所有的问号 ? 换成惊叹号 !;
把原文中所有独立的 can you 换成 I can —— 这里“独立”是指被空格或标点符号分隔开的单词;
在一行中输出替换后的句子作为 AI 的回答。
输入格式:
输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

输出格式:
按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

输入样例:
在这里给出一组输入。例如:

6
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know
输出样例:
在这里给出相应的输出。例如:

Hello ?
AI: hello!
Good to chat with you
AI: good to chat with you
can you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: could you show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don’t know


二、代码

#include 
#include 
#include 
#include  
using namespace std;
//string s;
//char s[1001]; 

//1、删除空格(删除前后空格,删除中间连续的空格保留一个,删除符号后的空格 
//后面的条件依靠空格标准化 

bool isDependent(char ch)
{ //判断ch是否分隔字符 (字母、数字、空格、标点、 \0<后三类是分隔符号>) 
	ch = tolower(ch);
	if((ch >='0' && ch<='9') || (ch>='a' && ch<='z'))
	    return false;
	else return true;
} 

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')
    return true;
    else return false;
}

void go(string s)
 {// 根据s输出AI的回答 
 	//定义辅助变量t,来copy s的字符串 
 	char t[3001];
 	int i, j; //定义两个下标; i :定义到s的第一个非空;
	for(i = 0 ; s[i]!= '\0' && s[i] == ' ' ; i++);  //全为空格的时候会将s的最后一个字符‘\0’存储 
    j = 0;
    //保证每次往后扫一次用for,往后扫的次数要跳跃无规律用while
	
	while(s[i] != '\0'){ //把s串copy到t,但是连续的空格只copy一次 
		if(s[i] == ' ' && s[i-1] ==' ')//连续的空格第一个要,后面的都不要 
		{ //一个一个copy到t字符串同时判断 
			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++]; //不能copy连续的空格 ,先读变量值,为下一轮循环做准备 
		//此时t没有处理'\0' 后面读出字符串会出错 
	} 
	
	t [j]='\0';// 字符串结尾标志; 

    j = 0;
    while(t[j]!='\0')
    {
    	if(t[j]=='I' && ( j == 0 || isDependent(t[j-1]) ) && isDependent(t[j+1]) ) //独立的I(前后是空格或者是标点符号)才要换成you ,j为0会越界 
    	{
    	    cout << "you";
    	    j++;
    	    continue;
    	}
    	
    	if(t[j]=='m' && t[j+1]=='e' && (j==0 || isDependent(t[j-1])) && isDependent(t[j+2]) ) //j+2不会越界 
    	{
             cout << "you";
             j = j+2;
             continue;
	    }
	    
	    if(t[j]==' ' && isDependent(t[j+1]))
		{
			j++;
			continue;
		}
			 
		if(iscanyou(t,j)&&(j==0||isDependent(t[j-1]))&&isDependent(t[j+7]))
        {//把can you →I can 
            cout<<"I can";
            j=j+7;  //can you一共有七个字符 
            continue;
        }
        
        if(s[j]==' '&&s[j+1]=='\0')
        {//处理最后一个空格 
            j++;
            continue;}
        
	    cout << t[j];
	    j++;
	}
	cout <<endl; 
 }


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

你可能感兴趣的:(数据结构)