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