源代碼已上傳至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 |