課後做業2

個人項目地址是:https://gitee.com/yeyishenzz/personal_project41678/tree/master/Python/2016035107307/srchtml

這是個人PSP表格。python

 

拿到這個題目, 首先想到的是如何進行加減乘除運算,由於最開始寫須要測試成功,因此直接寫了個類,直接賦值進去。由於每一個模塊都須要對應的調用,因此須要輸入的問題能夠最後用input設置一下。 而後是進行括號的運算,而後進行輸入行的整理和測試。git

最後對特殊狀況進行處理。正則表達式

分爲4個類,具體變量爲括號前,括號裏,括號後......(主要的這3個) 算法類 分爲2種狀況有括號和沒括號,有括號爲一種算法(Calculatemain),沒有括號爲另一種算法(Calculatemain2),第二種算法須要另外寫一個類來對錶達式進行處理。(Calculate2)算法

最後一個類爲Calculate 計算類。 寫了加減乘除的邏輯關係。由於Python自己識別運算的前後順序,因此只須要考慮括號。本次寫的代碼一共分爲了5個部分,第一個部分爲最開始的簡單的邏輯運算(First),第二個部分爲添加括號運算(Second),第三個部分爲ide

給正常運算以及帶有括號的運算添加表達式(Third),第四個部分爲代碼中出現的一些Bug 如:輸入的不是數字應該提示錯誤,除法運算的時候分母不該該等於0,負數運算的時候應該有另一種邏輯關係(沒有實現)。(Fourth)。第五個部分爲給代碼加入能夠從函數

cmd直接傳入參數的模塊及代碼。性能

許多性能的代碼並不知道在網上借鑑了許多Python中模塊的用法,一點一點的本身進行Print輸出實驗,看輸出的是什麼東西。用了差很少1個多小時。單元測試

關鍵函數流程圖學習

說明實現算法的關鍵部分:

def Calculatemain2(String1):
    if(String1.__contains__("*")):
        String1 = Calculate2(String1,"*")
        return Calculatemain2(String1)
    if(String1.__contains__("/")):
        String1 = Calculate2(String1,"/")
        return Calculatemain2(String1)
    if(String1.__contains__("+")):
        String1 = Calculate2(String1,"+")
        return Calculatemain2(String1)
    if(String1.__contains__("-")):
        String1 = Calculate2(String1,"-")
        return Calculatemain2(String1)
    return String1
def Calculate2(String1,fuhao):
    start = String1.index(fuhao)
    left = String1[0:start]
    right = String1[start + 1:]
    if(left.isdigit() and right.isdigit() ):
        leftnum = re.search('\d+$',left).group()
        rightnum = re.search('\d',right).group()
        newnum = left.rstrip(leftnum) + str(Calculate(leftnum,rightnum,fuhao)) + right.lstrip(rightnum)
        return newnum
    else:
        print ("error:請輸入正數不能輸入特殊符號")

這段代碼是非括號運算的 對傳入的數據放進列表中,進行運算。 嗯...這段代碼其實並非很難,上網查了正則和對字符串中內容判斷的知識點。也就OK了,由於以前加了對負數等等進行操做邏輯關係有點混亂(加上懶)就沒寫,畢竟能夠用eval直接寫出來(哈哈啊哈哈,不要扣我分)。

單元測試: 每一個模塊進行實例化  用最常規的實例進行測試。 

from main import *
import unittest
class Testyunsuan(unittest.TestCase):
    def test_add(self):
        ta = yunsuan("3+1")
        self.assertEqual(ta,'4')
    def test_reduce(self):
        ta = yunsuan("6-2")
        self.assertEqual(ta,'4')
    def test_ride(self):
        ta = yunsuan("6*2")
        self.assertEqual(ta,'12')
    def test_except(self):
        ta = yunsuan("6/3")
        self.assertEqual(ta,'2.0')
    def test_kuohao(self):
        ta = yunsuan("(6-3)*2")
        self.assertEqual(ta,'6')
    def test_kuohao(self):
        ta = yunsuan("6/0")
        self.assertEqual(ta,'分母不能爲0')
    def test_add1(self):
        self.assertRaises(BaseException,yunsuan,("-1+2"))
    def test_reduce1(self):
        self.assertRaises(BaseException,yunsuan,("-1-2"))
    def test_ride1(self):
        self.assertRaises(BaseException,yunsuan,("-1*2"))
    def test_except(self):
        self.assertRaises(BaseException,yunsuan,("-1/2"))
if __name__ == "__main__":
    unittest.main()

對加減乘除,進行了測試測試所有經過,分母爲0,以及錯誤報出的異常所有經過,而且有提示。

 

http://www.runoob.com/python/att-string-rindex.html 這是查詢如何肯定算法中括號位置的網址。

http://www.cnblogs.com/dplearning/p/5834628.html 這是查詢正則表達式如何把算數式表達出來的網址。

https://www.cnblogs.com/wangboqi/p/7455240.html 這是判斷字符串中內容的網址。

結合在構建之法中學習到的相關內容與我的項目的實踐經歷,撰寫解決項目的心路歷程與收穫。

我以爲在本次的學習中,首先學會了Git的用法,命令行如何獲取參數,以及根據做業須要的知識本身所學到的一些知識,心路歷程就是看到這個題目,再看到不讓用eval函數,「就很開心」。怎麼辦我不知道,想了一夜,那就先把最簡單的寫了算了,寫完了次日就查

資料,如何找括號,由於以前寫計算器還有一點點印象因此就把算式放在了最後寫(哈哈哈哈哈)。總而言之,這次項目讓我以爲本身仍是有些差距的,有的大佬可能幾十分鐘就寫完了,還得繼續努力! 加油!

相關文章
相關標籤/搜索