第三週做業(6)——四則運算試題生成

做業要求地址:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2148python

1、具體要求android

具體實現功能以下:ios

功能1:支持出題4個數的四則運算題目,全部題目要求做者有能力正確回答。(+10)git

功能2:在功能1的基礎上,支持括號。(+15)web

功能3:限定題目數量,「精美」打印輸出,且要避免重複,最好能輸出到.txt文件中。且對輸入題目數進行限定,題目數量必須是正整數。(+10)編程

功能4:支持分數出題和運算。(不完成此題不倒扣分數)數據結構

功能5:可把程序改爲GUI版/web版/移植爲android,ios版。app

這次做業完成是以「結對編程」的形式完成,個人夥伴是段曉睿,她的博客地址爲:https://www.cnblogs.com/ruidxr/dom

2、運行截圖ide

本次編程採用面向過程的方法,首先隨機生成四則運算表達式,而後將算式轉爲逆波蘭表達式,再計算逆波蘭表達式的值即最後算式結果。

功能一、2運行截圖:

功能3運行截圖:

功能4對分數進行計算暫未能實現。

3、代碼分析:

功能實現過程當中,主要的是利用棧實現逆波蘭和計算逆波蘭的過程,重要代碼片斷以下:

1.隨機生成算式

    用隨機生成函數random控制生成數字和運算符,隨機生成0—3實現四個運算符的隨機生成,功能2插入括號是難點,咱們例舉了括號出現的狀況,將生成的狀況編號,進行特定位置插入。

def create_equation():      # 隨機生成算式
    eq = []

    for i in range(3):
        eq.append(random.randint(0, 10))
        eq.append(operator[random.randint(0, 3)])
    eq.append(random.randint(0, 10))
    p = random.randint(1, 5)
    if p is 1:
        eq.insert(0, "(")
        eq.insert(4, ")")
    elif p is 2:
        eq.insert(0, "(")
        eq.insert(6, ")")
    elif p is 3:
        eq.insert(2, "(")
        eq.insert(6, ")")
    elif p is 4:
        eq.insert(2, "(")
        eq.append(")")
    elif p is 5:
        eq.insert(4, "(")
        eq.append(")")
    return eq
View Code

2.實現逆波蘭

    「逆波蘭」我印象中沒有據說過,後來通過網上學習才知道原來逆波蘭表達式就是後綴表達式,這個在數據結構中印象仍是挺深入的,但具體實現起來仍是比較困難,上網進行了屢次查詢。逆波蘭表達式的轉換主要和優先級有關,爲運算符優先級提早定義編號,可比較優先級的大小。

def reverse_polish(equation):       # 將算式轉換爲逆波蘭表達式
    result = []
    c = []
    slist = [i for i in equation]

    for item in slist:
        if item in range(0, 100):
            result.append(item)
        elif not c and item in cal.keys():
            c.append(item)
            continue
        elif c and item in cal.keys():
            for x in range(c.__len__()):
                z = c[-1]
                temp = cal[z] if z in cal else cal1[z]
                if temp >= cal[item]:
                    result.append(c.pop())
                else:
                    c.append(item)
                    break
            if not c:
                c.append(item)
        elif item is ")":
            for x in range(c.__len__()):
                if c[-1] == "(":
                    c.pop()
                    break
                else:
                    result.append(c.pop())
        elif item is "(":
            c.append(item)
        # print(result,c)
    for x in range(c.__len__()):
        result.append(c.pop())
    return result
View Code

3.計算逆波蘭表達式  

def calculate(re_equation):         # 計算逆波蘭表達式
    stack = PyStack()
    sumEnd = 0

    if len(re_equation) is 0:
        return sumEnd
    for i in re_equation:
        if i in range(0, 100):
            stack.push(float(i))
        elif '+' is i:
            a = stack.pop()
            b = stack.pop()
            stack.push(b + a)
        elif '-' is i:
            a = stack.pop()
            b = stack.pop()
            stack.push(b - a)
        elif '*' is i:
            a = stack.pop()
            b = stack.pop()
            stack.push(b * a)
        elif '÷' is i:
            a = stack.pop()
            b = stack.pop()
            if a == 0:
                return False             #print('%d/%d分子不能爲0' % (b, a))
            else:
                stack.push(b / a)
    return stack.pop()
View Code

4.棧

創建棧的時候比較費時間,開始的時候咱們都無從下手,後來參考模板進行改寫。

class PyStack(object):      #自定義棧

    def __init__(self, initSize = 20, incSize = 10):
        self.initSize = incSize
        self.incSize = incSize
        self.stackList = []
        self.top = self.bottom = 0

    def push(self, ele):
        if self.top-self.bottom >= self.initSize:
            self.incSize += self.initSize
        self.stackList.append(ele)
        self.top += 1

    def pop(self):
        if self.top-self.bottom > 0:
            self.top -= 1
            ret = self.stackList.pop()
            return ret
        else:
            return None

    def len(self):
        return self.top-self.bottom
View Code

4、總結:

     本次結對編程過程雖然有過爭論,僵持,但整體仍是比較和諧,Python是我不太熟悉的語言,剛開始咱們分析了一下題目要求,大體列出每一個功能實現的方法,以後我就進行了加緊學習。接觸到python才感覺到它有多麼強大,很容易上手,代碼可讀性很是高,索性python運用起來比較好上手,我也算及時遇上了進度,代碼規範的時候,咱們在python書寫的基本規範上進行進一步討論,編寫過程當中相互監督,也是有了此次機會,我才知道本身代碼編寫有許多小毛病,在隊友的提醒下,及時改正。兩我的結對編程剛開始的時候感受效率不是很高,可是通過幾天的默契培養以後,明顯感受效率提升了好多。本身編代碼常常會分析問題的時候屢不清思路,可是兩我的的時候就不多會出現這個問題,一我的領航,一我的寫代碼,遇到糾結的地方及時討論、分析、解決。代碼編程壞習慣也改正了很多。

5、合做過程

工做地點:星華公寓B201

照片:

6、版本控制

git地址:https://git.coding.net/liu-xin/f4.git

相關文章
相關標籤/搜索