L1-064 估值一亿的AI核心代码 (20分)

题目要求

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

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

提交结果

L1-064 估值一亿的AI核心代码 (20分)_第1张图片

注意之处

假设原文是can you,经过规则4,将变成I can ,那经过规则5是不是应该变成you can但是是否定的,答案应该还是I can

解题思路

第一步 :消除原文中多余空格,得到text1;
第二步: 将text1中所有大写英文字母变成小写,除了 I,把原文中所有的问号 ? 换成惊叹号 !,得到text2;
第三步:遍历text2,把原文中所有独立的 I 和 me 换成 you,把原文中所有独立的 can you、could you 对应地换成 I can、I could。

代码

#include 
#include 
#include 
using namespace std;

int judge(char x)  //判断字符类型,主要用于去空格和替换
{
	if( (x>='A'&&x<='Z') || (x>='a'&&x<='z') || (x>='0'&&x<='9') )
		return -1;
	else if(x==' ')
		return 1;
	else
		return 2;
}

int main() 
{
	int n;
	(cin>>n).get();
	vector<string> data;
	string tmp;
//输入
	for(int i=0;i<n;i++)
	{
		getline(cin,tmp);
		data.push_back(tmp); 
	}
	
	for(int i=0;i<n;i++)
	{
         cout<<data[i]<<endl;
         cout<<"AI: ";
         //如果字符为空则返回回车
		if(data[i].find_first_not_of(" ")==string::npos)
		{
			cout<<endl;
		    continue;
		} 
		//去掉前后空格 
		data[i]=data[i].substr(data[i].find_first_not_of(" "));
		for(int j=data[i].length()-1;j>=0;j--)
		{
			if(data[i][j]!=' ')
				break;
			else
			    data[i].erase(j,1);
		}
	    
	    //把相邻单词间的多个空格换成 1 个空格,把标点符号前面的空格删掉,转换小写,?换成!
		for(int j=0;j<data[i].length();j++)
		{
			if(data[i][j]==' '&&data[i][j+1]==' ')
			{
					data[i].erase(j,1);
					j=j-1;
			}
			else if(data[i][j]==' '&&judge(data[i][j+1])==2)
			{
					data[i].erase(j,1);
					j=j-1;
			}
			else if('A'<=data[i][j]&&data[i][j]<='Z'&&data[i][j]!='I')
				data[i][j]=data[i][j]+32; 
			else if(data[i][j]=='?')
			{
				data[i][j]='!';
			}
			else 
				continue;
		}

		
		//把原文中所有独立的 I 和 me 换成 you,  can you、could you 对应地换成 I can、I could 
	    string ans("");
        data[i].insert(0," ");
        data[i].insert(data[i].size()," ");
	
		for (int j=0; j < data[i].length(); j++)
		{
			ans+=data[i][j];
			if(judge(data[i][j])<0)
				continue;
			else if ( judge(data[i][j])>0&&data[i][j+1] == 'm'&&data[i][j + 2] == 'e'&&judge(data[i][j + 3])>0)
			{
				j += 2;
				ans += "you";
			}
			else if (judge(data[i][j])>0 && data[i][j + 1] == 'I'&&judge(data[i][j + 2])>0)
			{
				j++;
				ans += "you";
			}
			else if (judge(data[i][j])>0 && data[i][j + 1] == 'c'&& data[i][j + 2] == 'a'&& data[i][j + 3] == 'n'&& data[i][j + 5] == 'y'&& data[i][j + 6] == 'o'&& data[i][j + 7] == 'u'&&judge(data[i][j+ 8])>0)
			{
				j += 7;
				ans += "I can";
			}
			else if(judge(data[i][j])>0 && data[i][j + 1] == 'c'&& data[i][j + 2] == 'o'&& data[i][j + 3] == 'u'&& data[i][j + 4] == 'l'&& data[i][j + 5] == 'd'&&  data[i][j + 7] == 'y'&& data[i][j + 8] == 'o'&& data[i][j + 9] == 'u'&&judge(data[i][j + 10])>0)
			{
				j += 9;
				ans += "I could";
			}
			else
				continue;
		}
		
		ans=ans.substr(ans.find_first_not_of(" "));
		ans.erase(ans.size()-1,1);
		cout<<ans<<endl;
	}
	return 0;
}

你可能感兴趣的:(团体程序设计天梯赛)