伪AI
Posted chrismua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了伪AI相关的知识,希望对你有一定的参考价值。
7-2 AI核心代码 (30 分)
本题要求你实现一个简易版的 AI 英文问答程序,规则是:
- 无论用户说什么,首先把对方说的话在一行中原样打印出来;
- 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
- 把原文中所有大写英文字母变成小写,除了 I;
- 把原文中所有独立的 I 和 me 换成 you;
- 把原文中所有的问号 ? 换成惊叹号 !;
- 把原文中所有独立的 can you 换成 I can —— 这里“独立”是指被空格或标点符号分隔开的单词;
- 在一行中输出替换后的句子作为 AI 的回答
这道题是上机课上老师带着做到,看到这道题时,首先想到的时用if else或者case,但是看了一下要实现的内容,有太多的边界问题了。
根据题目所给的规则,可以把处理的问题分为:空格、大写变小写(除了I)、独立的I和me改为you、?变!、独立的can you变为I can。
按照老师的思路,首先从主函数开始写起,主函数主要是实现输入的功能。
int main() { int n; string s; cin>>n; getchar(); //吸收回车 for(int i=1;i<=n;i++) {//输入对话 getline(cin,s); cout<<s<<endl; cout<<"AI: "; go(s); //根据s输出AI的回答 } return 0; }
根据main函数中构造调用的一个go函数,可以开始构思如何写go函数,其中go函数的功能主要是根据输入的内容,输出相应的内容。
下面开始写go函数:
一开始是定义string t,我们有选择地把我们需要输出的字符放到数组t中,到最后直接输出t数组的元素即可。但是这会出现问题,因为我们给t分配了空间,但是我们并不知道这个空间的首地址。所以改为定义一个字符数组t,根据题目,每一句不超过字符1000,那我们设的长度是不是1000或者1001就足够了呢?不是的,如果输入的字符全为I,那么长度为1000或1001显然是不够的,因此设定的长度应为3001。在处理前面根据规则分的五类的问题前,我们要先用一个空循环定位到字符串s的第一个非空元素,因为一句话最前面的空格我们是不需要输出的。
char t[3001]; //输入全为I时,输出的长度是输入的3倍 int i,j=0; //i为s的下标,j为t的下标 for(i=0;s[i]!=‘