1. 程式人生 > 實用技巧 >結對專案(python)

結對專案(python)

專案 內容
這個作業屬於哪個課程 資訊保安1812
這個作業要求在哪裡 作業要求連結
這個作業的目標 結對專案,實現自動生成小學四則運算題目

作業Github地址

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在模組上通常能提供不少便利,因此雖然需求增多了,程式碼量卻變化不大。
程式碼中我認為重要的地方都寫了註釋(也是防止自己回頭就忘了)。
整數和真分數的演算法儘管重疊率非常高,但為了日後加入新功能(雖然大概率不會有)而分開定義。