源代碼已上傳至Github,https://github.com/chaigee/arithmetic,中的python_ari.py文件
題目:
(1)能自動生成小學四則運算題目,並且不能出現負數;
(2)能支持真分數的四則運算;
思路:
(1)四則運算加減乘除,采用兩個隨機數,由於不能出現負數,則對兩個隨機數進行比較大小再進行減法運算,除法一向特殊,所以在隨機數的取值范圍中設置不包括0。
(2)真分數運算在pycharm中導入fractions庫,其余類似。
from fractions import Fraction
實現過程:
設計三個函數:
def newint() 生成整數四則運算
def newfra() 生成真分數四則運算
def newtest() 生成制定指定數量的四則運算題目
函數關系:
newint()與newfra()為獨立的函數,負責生成隨機四則運算,newtest()則隨機調用上述兩個函數生成題目。詳細描述請看下方代碼說明
代碼說明:
首先說明整數的四則運算,生成兩個隨機數並隨機運算,在減法中比較大小防止出現負數,在除法中比較大小並循環取整除的隨機數組合。最后輸出算式並返回正確答案。
def newint():
opr = ['+', '-', '×', '÷']
fh = random.randint(0, 3)
n1 = random.randint(1, 20)
n2 = random.randint(1, 20)
rjg = 0
if fh == 0:
rjg = n1 + n2
elif fh == 1:
n1, n2 = max(n1, n2), min(n1, n2)
rjg = n1 - n2
elif fh == 2:
rjg = n1 * n2
elif fh == 3:
n1, n2 = max(n1, n2), min(n1, n2)
while n1 % n2 != 0:
n1 = random.randint(1, 10)
n2 = random.randint(1, 10)
n1, n2 = max(n1, n2), min(n1, n2)
rjg = int(n1 / n2)
print(n1, opr[fh], n2, '= ', end='')
return rjg
真分數四則運算類似。
def newfra():
opr = ['+', '-', '×', '÷']
fh = random.randint(0, 3)
t1 = random.randint(1, 10)
t2 = random.randint(t1, 10)
n1 = Fraction(t1, t2)
t1 = random.randint(1, 10)
t2 = random.randint(t1, 10)
n2 = Fraction(t1, t2)
rjg = 0
if fh == 0:
rjg = n1 + n2
elif fh == 1:
n1, n2 = max(n1, n2), min(n1, n2)
rjg = n1 - n2
elif fh == 2:
rjg = n1 * n2
elif fh == 3:
n1, n2 = max(n1, n2), min(n1, n2)
rjg = n1 / n2
print(n1, opr[fh], n2, '= ', end='')
return rjg
newtest()函數是要求用戶輸入一個整數來輸出算式的數量,采用while循環隨機生成整數或者真分數運算,將答案保存在rjg列表的同時輸出算式直到算式數量達到要求。最后輸出rjg列表即輸出答案。
def newtest():
opr = ['+', '-', '×', '÷']
print('輸入題庫所需要的題目數量')
n=int(input())
rjg=[]
m=0
while m<=(n-1):
fh = random.randint(0, 4)
if fh==0:
print(m+1,end='、')
rjg.append(newfra())
print(' ')
else:
print(m+1,end='、')
rjg.append(newint())
print(' ')
m=m+1
m=0
print('答案:')
while m<=(n-1):
print(m+1,'、',rjg[m])
m=m+1
下列為主函數,第一個模式負責調用上述newint()、new函數,並獲得函數返回值即算式答案,與用戶輸入值進行比較。第二個模式則是生成算式題目。
print('1、四則運算')
print('2、制作題庫')
n=int(input())
if n==1:
print('input "0000" to Quit')
while True:
fh = random.randint(0, 4)
if fh == 0:
rjg = newfra()
jg = input()
if jg == '0000':
break;
sr = Fraction(jg)
if sr == rjg:
print('right')
else:
print('error. the Tight answer is', rjg)
else:
rjg = newint()
jg = input()
if jg == '0000':
break;
sr = int(jg)
if sr == rjg:
print('right')
else:
print('error. the Tight answer is', rjg)
if n==2:
newtest()
測試運行:
先測試運行第一個模式,如下圖:

第二個模式,先輸出20個算式數量:


輸出1000個算式數量,運行完成且無報錯,部分截圖如下:

效能分析:
由於本人沒有做過效能分析,在編寫代碼的時候尚未學習該功能,所以在修改程序的過程中沒有相關記錄。在改進完程序之后再進行學習效能分析才發現步驟錯了,最終只能對改進后的程序直接進行分析,請諒解。本次分析采用軟件pycharm內置的工具Profile,由於該工具是只對程序運行一次再輸出這次運行的效能分析表格(具體功能尚未弄懂),所以根據本人程序,對newtest()函數輸入10000的整數來輸出10000個算式數量,結果如圖(效能分析表格界面由Name、Call Count、Time(ms)、Own Time(ms) 4列組成。表頭Name顯示被調用的模塊或者函數;Call Count顯示被調用的次數;Time(ms)顯示運行時間和時間百分比,時間單位為毫秒):


PSP表格:
| 預計耗時(分鍾) | 是實際耗時(分鍾) | ||
| Planning | 計划 | 10 | 10 |
| Estimate | 估計這個任務需要多少時間 | / | / |
| Development | 開發 | 120 | 240 |
| Analysis | 需求分析 | 5 | 10 |
| Design Spec | 生成設計文檔 | / | / |
| Design Review | 設計復審(和同事審核設計文檔) | / | / |
| Coding Standerd | 代碼規范(為目前的開發制定合適的規范) | / | / |
| Design | 具體設計 | 5 | 10 |
| Coding | 具體編碼 | 30 | 60 |
| Code Review | 代碼復審 | 5 | 10 |
| Text | 測試(自測,修改代碼,提交修改) | 10 | 30 |
| Reporting | 報告 | 10 | 20 |
| Text Report | 測試報告 | 10 | 20 |
| Size Measurement | 計算工作量 | 5 | 5 |
| Postmortem & Process Improvement Plan | 事后總結,並提出過程改進計划 | 5 | 5 |
| Sum | 合計 | 215 | 420 |
