第二次课后作业

一、码云项目地址

  https://gitee.com/LaoXianYuGuJiaMing/personal_project41656

 

二、PSP表格

  

 

三、从零开始的问题

  刚拿到问题时我是一脸问号的,和上学期python课上讲的不同,这次的计算器获取的表达式是正正经经的一条长字符串,那么之前的那种通过按键来计算的思路只能统统推倒,还好老师在作业要求里留了相关知识的博客,通过学习,也算能勉强写出个简单的计算器,下面细就说一下本人从学习到最终完成程序的方方面面。

  在经过一段学习之后,回来再阅读题目,我大概得到了这样的一套程序流程:

       

 

四、程序的设计

  有了思路,那么久开始程序设计。

   1.能支持稍微复杂的混合四则运算(一个或一个以上运算符,有括号)。

   2.代码组织:

      lib.py: 包含核心计算方法与异常处理工具方法。

      main.py: 通过对lib.py文件内的方法进行调用以完成计算。

   3.关键功能代码:

中缀转后缀      

#中缀表达式转换为逆波兰表达式
def nifixToPostfix(expression):
    result = []
    stack = []
    for item in expression:
        if item.isnumeric():
            result.append(item)
        else:
            if len(stack) == 0:
                stack.append(item)
            elif item in '*/(':
                stack.append(item)
            elif item == ')':
                t = stack.pop()
                while t != '(':
                    result.append(t)
                    t = stack.pop()
            # 如果当前字符为加减且栈顶为乘除,则开始弹出
            elif item in '+-' and stack[len(stack) - 1] in '*/':
                if stack.count('(') == 0:
                    while stack:
                        result.append(stack.pop())
                else:
                    t = stack.pop()
                    while t != '(':
                        result.append(t)
                        t = stack.pop()
                    stack.append('(')
                stack.append(item)
            else:
                stack.append(item)
    while stack:
        result.append(stack.pop())

    return "".join(result)

 

 

 计算后缀表达式

 1 # 后缀表达式求值
 2 def expression_to_value(expression):
 3     stack_value = []
 4     try:
 5         for item in expression:
 6             if item in ['+', '-', '*', '/']:
 7                 n2 = stack_value.pop()
 8                 n1 = stack_value.pop()
 9                 result = cal(n1, n2, item)
10                 stack_value.append(result)
11             else:
12                 stack_value.append(int(item))
13         return [True, stack_value[0]]
14     except BaseException:
15         return [False,"表达式存在非法字符或这非法字符位置"]
16 
17 
18 
19 # 四则运算通用方法
20 def cal(n1, n2, op):
21     if op == '+':
22         return n1 + n2
23     if op == '-':
24         return n1 - n2
25     if op == '*':
26         return n1 * n2
27     if op == '/':
28         return n1 / n2

 

 程序主体与结果的输出

 1 # 程序主方法
 2 def main(argv):
 3 
 4     # 获取参数
 5     value = lib.getValueByComment(argv)
 6 
 7     #### 参数处理 ####
 8     status = lib.formulaHandle(value)
 9 
10     # 表达式无异常
11     if status["status"] == True:
12 
13         # 开始计算
14         value = lib.matchComment(value)
15 
16         # 填充数据对象(kv对)
17         if value[0] == True:
18             status["info"] = "计算成功" if value != "" else {}
19             status["value"] = value[1]
20         else:
21             status["info"] = "计算失败" if value != "" else {}
22             status["value"] = "无值"
23 
24         return status
25     else:
26         return status
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 if __name__ == '__main__':
37     dic = main(sys.argv[1:])
38     # 打印数据
39     print "Info: "+lib.strChange(dic["info"])+"!\n"+"value: "+lib.strChange(str(dic["value"]))

 

五、遇到的困难

  一开始最大的困难就是中缀表达式入栈的问题了,不过在阅读了大伟老师提供的资料和反复尝试之后终于解决了问题,之后就是一些对于异常的的判断,不过好歹做出来了。

  以上。

转载于:https://www.cnblogs.com/ofg233/p/9935760.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值