本章最令人印象深刻的题就是AI核心代码这题了。如下
说实话,刚看到这题真的懵了,虽然只是一道题,但总给人6题的感觉。尽管困难重重,但还是在陈晓梅老师的指导下,大致完成了此题。
逻辑分析
先定义数据结构,自然是字符数组/字符串
最初考虑主函数逻辑,主要是读取输入语句,并调用接口处理输入语句并输出。基本流程是,读入一句,对其进行扫描、判断、操作,再存到新的字符串,最后输出新的字符串。
一开始输入部分就卡住了,因为不知道怎么处理回车后还能输入数据,进度就陷入了停滞,不过课上根据老师所说getchar()可以把回车吸收掉之后,又有所进展
int main() { int n; //行数n,s存放输入的语句 string s; cin >> n; getchar(); for (int i = 1; i <= n; i++) { getline(cin, s); cout << s << endl; //先输出原话,再输出处理后的AI回答 cout << "AI: "; answer(s); //处理并输出回答 } return 0; }
然后对接口answer()进行定义。
首先考虑把多余的空格删到只剩一个
void answer(string s) { //根据s处理并输出回答 int i, j; //i定位到s的第一个非空 for (i = 0; s[i] == ' '; i++) { } }
然后对边界问题进行考虑。当字符串全为空格的时候呢?会死循环或越界溢出吗?
其实不会,因为字符串有个结尾符‘ ’,所以及时字符串全空,到最后的结尾符也会停止循环。
定位到第一个非空字符后就可以开始输入。
void answer(string s) { //根据s处理并输出回答 string t; //t为处理后的字符 int i, j = 0; //i定位到s的第一个非空,j表示t串的字符 for (i = 0; s[i] == ' '; i++) { //仅仅用于定位.因为字符串有个结尾符‘ ’,所以及时字符串全空,到最后的结尾符也会停止循环 } while (s[i] != '