结对项目完成人员:
李家鑫 冯琰玮
李家鑫主要负责代码编写及开发,冯琰玮辅助 。冯琰玮主要负责审查代码和对代码进行测试分析,李家鑫辅助 ,并负责项目相关情况记录。二人合力进行相关构思,以及解决开发过程中相关问题
一、代码开发过程:
1、代码仓库地址
https://gitee.com/nue-autumn-2023/lijiaxin-fengyanwei.git
2、代码所实现功能
a.生成题目数量可以指定。
b.支持加减乘除4种运算。
c.每道题包含两个运算符
d.题目运算数均为100 以内的数字。
e.所生成答案在 0..100 之间。
f.配备有答题功能并可验证答案是否正确。
g.可进行判分,并对历史成绩进行存储和查询。
h.题目可避免重复。
整体代码使用C++语言进行编写。
用户运行代码后首先需输入用户名登录,之后选择查询历史成绩或进行运算练习,选择运算练习后可指定题目数量,之后系统生成指定数量的四则运算练习题,用户完成后系统给出分数。
3、代码编写思路
用户运行代码后,为便于后续操作,应首先要求输入用户名,考虑到查询历史成绩与答题功能为两个不同功能,所以输入用户名之后用户应选择是进行答题还是查询历史成绩。用户选择答题后,应该可对题目数量进行指定,之后由程序按照用户要求,生成指定数量的题目。用户应在作答完本题并确认后程序可自动生成下一题,待全部完成后给出分数,成绩则以用户名-分数的形式存储到文件里。用户在开始输入用户名选择查询成绩后,程序给出上一次以此用户名作答的成绩。之后通过学习附录中资料,以及CSDN上相关文章,掌握一定的代码编写能力以及弄清楚如何设计程序框架,明白在这个过程中需要调用哪些函数,有什么功能需要定义函数实现,以及有哪些库在编码过程中需要调用,从而进行代码开发。
4、实际代码编写过程
首先,对代码进行预处理,导入要用的函数,
之后,进行变量定义,生成要用的随机数以及运算符,
然后,分别进行运算,首先使用两个随机数与一个随机运算符进行处理,得到结果,之后利用此结果与第三个随机数和运算符进行处理,得到答案,并确保答案是否在0-100之间。
首先,提示用户输入用户名,提示选择功能需求,若选择1,则要求输入要练习的题目数量,
生成指定数量题目,并要求用户作答,并检验答案,计算分数,将得分存储到文件中
若输入2,则遍历文件给出以该用户名作答的历史成绩
定义checkAnswer函数和manageScores,可检验用户输入答案以及将分数存储到文件里。
5、里程碑规划
本次代码编写过程中,用来规划的相关里程碑具体如下:
6、代码完成过程
按照里程碑内六个规划,在VS内逐步编写代码后提交到代码仓库中,
在第六次提交时,为了进一步丰富程序的功能,在代码内加入了对练习时间进行计时的功能,具体程序如下:
首先调用头文件time.h,并且定义clock_t的变量。
#include "time.h"
clock_t start,stop;
然后可以使用clock()函数,在需要测量运行时间的程序运行前调用它,在程序运行结束后再次调用它,即可获得程序运行所消耗的时间。该函数返回的单位是clock tick,也就是时钟打点。
start = clock();
/*需要测量的代码*/
stop = clock();
CLK_TCK就是当前所用的机器时钟每秒所走的时钟打点数。程序运行所经过的是时钟打点数除以每秒时钟打点数,即可得到运行时间。
duration = ((double)(stop-start))/CLK_TCK;
最后输出即可
cout << "您的练习时间是:" << duration << "S" << endl;
7、代码实际功能演示
代码经VS检测后可生成解决方案并调试运行
选择做题功能
选择查询历史成绩功能
8、代码评审、审查及性能分析
(1)、代码评审
(2)、代码审查
(3)、性能分析工具
使用VS2022性能分析工具对代码进行性能测试,结果如下:
由于水平有限,难以对代码从效能方面进行改进,只可尽可能提高代码运行效率,减少报错。
改进部分:对计时程序进行初始化定义
计时时间数据类型转换耗费时间,初始定义
二、过程记录
1、PSP展示
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 3120 | 2700 |
· Analysis | · 需求分析 (包括学习新技术) | 1680 | 1440 |
· Design Spec | · 生成设计文档 | 0 | 0 |
· Design Review | · 设计复审 | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
· Design | · 具体设计 | 120 | 120 |
· Coding | · 具体编码 | 5760 | 5040 |
· Code Review | · 代码复审 | 120 | 240 |
· Test | · 测试(自我测试,修改代码,提交修改) | 960 | 1200 |
Reporting | 报告 | 0 | 0 |
· Test Repor | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 60 | 0 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 120 |
合计 | 11990 | 10970 |
2、学习日志
学习日志记录
日期 | 学习时段 | 学习内容 | 收获体会 | 效率评价 |
1016 | 1630-1730 1900-2100 | 研究需求、代码编写、流程学习 | 设计一个软件之前梳理需求,进行需求分析很有必要 | 好 |
1017 | 1900-2300 | 需求分析、学习函数编写、代码编写开发 | 在代码编写过程中,要提升代码规范和相关算法熟练度 | 一般 |
1018 | 0800-1010 1630-1730 1900-2100 | 代码编写开发、修改更新版本 | 如果没有正确分析需求,后期代码更改起来会很困难 | 一般 |
1019 | 1630-1730 1900-2100 | 代码编写开发、修改更新版本、开始撰写博客 | 如果没有正确分析需求,后期代码更改起来会很困难 | 一般 |
1020 | 1630-1730 1900-2100 | 开始各项测试、代码完善 | 单元测试相当有难度,需要继续学习如何分析用例,如何编写测试程序 | 一般 |
1021 | 0800-1000 | 总结 | 双人协作开发可以提升效率 |
三、学习总结
这次结队编程项目的开发让我们深刻体会到了队友的重要性。这次虽然只有两个人,但是我们彼此熟悉,交流起来很轻松。因此,整个项目开发相对比较顺利。不过,由于时间紧张,程序实现的功能比较简单。如果有更多的时间,我相信我们可以将其优化得更好。吸取上次个人项目的开发经验和教训,我们进行了需求分析,但在后期编程过程中还是存在需求分析不到位返工的情况,不过我们最终改正了这些问题。对于一些函数功能的实现,由于没有基础,我们在开发过程中学到了很多新知识。此外,程序的一个不足之处就是限制用户的输入,许多功能后期也要继续改进一下。总的来说,有了这一次结队编程项目的经验,相信以后的开发要顺利许多,毕竟熟能生巧。