Github項目地址:
https://github.com/pirigg/-
題目描述:
通過python語言編寫一個能夠自動生成小學四則運算的程序(注意是給小學生用的,要是結果出現負數的話他們會很迷茫的!),同時,除了整數外,還要支持真分數的四則運算。
Psp表格:
| PSP2.1 |
任務內容 |
計划完成需要的時間(min) |
實際完成需要的時間(min) |
| Planning |
計划 |
50 |
60 |
| Estimate |
估計這個任務需要多少時間,並規划大致工作步驟 |
20 |
30 |
| Analysis |
需求分析 (包括學習新技術) |
60 |
90 |
| Design |
具體設計 |
50 |
60 |
| Coding |
具體編碼 |
400 |
500 |
| test |
測試(自我測試,修改代碼,提交修改) |
200 |
250 |
| Postmortem & Process Improvement Plan |
事后總結 ,並提出過程改進計划 |
30 |
50 |
| Summary |
合計 |
810 |
1040 |
1.程序設計
首先以“1+1=”為例,我們要生成簡單的四則運算題目需要兩個整數或是分數,為了將答案與算式分類,我們分別用兩個列表來儲存。
q[]用來存儲問題,ans[]用來存儲答案。我們可以通過random模塊生成一定區間里的隨機數,分數也可以通過隨機生成分子和分母的形式隨機生成。同時分數可以使用Fraction模塊,可以同時實現分數與整數的運算以及分子和分母的約分。
下面是各個函數的代碼:
2.實現代碼
def c1(q, ans): symbol = random.choice(['+', '-', '*', '/']) # 生成隨機符號 if symbol == '+': n1 = random.randint(0, 20) n2 = random.randint(0, 20) q.append(str(n1) + '+' + str(n2) + '=') ans.append(n1 + n2) elif symbol == '-': n1 = random.randint(0, 20) n2 = random.randint(0, 20) n1,n2 = max(n1,n1),min(n1,n2)#防止出現負數 q.append(str(n1) + '-' + str(n2) + '=') ans.append(n1 - n2) elif symbol == '*': n1 = random.randint(0, 20) n2 = random.randint(0, 20) q.append(str(n1) + '×' + str(n2) + '=') ans.append(n1 * n2) else: n1 = random.randint(0, 20) if n1 == 0: n2 = random.randint(1, 20) else: n2 = random.randint(1, n1 + 1) q.append(str(n1) + '÷' + str(n2) + '=') ans.append(Fraction(n1, n2))
def createF(): #生成分數 fz1 = random.randint(0, 20) if fz1 == 0: fm1 = random.randint(1, 20) else: fm1 = random.randint(1, 20) f1 = Fraction(fz1, fm1) fz2 = random.randint(1, 20) fm2 = random.randint(20, 20) f2 = Fraction(fz2, fm2) return f1, f2
def c2(q,ans): #兩個分數的四則運算 symbol = random.choice(['+','-','*','/']) f1,f2 = createF() if symbol =='+': while f1+f2>1: f1,f2 = createF() q.append(str(f1)+'+'+str(f2)+'=') ans.append(f1+f2) elif symbol =='-': f1,f2 = max(f1,f2),min(f1,f2) #防止出現負數 q.append(str(f1)+'-'+str(f2)+'=') ans.append(f1-f2) elif symbol == '*': while f1*f2>1: f1,f2 = createF() q.append(str(f1)+'×'+str(f2)+'=') ans.append(f1*f2) else: while f1/f2>1: f1,f2=createF() q.append(str(f1)+'÷'+str(f2)+'=') ans.append(Fraction(f1,f2))
更新升級:
在原有程序的基礎上,我添加了一個轉換假分數答案為帶分數答案(存儲在ans2[]列表中)的函數f(f),以便當學生給出帶分數答案時程序不會認為是錯誤的。
def f(f): #分數的轉換 a=f.numerator #分子 b=f.denominator #分母 if a%b==0: #為整數 return '%d'%(a/b) elif a<b: #為真分數 return '%d%s%d' % (a,'/',b) else: #為帶分數 c=int(a/b) a = a - c * b return '%d%s%d%s%d' % (c,'’',a,'/',b)
更新並修改了主函數后代碼運行結果如下:

3.學習總結
盡管我從完成本次作業的過程中學到了許多,像是粗略掌握了Fraction模塊以及一些程序題目的解題思想,但在寫程序的過程中我發現了自己許多許多的不足,這次的作業代碼也是匆匆忙忙趕出來的,還有很多要補充的方面,像是括號以及長運算題等等,在以后精進自己的水平后便會適時補上。
