软件工程-中小学数学试卷生成系统结对项目之ShengyiJi代码赏析

【项目需求】

1、命令行输入用户名和密码,如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码。

2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100。

3.同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复。

4.在登录状态下,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,提示“请输入小学、初中和高中三个选项中的一个”。输入正确后,回到步骤2。

5.生成的题目以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行。

【难点分析】

1.随机生成题目:针对三个不同的等级生成题目。涉及到很多的字符串插入、查找操作。同时由于数学题目还要符合我们日常的认知,所以需要考虑到某些特殊字符如“√”,“²”,“sin”,“cos”,“tan”和简单四则运算符号的位置。当然其中最麻烦的还是括号的添加。我考虑的括号存在的位置是前面  !isDigit(),而后一个位置isDigit(),则该位置能插入一个前括号。在还有前括号未匹配的情况下,若前一位isDigit()或者为“²”,而后一位 !isDigit(),则该位置能放入括号。

2.题目的打印:涉及到文件的输入输出流,文件夹的创建函数mkdir(),以及获取当前时日期和时间的Data和Calendar类。

 

3.题目的查重:通过查阅资料,我知道了一个叫字符串hash的东西,字符串Hash函数将一个字符串映射为一个非负整数, 且两个不同的字符串映射值相同的概率极低。所以我需要将现有的文件中题目一条条读出来,然后与本次生成题目的哈希值作一个对比,如果相同,则重新生成该数学题。

【搭档ShengyiJi代码优缺点】

优点:

1.分了用户User类和一个存放程序主要函数的类,保证了用户数据的安全性。

2.添加了方法和类的注释模板,每一段代码和主要的代码行都有对应的功能注释,有助于他人快速理解代码。

 

 

3.对于字符串的增删改查以及类型的转换十分熟练,使得题目生成能用很短的代码实现,不冗杂。

4.在登录时,事先在一个txt文件中保存好9个用户的用户名和密码,模拟一个数据库的存在,在用户输入时直接和文件中的字符串进行比较,从而决定是否能够登录。这使得代码少了很多if语句,而变成了字符串和文件流的操作。同时,提高了代码的可重用性,在用户更改用户名和密码时,不需要更改源代码,而只需要改动txt文件中的内容就行了。

缺点: 

1.路径没有使用相对路径,而使用了绝对路径,导致代码直接编译报错。

2.插入括号功能的实现在小学、初中、高中三段代码中都是同一段代码实现的,可以封装为一个函数,使得代码整体看上去更简洁、完美。

 

【总结反思】

在欣赏完ShengyiJi的代码之后,对于oop的编程思想,字符串的操作有了更深入的了解,也反思了自己代码的不足,相比之下,我的代码显得更加冗杂和难以读懂。同时,由于我所有代码都在一个文件中实现,也缺乏用户数据安全性这一方面的考虑。日后还需多思考和学习。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-09-20 01:15  zhm0424  阅读(201)  评论(0编辑  收藏  举报