個人作業1——四則運算題目生成程序(基於控制台)


代碼地址

 


 需求分析


這次程序是寫的是一個包括整數和真分數的四則運算出題器。出題器顧名思義,基本功能就是出題,然后在用戶作答后進行正誤判斷、糾錯等,最后在進行打分。

 


功能設計


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

    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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 總結 


 

寫程序是一個很有趣的過程

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM