需求分析
這次程序是寫的是一個包括整數和真分數的四則運算出題器。出題器顧名思義,基本功能就是出題,然后在用戶作答后進行正誤判斷、糾錯等,最后在進行打分。
功能設計
題目生成器的主要功能及工作流程:
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 |
總結
寫程序是一個很有趣的過程