赞
踩
本题要求你实现一个稍微更值钱一点的 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; }
欢迎大家批评改正!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。