7-8 估值一亿的AI核心代码 (20 分) 代码有解析

7-8 估值一亿的AI核心代码 (20 分)

以上图片来自新浪微博。

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

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

/*
解题思路:
    第一步:用字符串存储数据(注意键盘缓存区的换行符要清除掉再存储字符串)
    第二步:把原字符串进行标准化,用一个新的字符串存储 
        1、 头尾多余的空格删除 ; 
        2、大写字母非I转小写;
        3、?转!; 
        4、 字符串中多余的空格删除(注意:符号前的空格也要删除)
    第三步:按要求对相应的单词进行转化(这个不好描述,看代码进行理解) 
*/

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
	int n;
	cin>>n;
	getchar();//去除缓存区的换行符 
	while(n--)
	{
		string s,s1="";//s:原字符串  s1:标准化以后的字符串 
		getline(cin,s);
		int l=s.size();
		
		cout<<s<<endl;
		cout<<"AI: ";
		
		//去除头尾空格 
		int start,last;//start:字符串的第一个非空格下标 last:最后一个 
		for(int i=0;i<l;i++)
		{
			if(s[i]==' ') continue;
			else{
				start=i;
				break;
			}
		}
		for(int i=l-1;i>=0;i--)
		{
			if(s[i]==' ') continue;
			else{
				last=i;
				break;
			}
		}
		
		//大转小,问转感,去多余空格 
		for(int i=start;i<=last;i++)
		{
			char c=s[i];
			if(isupper(s[i])&&s[i]!='I')// isupper():判断是不是大写字母 
			{
				c=tolower(s[i]);// tolower():将大写字母转小写 
			}
			else if(s[i]=='?') c='!';
			else if(s[i]==' ')
			{
				while(i<last&&s[i+1]==' ')//跳过多余空格 
				{
					i++;
				}
				// 如果空格后面是符号,则也跳过该空格 
				if(!isalnum(s[i+1]))//isalnum() 既不是数字也不是字母就返回0(可以理解大概为判断是不是符号) 
				{
					continue;
				}
			}
			s1+=c;//把转化好的字符加进新的字符串中 
		}
		
		//按要求对单词进行转化 
		for(int i=0;i<s1.size();i++)
		{
			//1、遇到'c',判断到底是不是独立的can you  
			//首先确定c单词前面要么是空格,要么c为第一个字母。 (可能有点多此一举,英语不太好) 
			//同理确定u单词后面要么是空格,要么u为最后一个字母。(确保独立性) 
			if((s1[i]=='c'&&(s1[i-1]==' '||i==0)&&i<s1.size()-6&&s1[i+1]=='a'&&s1[i+2]=='n'&&s1[i+3]==' '&&s1[i+4]=='y'&&s1[i+5]=='o'&&s1[i+6]=='u')&&(i+7>=s1.size()||!isalpha(s1[i+7])))//isalpha()  判断是不是字母 
			{
				cout<<"I can";
				i+=6;
			}
			//2、遇到'c',判断到底是不是独立的could you
			else if((s1[i]=='c'&&(s1[i-1]==' '||i==0)&&i<s1.size()-8&&s1[i+1]=='o'&&s1[i+2]=='u'&&s1[i+3]=='l'&&s1[i+4]=='d'&&s1[i+5]==' '&&s1[i+6]=='y'&&s1[i+7]=='o'&&s1[i+8]=='u')&&(i+9>=s1.size()||!isalpha(s1[i+9])))
			{
				cout<<"I could";
				i+=8;
			}
			//3、遇到'I',判断到底是不是独立的I
			else if(s1[i]=='I'&&(s1[i-1]==' '||i==0)&&(i+2>=s1.size()||!isalpha(s1[i+1])))
			{
				cout<<"you";
				
			}
			//4、遇到'm',判断到底是不是独立的me
			else if((s1[i]=='m'&&(s1[i-1]==' '||i==0)&&i<s1.size()-1)&&s1[i+1]=='e'&&(i+2>=s1.size()||!isalpha(s1[i+2])))
			{
				cout<<"you";
				i+=1;
			}
			else cout<<s1[i];
		}
		cout<<endl;
	}
	return 0;
}

对于代码中用到的函数:(要是有帮助到你了,点个赞哦)

​​​​​​C++ 头文件「ctype.h」里的:isalpha、islower、isupper、isalnum等函数_zou_albert的博客-CSDN博客_c++ isalpha 头文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头秃不是梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值