结对编程-个人项目分析
一、简介
本博客是我对结对编程伙伴郭琪同学的个人项目的分析
项目名称:中小学数学试卷自动生成程序
实现模式:C/S模式
编程语言:C++
二、整体结构
郭琪同学的个人项目分为三个部分:主函数、教师类、交互模块
1)主函数main.c
用于建立交互模块并将其启动
2)教师类teacher.h、teacher.cpp
用教师类保存每个教师账户的基本属性,如用户名和密码以及教师类型。同时通过一系列函数对各项属性进行修改或获取值
3) 交互模块system.h、system.cpp
交互模块用类来实现,其有一些基本属性如当前用户、所生成的试题、试卷存放路径等。同时通过一系列函数实现用户的登录验证、试卷生成等操作
三、各部分代码分析
1)主函数main.c
其功能是建立一个交互模块的对象以及将其启动,虽然代码简短,但是其目的已实现

2)教师类teacher.h、teacher.cpp
1.在类的开头就是详细的使用介绍,以及用法举例,可以看出郭琪同学的代码可读性非常好

2.在类中包含各项函数,在teacher.cpp中是对各个函数的实现

郭琪同学将面向对象编程运用的非常好,这些函数涵盖了本项目需要对教师的各项属性的各种操作,避免了对教师属性的意外修改。
3)交互模块system.h、system.cpp
在交互模块中包含了很多功能
1.用户登录。这一函数实现了对用户登录的验证,同时循环的使用可以让用户一直停留在登录状态直到自行选择退出登录。

2.菜单功能界面。这个函数对用户的选择进行判定并进行相应的操作,但是我在体验过程中感觉这个等待5秒有些不友好,这里的设定是不论用户是否选择都要等待5秒,虽然时间不长,但这不是必要的。

3.试卷创建。该函数分为两部分,第一部分是对输入的正确性判断,第二部分是试卷的生成,根据输入的类型选择生成试卷的类型。


4.切换出题类型。这个功能是个人项目中比较重要的功能,而郭琪同学通过面向对象的编程方法,建立了教师类,因此在这里只需要调用相应的函数修改教师的类型属性就可以轻松做到这一点。

5.题目生成。这里郭琪同学将题目生成分成三个部分:操作数生成、运算符生成、题目生成。这里用生成小学题目作为介绍。
5.1 生成操作数函数和生成运算符函数。这两个函数的实现逻辑相似,都是通过随机选择然后存入相应的数组。


5.2 生成小学题目
实现逻辑:小学题都是num1+num2-num3*num4/num5...,类似这样的式子,操作数与操作符间隔,并且操作符总是比操作数少一个。左右括号的位置也随机生成,在0~len-1之间,表示在哪个操作数的前后,比如为左括号位置为0,则左括号在第一个操作数的前面,右括号位置为2,则右括号在第三个操作数的右边。当左括号在0,右括号在len-1时,说明括号在整个表达式的外面,此时括号没有意义,因此这种情况不添加括号,当只有一个操作数时,也不添加括号,比如 ( 3+4+5),(5)。

这里从逻辑中可以看出,会有一个操作数的情况出现,而小学的没有一元的运算符,也就是说会出现32= 这种情况,虽然在规则下是合法的但是看起来怪怪的
6.题目查重。这里处理有一个前提,郭琪同学在生成试卷的同时会将其中的题目去除题号单独保存在一个题库中,查重时直接从题库中提取题目即可,因为试卷中的题目带有题号,在比较的同时如果要去掉题号会增加额外的时间,而文件I/O时间本就多,相对于我所做的去除题号,这个方法显然更节省时间。

四、代码运行演示
1)正常操作
控制台界面

生成的试卷


可以看到,在正常操作下,郭琪同学的代码实现了应有的功能。
2)非正常操作--随意造

可以看到,在我随意输入狂轰滥炸之下,代码运行正常,说明该项目中郭琪同学编写的代码具有良好的稳定性
五、优点与缺点
优点:
1)代码可读性非常好,编码符合Google的C++编码风格,读起来很舒适
2)运用了面向对象的编程方法,代码的模块化使用率非常高,减少了代码量
3)用户体验良好,相对于我的生成一张试卷就结束程序,郭琪同学的程序显然用户体验会更好
缺点:
1)高中题目生成逻辑简单,导致生成的高中题题型基本固定且较为简单

浙公网安备 33010602011771号