PTA:7-78 估值一亿的AI核心代码 (20分)---解析

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

在这里插入图片描述
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

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

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

在这里插入图片描述
具体解析见代码:

#include<bits/stdc++.h>
using namespace std;

void replace(char s[], char s1[], char s2[]){
	char str[2000]={};
	char *p=s,*q=s,*r=str;
	while(p=strstr(p,s1)){
		if(p-s!=0&&isalpha(*(p-1))||isalpha(*(p+strlen(s1)))){  //比如ccan you或者can youu,不符合条件,则跳过 
			p++; continue;
		}
		while(q!=p) *r++=*q++; //将要改变的字符串前面的字符也赋值过去 
		for(int i=0; s2[i]; i++){  //s2赋值过去 
			*r++=s2[i];
		}
		p += strlen(s1);//再变换后的位置,接着进行搜索要变换的字符串	
		q = p;  //更新q的位置 
	}
	while(*q) *r++=*q++;//将最后的字符,赋值过去 
	*r=0;
	strcpy(s, str); //将改变后的字符串更新 
}

void solve(char s[]){
	char str[2000]={};
	int i=0,k=0;
	for(; s[i]==' '; i++); //消除字符串前面的空格 
	for(; s[i]; i++){
		if(s[i]==' '&&!isalpha(s[i+1])&&!isdigit(s[i+1])) continue; //将多余的空格去掉,包括去掉‘,’前的空格 
		if(s[i]=='?') s[i] = '!';
		if(isupper(s[i])&&s[i]!='I') s[i] = tolower(s[i]);
		str[k++]=s[i];
	}
	replace(str,"I","S"); //先将I替换为S,防止将I can中的I变成了you 
	replace(str,"can you","I can");
	replace(str,"could you","I could");
	replace(str,"me", "you");
	replace(str,"S","you");
	cout << "AI: ";
	puts(str);
}


int main(){
	char s[2000];
	int n;
	cin >> n;
	getchar();
	while(n--){
		cin.getline(s,2000);
		puts(s);
		solve(s);
	}
	return 0;
} 

在这里插入图片描述
欢迎大家批评改正!!!

发布了39 篇原创文章 · 获赞 2 · 访问量 3421

猜你喜欢

转载自blog.csdn.net/weixin_43581819/article/details/104012227