Github項目地址:https://github.com/Lily4323/lily-
1、 題目要求:
a:能自動生成小學四則運算題目(注意是給小學生用的,要是結果出現負數的話他們會迷茫的!)
b:除了整數外,還要支持真分數的四則運算、
2、PSP表格:
(在開始實現程序之前,通過PSP表格估計程序的各個模塊的開發上耗費的時間)
PSP2.1 |
Personal Software Process Stages |
預估耗時(min) |
實際耗時(min) |
Planning |
計划 |
15 |
30 |
Estimate |
估計這個任務需要多少時間 |
10 |
15 |
Development |
開發 |
120 |
160 |
Analysis |
需求分析 |
10 |
20 |
Design Spec |
生成設計文檔 |
20 |
30 |
Design |
具體設計 |
10 |
20 |
Code |
具體編碼 |
180 |
220 |
Test |
測試(自我測試,修改代碼,提交修改) |
40 |
60 |
Reporting |
報告 |
20 |
30 |
Summary |
合計 |
425 |
585 |
3、項目思路:
a.能夠讓用戶輸入自己想要的數量
b.能夠隨機給用戶列出四則運行的運行公式
c.可以在用戶進行回答后列出該運算法則的結果並對其結果進行判斷是否正確,並能夠在命令行中表現出來
d.考慮是小學生的四則運算加減乘除,采用兩個隨機數,不能出現負數,除法在運算中,除數不能取0。
4、項目實現
1)思路設計實現
問題a:可以在代碼中利用數組來控制用戶想要輸出的題目數量
問題b:可以利用Python自帶的隨機函數獲得隨機的操作數和隨機的運算符
問題c:可以將隨給出的操作數用一個變量進行儲存,並在用戶進行輸入后對該輸入值進行對比,在對比錯誤的情況下,輸出儲存的變量值。
問題d:由於不能出現負數,所以在對兩個隨機數進行減法運算的時候,可以對兩個隨機數進行比較大小。
定義函數:用def szys()實現隨機生成四則運算最后輸出算式並返回正確答案
2)代碼說明:
我們知道,在進行四則運算時進行真分數運算應注意假分數的影響,因此我們在進行代碼編寫時應注意分數的運算,代碼更新如下
import random
from fractions import Fraction
##兩個整數的四則運算
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 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)
##兩個分數的四則運算
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))
def main():
while 1:
print("輸入題目的數量", end=' ')
k = int(input())
p = 100 / k
s = 0
q = []
ans = []
ans2 = []
for i in range(k):
n = random.randint(1, 4)
if n == 1:
c1(q, ans)
g = Fraction(ans[i])
ans2.append(f(g))
else:
c2(q, ans)
g = Fraction(ans[i])
ans2.append(f(g))#記錄帶分數答案
for i in range(k):
print("第{}題:{}".format(i + 1, q[i]), end=" ")
a = input()
if a == str(ans[i]):
s = s + p
print("所得的分數為:{}".format(s))
print("正確答案:", end=" ")
for i in range(k):
if str(ans[i]) == str(ans2[i]):
print(q[i] + str(ans[i]))
else:
print("{}{}或{}".format(q[i],str(ans2[i]),str(ans[i])))
if __name__ == '__main__':
main()
3) 測試運行結果:
5.性能分析
python的性能測試工具有很多種,無非模塊是純Python還是用C寫的。這次我使用cProfile對上面的代碼進行性能分析:
列名 |
含義 |
ncalls |
表示函數調用的次數 |
tottime |
表示指定函數的總的運行時間,除掉函數中調用子函數的運行時間 |
percall |
(第一個percall)等於 tottime/ncalls |
cumtime |
表示該函數及其所有子函數的調用運行的時間,即函數開始調用到返回的時間 |
percall |
(第二個percall)即函數運行一次的平均時間,等於 cumtime/ncalls |
filename:lineno(function) |
每個函數調用的具體信息,一般指向函數名 |
由於篇幅問題,對部分指數進行分析。通過上面的性能分析結果可以看出該代碼有165個函數被調用,用時2.780秒
接下來我們再回到我們的SPS表格記錄下我們在各階段所用的實際時間。
我們的小學四則運算項目基本完成啦。。。。