结队编程队友使用的是C++语言,主函数循环是三个出题函数以及一个主函数进行登录选择,下面进行一部分的代码分析。
代码的一些不足之处:
①代码重用度较差
未使用面向对象编程,部分重复代码可以更充分封装。
如
time_t now_time = time(NULL); //获取当前时间 struct tm *p; p = gmtime(&now_time); char filename[256] = {0}; sprintf(filename,"%d-%d-%d-%d-%02d-%02d.txt", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, p->tm_sec); //将当前时间作为为文件名 ofstream mycout(filename); //生成txt文件
部分大量出现,可封装为函数。
②算式生成算法亟需改进
int bracket_l[10][3] = {0, 0, 0, 5, 0, 0, 0, 11, 0, 0, 1, 0, 0, 5, 0, 5, 11, 0, 0, 1, 11, 0, 1, 2, 0, 5, 17, 5, 11, 17}; //左半括号可能的位置 int bracket_r[10][3] = {9, 0, 0, 14, 0, 0, 9, 19, 0, 14, 9, 0, 15, 14, 0, 20, 19, 0, 20, 9, 19, 19, 14, 9, 15, 14, 24, 26, 25, 24}; //与左半括号分别对应的右半括号位置
这部分是括号的位置,没有用算法,暴力枚举了几种括号的插入位置,虽然支持部分多个括号的插入,但是治标不治本。
但这种方法也并不是没有可取之处,此方法简化了复杂的括号生成,用了一种较为简单的方法解决较为复杂的问题,而且在绝大多数下是能够满足需要的。
③未进行查重操作
需求文档中要求进行查重,但代码中未进行查重操作。
可取之处
①使用定长字符数组
string str1[27]; //考虑括号所有位置后创建一个长度为27的字符串数组存储算式 int flag = rand() % 2; //算式中是否出现括号 int flag1 = rand() % 3; //算式中是否出现平方或开根号
用一个定长字符数组,且仅仅是用于存储标记。
for (int j = 0; j < 27; j++) { if ((n > 0) && (j == 3 || j == 8 || j == 13 || j == 18 || j == 23)) //操作数的位置直接输出随机数 { if (radical[n - 1] == "√") //是否输出开根号 { mycout << radical[n - 1]; } if (trig_sit[n - 1] != 3) //是否输出三角函数符号 { mycout << trig[trig_sit[n - 1]]; } mycout << rand() % 100 + 1; if (square[n - 1] == "^2") //是否输出平方 { mycout << square[n - 1]; } n--; } else if (str1[j] != " ") { mycout << str1[j]; } } mycout << "=" << endl << endl; }
生成对应的各个算式标记后,再统一遍历该字符数组的各个标记,从而产生各个的算式。
避免了因为不断的字符插入导致的字符串各字符的index紊乱的情况,极大地减轻了工作量。
② 整体效率较高
未使用C++的String类的成员函数,避免了耗时的插入查找操作,使程序运行效率较大提高。