20170928-3 四則運算試題生成


作業要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/997

結對伙伴:苗威

git:https://git.coding.net/songyuu/f4.git

要求1:

(1) 給出每個功能的重點、難點、編程收獲。

功能1的重點是隨機生成4個數字和符號,在python中用random標准庫解決。

功能2的重點是隨機生成括號,用random標准庫解決。難點是括號生成的順序,沒有用逆波蘭解決,覺得一共就4個數字,直接用if語句解決。

功能3的重點是命令行參數,用argparse標准庫解決。難點是判斷是否有命令行參數,學習了語法加上自己的思考解決。

功能4的重點是支持分數,用fractions標准庫解決,難點超級多,python內置函數eval()輸出為浮點數,大約14-16位,生成的分數分子分母都有14-16位,這樣不符合規定,所以要限制位數。

經過多次實驗,例如1/3=0.3333333....如果限制在小數點后10位以下都可以得到1/3,看了一篇博客,寫的是python底層的運行機制,如果是4則運算,只限制10^4即可。

感覺時間不太夠了,所以沒有完成功能4的一又二分之一 表示 1 1/2。

 

 

(2)給出結對編程的體會。

結對編程體會到團隊合作的好處,可以交流解決問題,互相討論互相學習。

(3) 至少5項在編碼、爭論、復審等活動中花費時間較長,給你較大收獲的事件。 

一開始沒有用oop方式寫代碼,經討論后改正。

復審中為避免寫重復代碼而把計算答案寫在了一個函數中,開始沒有注意,沒有給函數變量,導致算的答案是再次隨機生成四則運算的答案。改正這個錯誤讓我更深刻的理解運行機制。

學python不久,導致編碼不是很熟練,經過這次作業,感覺編碼比上次作業要編的好看。

花費時間最長的就是python如何單元測試,期間想換成C++,但是沒換,找各種資料學習,編寫了一個用於單元測試的代碼。

最后用pyinstaller包生成exe文件,相同操作系統有的電腦就好使,有的就不好使。

要求2 :

照片:

 

 

要求3:已經用tortoiseGit上傳。

 

四則運算:

先把所有代碼附上:

#by: sy
class f4(object):
    def __init__(self):
        pass
    def _f4(self):
        from random import randint as r
        from random import uniform as ru
        from fractions import Fraction as f
        ops = ['+', '-', '*', '/']
        bra = ['(', '', ')']
        _l1 = r(0, 1)
        _l2 = r(0, 1)
        _l3 = r(0, 1)
        _r1 = r(1, 2)
        _r2 = r(1, 2)
        _r3 = r(1, 2)
        if _l1 == 0:
            _l2 = 1
            _l3 = 1
            if _r1 == 2:
                _r2 = 1
                _r3 = 1
            else:
                _r2 = 2
                _r3 = 1
        else:
            if _l2 == 0:
                _l3 = 1
                _r1 = 1
                if _r2 == 2:
                    _r3 = 1
                else:
                    _r3 = 2
            else:
                _l3 = 0
                _r1 = 1
                _r2 = 1
                _r3 = 2
        add_1 = ru(0, 1)
        add_1 = f(add_1).limit_denominator(10)
        add_2 = ru(0, 1)
        add_2 = f(add_2).limit_denominator(10)
        add_3 = r(1, 10)
        add_4 = r(1, 10)
        o_1 = r(0, 2)
        o_2 = r(0, 3)
        o_3 = r(0, 3)
        eq = bra[_l1] + str(add_1) + ops[o_1] + bra[_l2] + str(add_2) + \
             bra[_r1] + ops[o_2] + bra[_l3] + str(add_3) + bra[_r2] + \
             ops[o_3] + str(add_4) + bra[_r3]
        return (eq)
    def _f4_answer(self,eq):
        from fractions import Fraction as f
        _answer = f(eval(eq)).limit_denominator(1000)
        _answer = str(_answer)
        return(_answer)
    def _f4_input(self):
        try:
            _y = 0
            _n = 0
            for i in range(20):
                _eq = f4()._f4()
                print(_eq, "=")
                _ans_right = f4()._f4_answer(eq = _eq)
                _ans = input("?")
                if _ans == _ans_right:
                    print("答對了,你真是個天才!")
                    _y = _y + 1
                else:
                    print("你再想想吧,答案似乎是", _ans_right, "喔!")
                    _n = _n + 1
            print("你一共答對", _y, "道題,一共20道題。")
        except:
            print("輸入有誤")
        return (0)
    def _f4_integer_parser(self,x):
        _p = "請輸入正整數。"
        try:
            x = int(x)
            if x >= 0:
                for i in range(x):
                    _eq = f4()._f4()
                    _right = f4()._f4_answer(eq = _eq)
                    _eq = _eq + "="
                    print(_eq.ljust(40), _right)
            else:
                print(_p)
        except:
            print(_p)
        return(0)
if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("-c", "--cin")
    args = parser.parse_args()
    if args.cin == None:
        f4()._f4_input()
    else:
        f4()._f4_integer_parser(args.cin)

四個函數功能分別是:

1.生成算式。

2.計算生成算式。

3.無命令行參數的功能函數。

4.有命令行參數的功能函數。

運行截圖:

 

 

 

 

 

 

命令行參數:

 

 

 

輸出到txt:

 

 

 

 

結對編程環境:

軟件:pycharm

地點:寢室

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM