项目地址
代码 - 四则运算(结对项目) - 海军工程大学-何智勇 (gitee.com)
PSP展示
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 50 |
· Estimate | · 估计这个任务需要多少时间 | 960 | 1540 |
Development | 开发 | 600 | 1000 |
· Analysis | · 需求分析 (包括学习新技术) | 120 | 100 |
· Design Spec | · 生成设计文档 | 60 | 60 |
· Design Review | · 设计复审 | 60 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
· Design | · 具体设计 | 90 | 180 |
· Coding | · 具体编码 | 90 | 180 |
· Code Review | · 代码复审 | 60 | 180 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 180 |
Reporting | 报告 | 360 | 540 |
· Test Repor | · 测试报告 | 180 | 360 |
· Size Measurement | · 计算工作量 | 60 | 60 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 120 | 120 |
合计 | 980 | 1560 |
学习日志
2023.10.16学习日志
学习时间:09:50——11:55
19:00——23:00
学习内容:1.根据任务需求,设计代码框架
2.确定分工任务
3.在网上收集与本次任务相关的资料
收获体会:首先进行了本次项目的初步讨论,对于此次任务目标有了大致的了解,明确了每个人的分工任务,搜集了本次任务可能用的到的资料
自我效率评价:由于只是初步的计划,本次任务完成的比较顺利,唯一比较花时间的就是设计代码框架部分,因为需要搜集很多相关的资料,不过对于整体效率还是比较高。
2023.10.18学习日志
学习时间:09:50——11:55
19:00——23:00
学习内容:1.根据时间设置种子值来保证每次随机产生的数值不同,保证每道题不同
2.如何对txt文件进行存储
3.使用eval函数来进行数值判断
收获体会:通过上述三个功能的学习以及之前所学习的知识,基本完成了自动出题软件的设计,同时,我也学习到了有关于time、random库里相关函数的使用方法。
自我效率评价:在这段时间内,我们完成了大部分的任务,但仍有少部分是另寻时间学习的,因此,在效率方面还需要有所提升。
2023.10.19学习日志
学习时间:09:50——11:55
19:00——23:00
学习内容:1.python的单元测试内容
2.对程序的性能分析
收获体会:通过上述两个个功能的学习以及之前所学习的知识,完成了对前一天所设计的程序的测试,同时,我也学习到了有关于python单元测试、性能分析工具的使用方法。
自我效率评价:在这段时间内,我们完成了所有的任务,相比于前一天的学习,在效率方面有所提升。
解题思路
分别对每个需求进行分析,思考其每个功能如何实现,并通过在互联网搜索相关算法,参考别人如何实现该类功能。对于实现数量自定义的解题思路为:定义一个变量,先采用input函数读取用户的输入,再采用for循环,将该变量设置为上限即可;对于加减乘除运算,就只需要采用基本的四则运算即可;对于答案验证功能采用eval函数判断即可;对于保证每次出题不一样,采用随机数生成数值即可;对于存储每次的运算记录,生成了data.txt文件用于每次的记录存储。在搜集资料的过程,主要就是针对上述所有用到的功能,搜索相关函数的使用方法。
实现过程
本次程序设计共有两个函数,分别为主函数和calculate函数,首先在主函数中对用户的输入进行采取,再调用calculate函数对数据进行处理,即calculate函数从属于主函数。
本次项目的分工如下:
岳智彬负责:完善read me、加减乘除四则运算、每个运算包含两个运算符、历史记录的存储和查看、测试用例1-10包括题目数量是否正确、单个数目的最大值是否符合、检查运算符是否正确、检查题目是否符合四则运算规则。
周凡喻负责:题目数量可以自定义、运算数在一百之内、答题功能的并验证答案是否正确、题目避免重复、语句的注释、判分同时输出正确率,正确道数、攥写文章。
分工提交截图
pycharm记录截图
测试出题数量的单元测试截图
import random
import time
import datetime
random.seed(time.perf_counter())
def calculator(n, maximum):
"""随机产生n道正整数四则运算的题目,用户输入计算结果,
判断输入正确与否,并统计正确率。题目保证减法不出现负数."""
point = 100/n
ope1 = str(input('请输入第一个运算符号:'))
ope2 = str(input('请输入第二个运算符号:'))
correct = 0
count = 0
max_final = 0
for i in range(n): # 循环n次,每次产生一个新问题
b = random.randint(0, maximum) # 随机产生一个maximum以内整数
a = random.randint(0, maximum) # 随机产生一个maximum以内整数
c = random.randint(0, maximum) # 随机产生一个随机数,使其具有两个运算符
max1 = max(a,b,c)
if max1 > max_final:
max_final = max1
#################Begin##############################
print(f'{a}{ope1}{b}{ope2}{c}=', end='')
result = float(input())
count = count + 1
if result == eval(f"{a}{ope1}{b}{ope2}{c}"):
correct = correct + 1
print("恭喜你,回答正确")
n = count
#################End##############################
print("答对{}题,正确率为{}%,总分为{}".format(correct, correct / n * 100, correct * point))
with open("date.txt", "a") as fp:
now = datetime.datetime.now()
fp.write(str(now))
fp.write(" ")
fp.write('题目数')
fp.write(" ")
fp.write(str(n))
fp.write(" ")
fp.write('正确题目数')
fp.write(" ")
fp.write(str(correct))
fp.write(" ")
fp.write('正确率')
fp.write(" ")
fp.write(str(correct / n * 100))
fp.write(" ")
fp.write('分数')
fp.write(" ")
fp.write(str(correct * point))
fp.write("\n")
return n
if __name__ == '__main__':
num = int(input('请输入出题数量:'))
m = int(input('请输入参与计算的最大数字:'))
calculator(num, m)
测试最大值的单元测试截图
import random
import time
import datetime
random.seed(time.perf_counter())
def calculator(n, maximum):
"""随机产生n道正整数四则运算的题目,用户输入计算结果,
判断输入正确与否,并统计正确率。题目保证减法不出现负数."""
point = 100/n
ope1 = str(input('请输入第一个运算符号:'))
ope2 = str(input('请输入第二个运算符号:'))
correct = 0
count = 0
max_final = 0
for i in range(n): # 循环n次,每次产生一个新问题
b = random.randint(0, maximum) # 随机产生一个maximum以内整数
a = random.randint(0, maximum) # 随机产生一个maximum以内整数
c = random.randint(0, maximum) # 随机产生一个随机数,使其具有两个运算符
max1 = max(a,b,c)
if max1 > max_final:
max_final = max1
#################Begin##############################
print(f'{a}{ope1}{b}{ope2}{c}=', end='')
result = float(input())
count = count + 1
if result == eval(f"{a}{ope1}{b}{ope2}{c}"):
correct = correct + 1
print("恭喜你,回答正确")
n = count
#################End##############################
print("答对{}题,正确率为{}%,总分为{}".format(correct, correct / n * 100, correct * point))
with open("date.txt", "a") as fp:
now = datetime.datetime.now()
fp.write(str(now))
fp.write(" ")
fp.write('题目数')
fp.write(" ")
fp.write(str(n))
fp.write(" ")
fp.write('正确题目数')
fp.write(" ")
fp.write(str(correct))
fp.write(" ")
fp.write('正确率')
fp.write(" ")
fp.write(str(correct / n * 100))
fp.write(" ")
fp.write('分数')
fp.write(" ")
fp.write(str(correct * point))
fp.write("\n")
return max_final
if __name__ == '__main__':
num = int(input('请输入出题数量:'))
m = int(input('请输入参与计算的最大数字:'))
calculator(num, m)
测试运算符是否正确单元测试
import random
import time
import datetime
random.seed(time.perf_counter())
def calculator(n, maximum):
"""随机产生n道正整数四则运算的题目,用户输入计算结果,
判断输入正确与否,并统计正确率。题目保证减法不出现负数."""
point = 100/n
ope1 = str(input('请输入第一个运算符号:'))
ope2 = str(input('请输入第二个运算符号:'))
ope3 = ope1
ope4 = ope2
correct = 0
count = 0
max_final = 0
for i in range(n): # 循环n次,每次产生一个新问题
b = random.randint(0, maximum) # 随机产生一个maximum以内整数
a = random.randint(0, maximum) # 随机产生一个maximum以内整数
c = random.randint(0, maximum) # 随机产生一个随机数,使其具有两个运算符
max1 = max(a,b,c)
if max1 > max_final:
max_final = max1
#################Begin##############################
print(f'{a}{ope1}{b}{ope2}{c}=', end='')
result = float(input())
count = count + 1
if result == eval(f"{a}{ope1}{b}{ope2}{c}"):
correct = correct + 1
print("恭喜你,回答正确")
if eval(f"{a}{ope3}{b}{ope4}{c}") == eval(f"{a}{ope1}{b}{ope2}{c}"):
return True
else:
return False
n = count
#################End##############################
print("答对{}题,正确率为{}%,总分为{}".format(correct, correct / n * 100, correct * point))
with open("date.txt", "a") as fp:
now = datetime.datetime.now()
fp.write(str(now))
fp.write(" ")
fp.write('题目数')
fp.write(" ")
fp.write(str(n))
fp.write(" ")
fp.write('正确题目数')
fp.write(" ")
fp.write(str(correct))
fp.write(" ")
fp.write('正确率')
fp.write(" ")
fp.write(str(correct / n * 100))
fp.write(" ")
fp.write('分数')
fp.write(" ")
fp.write(str(correct * point))
fp.write("\n")
if __name__ == '__main__':
num = int(input('请输入出题数量:'))
m = int(input('请输入参与计算的最大数字:'))
calculator(num, m)
测试题目是否符合四则运算单元测试
import random
import time
import datetime
random.seed(time.perf_counter())
def calculator(n, maximum):
"""随机产生n道正整数四则运算的题目,用户输入计算结果,
判断输入正确与否,并统计正确率。题目保证减法不出现负数."""
point = 100/n
ope1 = str(input('请输入第一个运算符号:'))
ope2 = str(input('请输入第二个运算符号:'))
ope3 = ope1
ope4 = ope2
correct = 0
count = 0
max_final = 0
for i in range(n): # 循环n次,每次产生一个新问题
b = random.randint(0, maximum) # 随机产生一个maximum以内整数
a = random.randint(0, maximum) # 随机产生一个maximum以内整数
c = random.randint(0, maximum) # 随机产生一个随机数,使其具有两个运算符
max1 = max(a,b,c)
if max1 > max_final:
max_final = max1
#################Begin##############################
print(f'{a}{ope1}{b}{ope2}{c}=', end='')
result = float(input())
count = count + 1
if result == eval(f"{a}{ope1}{b}{ope2}{c}"):
correct = correct + 1
print("恭喜你,回答正确")
return True
n = count
#################End##############################
print("答对{}题,正确率为{}%,总分为{}".format(correct, correct / n * 100, correct * point))
with open("date.txt", "a") as fp:
now = datetime.datetime.now()
fp.write(str(now))
fp.write(" ")
fp.write('题目数')
fp.write(" ")
fp.write(str(n))
fp.write(" ")
fp.write('正确题目数')
fp.write(" ")
fp.write(str(correct))
fp.write(" ")
fp.write('正确率')
fp.write(" ")
fp.write(str(correct / n * 100))
fp.write(" ")
fp.write('分数')
fp.write(" ")
fp.write(str(correct * point))
fp.write("\n")
if __name__ == '__main__':
num = int(input('请输入出题数量:'))
m = int(input('请输入参与计算的最大数字:'))
calculator(num, m)
性能分析
性能分析图如下图所示
由图中可得,因为本次设计的程序仅有两个函数,运行所耗费的时间太短短导致无法统计时间,从而无法再在原有基础上进行优化。
代码说明
if __name__ == '__main__':
num = int(input('请输入出题数量:'))
point = 100/num
m = int(input('请输入参与计算的最大数字:'))
ope1 = str(input('请输入第一个运算符号:'))
ope2 = str(input('请输入第二个运算符号:'))
calculator(num, m)
这段代码用于用户交互,分别通过设置五个变量,控制出题数目、每道题目的得分、参与运算的最大数字、参与计算的运算符号。在代码的最后一段调用calculator函数,该函数为用户自定义的函数具体代码如下
def calculator(n, maximum):
"""随机产生n道正整数四则运算的题目,用户输入计算结果,
判断输入正确与否,并统计正确率。"""
correct = 0
for i in range(n): # 循环n次,每次产生一个新问题
b = random.randint(0, maximum) # 随机产生一个maximum以内整数
a = random.randint(0, maximum) # 随机产生一个maximum以内整数
c = random.randint(0, maximum) # 随机产生一个随机数,使其具有两个运算符
#################Begin##############################
print(f'{a}{ope1}{b}{ope2}{c}=', end='')
result = float(input())
if result == eval(f"{a}{ope1}{b}{ope2}{c}"):
correct = correct + 1
print("恭喜你,回答正确")
#################End##############################
print("答对{}题,正确率为{}%,总分为{}".format(correct, correct / n * 100, correct * point))
with open("date.txt", "a") as fp:
now = datetime.datetime.now()
zqv = correct / n * 100
df = correct * point
fp.write(str(now))
fp.write(" ")
fp.write('题目数')
fp.write(" ")
fp.write(str(n))
fp.write(" ")
fp.write('正确题目数')
fp.write(" ")
fp.write(str(correct))
fp.write(" ")
fp.write('正确率')
fp.write(" ")
fp.write(str(correct / n * 100))
fp.write(" ")
fp.write('分数')
fp.write(" ")
fp.write(str(correct * point))
fp.write("\n")
在该段代码当中,通过eval函数来判断答案是否正确,并通过correct变量来存储正确回答题道数。在往data.txt中写入的代码中。now变量用来存储当前时间,zqv、df变量表示正确率和得分,但实际中没有使用,fp相关函数为分别往txt存储数据。
个人收获
通过本次结对项目的学习,首先对于前面学习的项目的迁入,fork等功能进行了复习,同时学习了如何使用python进行相关的单元测试,学习了time库和random库的部分函数功能。其次,对于如何完成一个项目,以及项目的整体开发流程有了一个清晰的了解,学会了如何运用PSP进行效率分析。最后,学会了如何通过gitee建立需求、确定每个人的分工等功能。
剩余编码要求截图部分
readme截图
关联需求截图
任务分配、代码的迁入截图
所有警告截图
消除所有警告截图
测试分支覆盖率截图
补充功能
错题本记录功能: