做业要求地址: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