队友所选取的语言也是相同的c++,因此在看队友的代码的时候感触更是深刻,对于很多地方的改进方法和思考方式学习到了很多。
那么让我们先从优点开始分析。
优点:
1.和我最开始的不断错误尝试之后上网查阅资料得到的方法不同,队友选取了一种新的方式实现了字符串和数字间的转换,如下所示,在网上查阅资料之后发现这个stringstream通常是用来做数据转换的,并且相比c库的转换,它更加安全,自动和直接。不只是在int和string这样基本类型之间,它还支持char *的转换,不过再进行多次转换的时候,必须调用stringstream的成员函数.clear(),这可以说是全新的知识获取了。
string ToString(int num) //数字转字符串 { stringstream temp_ss; temp_ss << num; string response; temp_ss >> response; return response; }
2.此处是对于用户的输入,在前面他新建了一个person的类,在此处便可以通过类似数据库的模式进行存储,那么在后面检验名字,密码等只需要调用前置的函数进行判断即可,那么对于所有数据(不仅是目前的数据)都能很好的实现检验是否为注册用户实现登录。数据的存储的方式也是一种非常安全的模式,不像我写的将整个用户名和密码写在一起作为一个数组的一个数值那么容易被盗,优秀安全的思考方法!
void SetDataDeom() //对数据库进行设置,实质上是模范数据库操作 { const string name[3] = {"张三", "李四", "王五"}; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { string tempName; tempName = name[i] + ToString(j + 1); database[3 * i + j] = Person(tempName, "123", grade[i]); } } }
3.对于符号的选择,我是对于三个情况各写了一个符号函数进行出卷的设置,而他则是避免了这类代码的冗杂可能,将其写成一整个函数,并且以一个string类保存其中所存在的所有符号,这样使用的时候直接就可以根据年级得到对应符号,非常的方便。
string CreateSymbol(string grade, int flag) //flag表示需求单操作符 { string sym; string alp_sing[] = {"sin", "cos", "tan", "^0.5", "^2"}; string alp_d[] = {"+", "-", "*", "/"}; if (flag == 1) { if (grade == "高中") { sym = alp_sing[RandRangeNum(0, 2)]; } else if (grade == "初中") { sym = alp_sing[RandRangeNum(3, 4)]; } } else { sym = alp_d[RandRangeNum(0, 3)]; } return sym; }
4.题目要求将对应的试题存在账号的文件夹内,但是若账号过多时我们不可能自己一个个的创建文件夹,并且对于相应的地址位置,我只能单纯的提前设置好,若是改变位置就得重新修改代码,而队友则是给了我一个解决的方式实现了地址的手动输入和文件夹的自动创建。
string path = ".\\" + account; _mkdir(path.c_str());
5.最重要的是!他实现了代码的查重,因为之前的类的创建因此对于各个部分,如用户名密码等数据的存储和再使用都有非常大的便利,而不是像我那样没法读取相应部分的数值导致最后没有办法实现查重。
6.其中还有挺大一部分小细节的操作是一些全新的知识,对我的能力的长进有非常大的帮助,深有感触。
缺点:
虽然他的优点非常多,代码写的也是相对很优秀的,但是还是有一小部分细节有所不足。
首先是全文一共480+,但是注释部分还是较少的,只有的大类以及整体的描述有注释,其中有一些细节部分因为没有注释理解还是需要一些时间和资料的查找的,如果能够考虑到新知识的部分多增加一些注释让没有接触到的人更好理解一些就更好了。
此外还有main函数中出试卷的部分,本来在前面符号的判断的函数的时候以为他是在后面写了函数进行整合的,但是后续发现出试卷还是分了三个部分去写,占用的空间还是挺大的,如果能再用一个函数去整合代码应该能够显得更加简洁。
总的来说,纵观整体代码,收获还是非常多的,也学到了非常多的知识,并且对于之前很久没有用到的部分也想起来了用法,也能够用的更加娴熟了。代码还没学好,同志尚需努力!