需求分析
这次程序是写的是一个包括整数和真分数的四则运算出题器。出题器顾名思义,基本功能就是出题,然后在用户作答后进行正误判断、纠错等,最后在进行打分。
功能设计
题目生成器的主要功能及工作流程:
1.根据用户输入的参数出题
2.计算该题的答案
3.用户作答
4.比对答案作出正误判断并反馈
拓展功能:
1.对于用户错误的回答,会进行纠错并加入错题集。 输入calc.py -e *(*代表数字)即可重新练习*道错题
2.支持带括号的多元复合运算
设计实现
程序通过Python3实现
核心功能显然就是出题,题目的数据包括有整数和真分数,数字随机运算符也要随机,所以就调用random库进行各种随机
1 digit = [] 2 sign = [] 3 sign_list = ['+','-','×','÷'] 4 mul = random.randint(1,3) 5 for i in range(mul+1): 6 int_temp = random.randint(1,10) 7 a = random.randint(1,9) 8 b = random.randint(a+1,10) 9 fra_temp = Fraction(a,b) 10 temp = random.choice([int_temp,fra_temp]) 11 digit.append(temp) 12 for i in range(mul): 13 temp = random.choice(sign_list) 14 sign.append(temp)
然后将随机抽取出的数字和运算符构造成多元复合运算式
1 def ques_builder(digit,sign,sign_order): 2 digit,sign = digit[:],sign[:] 3 mul = len(sign) 4 for i in range(mul): 5 index = sign_order.index(1) 6 if jug(index,sign): 7 digit[index] = '('+str(digit[index])+sign[index]+str(digit[index+1])+')' 8 else: 9 digit[index] = str(digit[index])+sign[index]+str(digit[index+1]) 10 del digit[index+1] 11 del sign[index] 12 sign_order = [i-1 for i in sign_order] 13 sign_order.remove(0) 14 ques = digit[0]+'=' 15 return ques
在构造多元复合运算式时对是否加括号进行判断
1 def jug(index,sign): 2 i,p = sign[index],sign[index-1] 3 if (i=='+' or i=='-') and (('×'in sign) or ('÷'in sign)): 4 return True 5 if index!=0: 6 if (i=='+' or i=='-') and (p=='-'): 7 return True 8 if (i=='×' or i=='÷') and (p=='÷'): 9 return True 10 return False
在用户输入后,当然还要对用户的答案进行判断以及纠错并加入错题集(黄色部分)
answer = input() key = str(ques_key(digit,sign,sign_order)) if '/' in key: temp = answer.split('/') if len(temp)==1: answer = temp[0] else: answer = str(Fraction(int(temp[0]),int(temp[1]))) if answer==key: print ('正确!') return False else: print ('不正确!',ques,key) err = {ques:key} error_gather(err) return True
错题写入文本操作以及重新练习错题
1 def error_gather(err): 2 errfile = open('error','r') 3 error = eval(errfile.read()) 4 errfile.close() 5 error.update(err) 6 errfile = open('error','w') 7 errfile.write(str(error)) 8 errfile.close() 9 10 def error_extract(errnum): 11 errfile = open('error','r') 12 error = eval(errfile.read()) 13 errfile.close() 14 ques = list(error.keys()) 15 if len(ques)==0: 16 print('目前没有错题') 17 exit() 18 for i in range(errnum): 19 print(str(i+1)+': '+ques[i],end='') 20 answer = input() 21 if '/' in error[ques[i]]: 22 temp = answer.split('/') 23 if len(temp)==1: 24 answer = temp[0] 25 else: 26 answer = str(Fraction(int(temp[0]),int(temp[1]))) 27 if answer==error[ques[i]]: 28 print('正确!') 29 else: 30 print('不正确!') 31 if i==len(ques)-1: 32 print('已经没有错题了') 33 exit()
测试运行
运行截图:
PSP
Personal Software Process Stages |
Estimated Time(min) |
Actual Time (min) |
计划 |
10 |
6 |
·任务估计 |
10 |
6 |
开发 |
91 |
124 |
·需求分析 (包括学习新技术) |
10 |
8 |
·生成设计文档 |
5 |
6 |
·设计复审 |
5 |
3 |
·代码规范 |
1 |
1 |
·具体设计 |
5 |
8 |
·具体编码 |
60 |
83 |
·代码复审 |
5 |
2 |
·测试(自我测试,修改代码,提交修改) |
10 |
13 |
报告 |
30 |
24 |
·测试报告 |
15 |
18 |
·计算工作量 |
10 |
6 |
·提出过程改进计划 |
5 |
0 |
总结
写程序是一个很有趣的过程