目录
一、代码仓库项目地址
结对成员:
姓名:刘小兵 学号:D23381007
姓名:江超宇 学号:Z23181002
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 40 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 40 |
Development | 开发 | 720 | 700 |
· Analysis | · 需求分析 | 120 | 100 |
· Design Spec | · 生成设计文档 | 60 | 55 |
· Design Review | · 设计复审 | 30 | 35 |
· Coding Standard | · 代码规范 | 30 | 35 |
· Design | · 具体设计,包括绘制 UI,设计架构等 | 120 | 115 |
· Coding | · 具体编码 | 240 | 240 |
· Code Review | · 代码复审 | 60 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | 90 | 75 |
· Test Report | · 测试报告 | 30 | 25 |
· Size Measurement | · 计算工作成果的大小 | 30 | 25 |
· Postmortem & Process Improvement | · 事后总结, 并提出过程改进计划 | 30 | 25 |
合计 | 870 | 845 |
通过对PSP表格的填写和实际比对,发现自己在估计耗时时有所不足,实际耗时短于预估时长,需要在后续的实践中加强时间管理和估计能力。
在计划环节,预估耗时为30min,但实际耗时为40min,我们认为,在这一部分耗时稍长情有可原,毕竟在开始的时候一定要做好比较周密的宏观部署规划,才能防止后续问题的出错,正所谓地基不牢,地动山摇。
在开发环节,实际耗时比预估的耗时少20min,主要体现在:需求分析的耗时比预估少20min,生成设计文档的环节比预估少5min,设计复审和代码规范环节实际用时都比预估用时多5min,具体设计方面实际比预估少5min。我们认为,前期做了宏观上的把控,所以在这一部分需求分析相对耗时较少,而且我们力求满足所有给定的需求,就没有过多地纠结筛选哪些需求。
在报告环节,每一个小的细节实际耗费的时间都比预估的时间少5分钟,说明总结过程效率相对比较高。
总体来说,总耗时比预估的耗时少25分钟,说明整体规划良好,效率高,达到了预期的目标。
三、学习日志
学习时段 | 学习内容 | 收获体会 | 自我效率评价 |
---|---|---|---|
10月12日-10月14日 | 软件工程基础概念和软件生命周期模型 | 理解软件工程的基本流程和原理,掌握软件生命周期模型的特点和应用场景 | 较高 |
10月15日-10月17日 | 软件需求工程、设计原则和设计模式以及软件架构模式 | 学习如何进行需求分析和规格化,掌握软件设计和架构的基本方法和流程 | 中等 |
10月18日-10月20日 | 项目实践:代码编写和调试 | 进行代码实现和调试工作,加深对软件开发流程和实际应用的理解 | 较高 |
10月21日 | 项目总结和反思 | 总结学习成果,反思学习过程中的不足和问题,并提出改进方案 | 高 |
四、解题思路描述
对于题目中给定的需求进行分析,题目要求程序满足的需求数量不少于6个。对于第一项,题目数量可以指定,我们计划在程序中固定题目数量为六个。对于其他几项需求,支持加减乘除4种运算、每道题包含两个运算符、运算数为100 以内的数字、保证答案在 0..100 之间、需要有答题功能并验证答案是否正确、判分,并对历史成绩进行存储和查询、题目避免重复。我们打算分模块进行代码的编写,每一个需求尽量用一个函数来表示,使得结构清晰明了。
五、设计实现过程
码云代码仓库对于软件功能描述的撰写:
将完整的代码上传至码云代码仓库中:
实验过程中,我们利用pycharm的Inspect Code进行静态语法错误的检测:
六、性能改进
在本次结对项目中,利用PyCharm中的内置的功能来进行程序性能分析和改进的过程。以下是一般的步骤:
1、导入相应的模块: 首先,在你的代码中导入 cProfile
和 pstats
模块。cProfile
用于执行性能分析,pstats
用于分析性能结果。
2、添加性能分析装饰器: 在需要进行性能分析的函数或方法上添加 @profile
装饰器。这将告诉 cProfile
模块对该函数进行性能分析。
3、运行性能分析: 在PyCharm中,选择要运行的Python文件,然后点击菜单栏的 Run
-> Profile
,选择 cProfile
。这将运行程序并进行性能分析。
4、查看性能结果: 执行完性能分析后,PyCharm将会显示一个性能分析结果的窗口。其中包括每个函数的执行时间、调用次数等信息。
5、进行性能改进: 根据性能分析结果,找到耗时较多的函数或瓶颈点,进行性能改进。可以优化算法、减少不必要的计算、使用更高效的数据结构等方法来提升性能。
6、再次运行性能分析: 修改代码后,再次运行性能分析,以比较改进后的性能结果是否有所提升。
PyCharm的性能分析功能可以帮助你发现潜在的性能问题,并指导你进行优化。通过不断地分析和改进,你可以提高程序的性能和效率。
七、代码说明
import random
class ExerciseGenerator:
def __init__(self, num_questions):
self.num_questions = num_questions
self.operations = ['+', '-', '*', '/']
self.history = []
self.score = 0
def generate_question(self):
while len(self.history) < self.num_questions:
num1 = random.randint(1, 50)
num2 = random.randint(1, 50)
num3 = random.randint(1, 50)
operation1 = random.choice(self.operations)
operation2 = random.choice(self.operations)
# 随机生成四则运算表达式
expression = f"{num1} {operation1} {num2} {operation2} {num3}"
try:
# 计算表达式的值
answer = eval(expression)
# 检查计算结果是否在0到100之间,并且避免除数为0的情况
if 0 <= answer <= 100 and not (operation1 == '/' and num2 == 0) and not (operation2 == '/' and num3 == 0):
if (expression, answer) not in self.history:
self.history.append((expression, answer))
return expression, answer
except ZeroDivisionError:
pass
def check_answer(self, question, user_answer):
if user_answer == '历史':
self.get_history()
return
for i, (q, ans) in enumerate(self.history):
if q == question:
correct_answer = ans
# 检查用户答案和正确答案的数据类型是否相同
if type(user_answer) == type(correct_answer) and user_answer == correct_answer:
self.score += 1
print(f"回答正确!当前得分/总分: {self.score}/{len(self.history)}")
else:
print(f"回答错误!正确答案是:{correct_answer},当前得分/总分: {self.score}/{len(self.history)}")
break
else:
print("题目不存在!")
def get_history(self):
print("历史记录:")
for i, (q, ans) in enumerate(self.history):
print(f"题目 {i+1}: {q},答案: {ans}")
print(f"当前得分/总分: {self.score}/{len(self.history)}")
# 设置题目数量
num_questions = 6
# 创建练习题生成器对象
generator = ExerciseGenerator(num_questions)
# 生成题目并进行答题
for _ in range(num_questions):
question, answer = generator.generate_question()
print("题目:", question)
user_answer = eval(input("请输入答案:")) # 使用 eval 将用户输入的字符串转换为表达式的计算结果
generator.check_answer(question, user_answer)
在程序运行的过程中,自动生成一道题目,输入答案后,程序进行正误的判断,如果答题者的答案和程序给定的答案一致,那么程序判定为正确,加分,同时输出当前的得分和总分,并输出下一道题,如果答题者的答案和程序给定的答案不一致,那么程序判定为错误,当前分数不变,总分数加1,同样也输出当前的得分和总分。
八、项目里程碑
在整个项目的实验过程中,我和刘小兵同志合理分工,将整个程序分成好几个部分,每个人完成其中几个需求的撰写,我负责四则运算程序支持加减乘除4种运算、四则运算程序运算数为100以内的数字、程序保证答案在0-100之间。刘小兵同志负责四则运算程序需要有答题功能并验证答案是否正确以及四则运算程序能够判分,对历史成绩进行存储和查询。
九、心得体会
在构建之法中,我们小组学到了很多关于项目管理的理论知识和实践技巧。然而,理论的学习仅仅是开始,真正地掌握项目管理的精髓还需要通过实践来实现。最近这段时间,我们小组积极配合,共同努力一起完成了四则运算的软件项目开发。在这个过程中,我们经历了许多心路历程,也收获了许多宝贵的经验教训。
在项目构思阶段,我们进行了充分的需求分析,明确了项目的目标和具体计划。我们通过对使用者需求的分析,详细定义了项目的功能和特性。此外,我们还制定了项目的时间表,为后续的项目实施打下了坚实的基础,并在结束时进行预估值和具体值的分析。
在项目实施阶段,我们遵循了预定的计划,并展开了有条不紊的工作。首先,我们根据需求分析的结果,进行了技术实现。在这个过程中,我们保持了紧密的沟通,及时解决问题和调整方向。同时,我们还注重团队协作,通过定期的小组讨论,保持了信息的同步性。在任务分配方面,我们根据各自的特长和经验,合理地分配了任务,充分发挥了每个人的优势。在项目实施过程中,我们也遇到了一些困难和挑战。面对这些问题,我们及时调整了小组的工作方向,集中精力攻克难关。
通过这个项目的实践经历,我们深刻认识到了项目管理的重要性。一个成功的项目需要明确的目标、合理的计划、有效的沟通和协作。此外,在项目实施过程中,还需要善于解决问题、及时调整方向,以及充分挖掘团队潜力。在未来的项目中,我将更加注重这些方面,努力提高自己的项目管理能力。
在项目实施过程中,我也体验到了成长和进步的快乐。通过与结对成员的共同努力,我不仅提高了自己的专业技能,还学会了如何激发小组的潜力。我深刻认识到,一个优秀的团队不仅要具备技术能力,还要具备良好的沟通、协调和管理能力。而这些能力并非与生俱来,而是在实践中不断磨砺和提高的。