Jahow

导航

 

代码地址

 


 需求分析


这次程序是写的是一个包括整数和真分数的四则运算出题器。出题器顾名思义,基本功能就是出题,然后在用户作答后进行正误判断、纠错等,最后在进行打分。

 


功能设计


 题目生成器的主要功能及工作流程:

    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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 总结 


 

写程序是一个很有趣的过程

 

 

 

 

 

posted on 2017-03-03 19:35  Jahowz  阅读(486)  评论(11编辑  收藏  举报