結對專案(python)
阿新 • • 發佈:2020-10-12
專案 | 內容 |
---|---|
這個作業屬於哪個課程 | 資訊保安1812 |
這個作業要求在哪裡 | 作業要求連結 |
這個作業的目標 | 結對專案,實現自動生成小學四則運算題目 |
作業Github地址
實現思路
定義四個函式
關鍵程式碼
用python實現四則運算的關鍵程式碼。整數的四則運算沒有難點,而真分數的計算要稍動頭腦。好在python 中的Fraction模組為此提供不少便利,只需要和整數運算相同的程式碼量即可實現,這也正是我選擇python完成本次專案的原因。借用random模組可以輕易實現隨機生成的任務。
#整數四則運算(範圍0~n) def newint(num): Exercises='' Answers='' opr = ['+', '-', '×', '÷'] fh = random.randint(0, 3) n1 = random.randint(1, num) n2 = random.randint(1, num) 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) Exercises=str(n1) + opr[fh] + str(n2) + '=' Answers=str(rjg) return Exercises,Answers #真分數四則運算 def newfra(num): opr = ['+', '-', '×', '÷'] fh = random.randint(0, 3) t1 = random.randint(1, num) t2 = random.randint(t1, num) n1 = Fraction(t1, t2) t1 = random.randint(1, num) t2 = random.randint(t1, num) 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 Exercises=str(n1) + opr[fh] + str(n2) + '=' #對真分數進行規範化表達 if rjg>1 and (rjg-int(rjg))!=0: Answers=str(int(rjg))+"'"+str(rjg-int(rjg)) else: Answers=str(rjg) return Exercises,Answers
主函式。涉及讀寫檔案,需要呼叫上述函式,按一定引數生成題目和答案,並寫入Exercises.txt和Answers.txt檔案即可。
#生成試卷和答案 def newtest(): opr = ['+', '-', '×', '÷'] Exercises='' Answers='' #輸入生成題目的個數和數值的範圍 print('請輸入生成題目的個數:') n=int(input()) print('請輸入生成題目中數值的範圍:') num=int(input()) #建立練習和答案文字 ExercisesFile = open('Exercises.txt' , 'w') AnswersFile = open('Answers.txt' , 'w') #生成題目並寫入練習和答案檔案 #隨機生成n道四則運算 m = 0 while m<=(n-1): fh = random.randint(0, 2) if fh==0: Exercises,Answers=newfra(num) else: Exercises,Answers=newint(num) #寫入文字 ExercisesFile.write('%s、%s\n' %(m+1,Exercises) ) AnswersFile.write('%s、%s\n' %(m+1,Answers) ) m=m+1 #關閉檔案 ExercisesFile.close() AnswersFile.close()
比對答案文字,給出做題對錯,結果儲存在Grade.txt中。
#判定答案中的對錯 def check(testanswer): Correct=[] Wrong=[] i=0 testanswerFile = open(testanswer, 'r') AnswersFile = open('Answers.txt', 'r') GradeFile = open('Grade.txt', 'w') t=testanswerFile.readline() a=AnswersFile.readline() for i in range(len(t)): if t[i]==a[i]: Correct.append(str(i+1)) else: Wrong .append(str(i+1)) i+=1 print( 'Correct:',len(Correct) ,Correct) print( 'Wrong:',len(Wrong) , Wrong,) testanswerFile.close() AnswersFile.close() GradeFile.close()
測試結果
PSP表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 20 | 15 |
Estimate | 估計這個任務需要多少時間 | 10 | 20 |
Development | 開發 | 200 | 200 |
Analysis | 需求分析 (包括學習新技術) | 40 | 45 |
Design Spec | 生成設計文件 | 20 | 20 |
Design Review | 設計複審 | 25 | 20 |
Coding Standard | 程式碼規範 (為目前的開發制定合適的規範) | 15 | 10 |
Design | 具體設計 | 10 | 10 |
Coding | 具體編碼 | 100 | 180 |
Code Review | 程式碼複審 | 30 | 30 |
Test | 測試(自我測試,修改程式碼,提交修改) | 80 | 40 |
Reporting | 報告 | 50 | 50 |
Test Repor | 測試報告 | 20 | 20 |
Size Measurement | 計算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事後總結, 並提出過程改進計劃 | 30 | 30 |
合計 | 900 | 820 |
寫在後面
四則運算的演算法相對簡單,大一的時候也寫過類似的程式碼,不過是用c語言寫的。
python在模組上通常能提供不少便利,因此雖然需求增多了,程式碼量卻變化不大。
程式碼中我認為重要的地方都寫了註釋(也是防止自己回頭就忘了)。
整數和真分數的演算法儘管重疊率非常高,但為了日後加入新功能(雖然大概率不會有)而分開定義。