Git地址 | https://github.com/F0urty-Tw0 |
Git用戶名 | F0urty-Tw0 |
學號後五位 | 61109 |
博客地址 | https://www.cnblogs.com/FourtyTwo/ |
做業連接 | https://edu.cnblogs.com/campus/xnsy/Autumn2019SoftwareEngineeringFoundation/homework/7590 |
因爲想進一步鞏固一下Python,這次做業打算用它來寫,原先要求的Visual Studio 2017
的環境配置就由PyCharm
來代替python
PyCharm是由JetBrains打造的一款Python IDE,進入官網https://www.jetbrains.com/pycharm/,選擇免費的community版本下載便可,如圖所示:
git
安裝過程較爲簡單,未遇到問題,安裝完成效果以下:程序員
進入Windows版git下載地址:https://git-scm.com/download/win,通常來講打開即自動開始下載任務,若長時間未開始,可手動點擊:github
接下來點擊安裝程序一步步來便可,安裝成功後應能夠在桌面或文件夾空白處右鍵下拉菜單中出現Git GUI here以及Git Bash here,以下圖所示:express
再安裝好Git以後,咱們就能夠再Github上克隆指定的項目,首先進入本次做業指定的倉庫地址:https://github.com/Cherish599/AchaoCalculator,點擊右上角的Fork
以後,便可拷貝到本身的同名倉庫中。bash
接下來在個人電腦中任意路徑下點擊鼠標右鍵,選擇Git Bash here,輸入命令行git clone https://github.com/Cherish599/AchaoCalculator.git
,(git clone後的連接即爲倉庫地址)以下圖所示:
app
以後須要在剛剛的路徑下新建一個與Github帳戶名相同的文件夾,以下圖所示:dom
因爲以前經過Github搭建過我的博客,有了安裝及使用Git的經驗,因此本次做業在Git安裝及項目克隆方面沒有出現什麼問題函數
阿超家裏的孩子上小學一年級了,這個暑假老師給家長們佈置了一個做業:家長天天要給孩子出一些合理的,但要有些難度的四則運算題目,而且家長要對孩子的做業打分記錄。工具
做爲程序員的阿超心想,既然天天都須要出題,那何不作一個能夠自動生成小學四則運算題目與解決題目的命令行 「軟件」呢。他把老師的話翻譯一下,就造成了這個軟件的需求:
根據題目背景,得知設計需求爲一個能夠自訂題目數量的四則運算生成器,且結果只能爲整數,還要將全部的算式和正確答案輸出到一個文件中。由此,這個題目的關鍵由三部分構成:表達式的隨機生成、表達式的計算、表達式及答案打印輸出
(程序由包含表達式生成、打印輸出及main()函數的caculator.py文件與包含表達式計算函數的caculate_func.py文件構成)
表達式的隨機生成思路及代碼實現
題目中要求表達式有兩到三個運算符,因此在表達式生成以前應先設定在2和3之間的隨機數,並經過條件分支語句判斷該隨機數爲2仍是3以進行後續的隨機表達式生成。
具體代碼:
r = random.randint(2, 3)
再肯定運算符數量後,聲明一個列表「op」,其元素即爲["+", "-", "*", "/"]四個運算符(此處乘號與除號未直接採用「×」與「÷」是爲了方便後續的計算操做),接着將0到100的隨機數存入另外一列表以便後續插入。在以後的表達式生成時,先取數值列表中的一個隨機值,後經過for in語句將數值循環插入,運算符除插入位置變動外同理。
具體代碼:
for i in range(0, 3): tmp = random.choice(num) formula_list.append(tmp) for i in [1, 3]: tmp = random.choice(op) formula_list.insert(i, tmp)
該功能完整代碼以下:
def new_form(): # 生成新的表達式 op = ["+", "-", "*", "/"] r = random.randint(2, 3) if r == 2: # 經過判斷隨機生成的r來肯定表達式中運算符數量 num = random_num(10) formula_list = [] for i in range(0, 3): tmp = random.choice(num) formula_list.append(tmp) for i in [1, 3]: tmp = random.choice(op) formula_list.insert(i, tmp) elif r == 3: num1 = random_num(10) formula_list = [] for i in range(0, 4): tmp = random.choice(num1) formula_list.append(tmp) for i in [1, 3, 5]: tmp = random.choice(op) formula_list.insert(i, tmp) return formula_list
經過網上查閱,發現python中可使用flatten()函數或list(itertools.chain.from_iterable(zip(l,m)))
語句來直接實現列表的交叉合併,這樣一來表達式的生成一兩條語句即可實現,但我在實際使用過程當中出現報錯語句:TypeError: zip argument #1 must support iteration
而且一直沒法解決(T_T),只能採用上述較爲原始的方法。。。
表達式的計算思路及代碼實現
未避免代碼看起來冗長,將實現這一功能的函數寫入了另外一個文件中,及「calculate_func.py」,並經過python from calculate_func import gen_list, calculate
語句引入至原文件
因爲運算符有加減乘除四個,要將表達式的答案計算出來就要考慮到運算符的優先級,本來想着要用棧實現,但在網上搜索的過程當中發現也能夠利用python的列表加遞歸實現簡單加減乘除的計算。
具體原理爲經過new_form()生成的表達式以列表形式存儲,以後從左向右計算全部乘除號兩邊的數值,而後刪除運算符及其左右兩個數值,再把運算結果保存在第一個數值原先存在的位置,而後第二次循環計算剩下的加減法運行,直至只剩下一個數,即表達式的運算結果,因爲不能出現分數,可讓強轉int後的結果與原結果比較,若相同則正常返回結果
具體代碼以下:
def calculate(expression, isFirst=True): i = 0 while i < len(expression) - 3: a = expression[i] # 獲取操做數1 b = expression[i + 2] # 獲取操做數2 op1 = expression[i + 1] # 獲取運算符 result = None if op1 == "*": result = a * b elif op1 == "/": result = a / b elif not isFirst and op1 == "+": result = a + b elif not isFirst and op1 == "-": result = a - b if result is not None: expression[i] = result # 將第一個操做數替換問運算結果 del (expression[i + 1: i + 3]) # 刪除運算符號和後一個操做數 else: i += 2 # 下標偏移 if isFirst: return calculate(expression, False) elif int(expression[0]) == expression[0]: return expression[0] # 返回結果
表達式打印輸出思路及代碼實現
因爲new_form()函數return了的表達式以列表形式存儲,而且乘號與除號還只是用"*"與"/"表示,因此首先要遍歷生成好的表達式找到乘號與除號,將其替換爲「×」與「÷」。具體能夠利用python中的字典來實現。
首先再定義一個字典op_dictm,即op_dict = {"+": "+", "-": "-", "*": "×", "/": "*"}
,以後經過for in語句遍歷表達式列表,若其中存在"*"與"/",則直接替換字典中對應的value,
具體代碼:
for i in range(length): if form_list[i] in op: form_list[i] = op_dict[form_list[i]]
以後在經過append直接將"="尾插進替換後的表達式。最後,經過"".join(str(i) for i in form_list)
直接將列表中的元素拼接爲字符串再輸出。在此以前,若表達式運算結果爲整數則調用save_to_file()函數將該表達式存入文件,若不爲整數,則再次調用new_form()函數與form_display()函數來從新生成並輸出表達式,直至該表達式答案爲整數。
具體代碼以下:
def form_display(form_list): # 將生成的表達式打印 expression = "".join(str(i) for i in form_list) expression1 = gen_list(expression) result = calculate(expression1, isFirst=True) if result: # 若經過calculate()函數計算表達式結果爲整數,則進行後續的打印輸出 op_dict = {"+": "+", "-": "-", "*": "×", "/": "÷"} op = ["+", "-", "*", "/"] length = len(form_list) for i in range(length): if form_list[i] in op: form_list[i] = op_dict[form_list[i]] # 經過op_dict字典將原有表達式中的乘除運算符替換爲"X"與"÷" form_list.append("=") form_list = "".join(str(i) for i in form_list) # 將form_list列表中的元素拼接爲字符串輸出 print (form_list) save_to_file('subject.txt', form_list+str(result)) else: # 若表達式計算結果不爲整數則不打印任何數據 form_list = new_form() form_display(form_list)
運行結果
首先選中想要進行單元測試的函數,選中後ctrl+shift+T,如圖:
選擇Create New Test.....,以後再彈出的選項框中勾選test method爲:test_new_form
以後在新建的文件中補全對函數進行測試的代碼,在已經設定的類中添加測試函數的方法便可。
如圖所示:
form_display()函數測試結果以下:
在進行單元測試時發現如何測試都不能經過,但本身的程序卻能正常執行,網上查閱後發現要經過PyCharm對函數進行測試,必須按照特定的步驟方法,有些單元測試還要另外安裝特定的模塊,在按照正確的步驟進行後單元測試也能夠正常運行
在一開始進行單元測試時,想固然的添加main函數,認爲測試和正常的代碼執行無異,但嘗試了幾回且確認測試代碼沒有問題後測試仍是沒法正常開始,網上查閱後才發現Pycharm中進行單元測試時不會執行main()函數,在已經設定好的類中添加測試函數的方法便可。
迴歸測試是指修改了舊代碼後,從新進行測試已確認修改沒有引入新的錯誤或致使其餘代碼產生錯誤的一種測試方法。具體流程就是在當前版本中對上一版本中測過的功能再重複測試一遍
在本次做業中,我在form_display()中新增了判斷語句以在運算結果爲整數時執行save_to_file()函數,,爲了肯定功能添加後沒有產生新bug,再次對form_display的打印功能進行了測試。
首先在git clone下來的文件路徑出右鍵,選擇Git bash here
,輸入命令行Git status
檢查倉庫狀態,以下圖所示:
接着輸入命令行Git push
即可以將代碼上傳至GitHub倉庫中,以下圖所示:
以後即可以看到GitHub上的倉庫中多出了與本身帳戶名相同的包含程序源碼的文件夾,點擊本身倉庫界面的New Pull Request
:
在彈出的新頁面中選擇Create pull request
便可成功將做業源碼提交,以下圖所示:
雖然此次做業佔比較小,但卻也用了較長時間而且查閱網上得資料來完成,而且雖然使用了python來完成,卻沒有用到面向對象的思想經過建立類來實現程序,深入體會到了目前能力的不足≡(▔﹏▔)≡。但經過完成此次做業,體會到了軟件設計到實現到測試到發佈的大致流程,熟悉了各類工具的使用,而且在代碼實現過程當中也鞏固了前段時間自學的Python,走了一遍較爲完整的項目設計的流程,由衷地感覺到了鄒欣老師所推崇的「作中學」的思想(ง •_•)ง。