作業要求: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
地點:寢室