zoukankan      html  css  js  c++  java
  • 环境小硕的转行之路-24-大作业:编写计算机程序

    作业:编写一个计算机,输入一个字符串的数学表达式(+-*/)可以计算其结果.

    法一(老师的标准答案):

    import re
    def atom_cal(exp):#原子性计算
        if '*' in exp:
            a,b = exp.split('*')
            return str(float(a)*float(b))#计算乘法
        elif '/' in exp:
             a,b = exp.split('/')#计算除法
             return str(float(a)/float(b))
    def format(exp):#标准化
        exp=exp.replace('--','+')
        exp=exp.replace('+-','-')
        exp=exp.replace('-+','-')
        exp=exp.replace('++','+')
        return exp
    def mul_div(exp):#乘除法的计算
        while True:
            ret = re.search('d+(.?d+)?[*/]-?d+(.?d+)?',exp)#查看式子是否有乘除法
            if ret:
                atom_exp = ret.group()
                res = atom_cal(atom_exp)
                exp = exp.replace(atom_exp,res)
            else :
                return exp
    def sub_add(exp):
        ret = re.findall('[+-]?d+(?:.d+)?', exp)#查看是否需要加减法
        sum = 0
        for i in ret:
            sum += float(i)
        return sum
    def cal(exp):
        while True:
            # ret = re.search('d+(.?d+)?[*/]-?d+(.?d+)?',exp)
            # if ret:
            #     atom_exp = ret.group()
            #     res = atom_cal(atom_exp)
            #     exp = exp.replace(atom_exp,res)
            # else :
            #     break
            exp = mul_div(exp)#先乘除
            exp = format(exp)#标准化式子一下
            res = sub_add(exp)#后加减
            return  res
            # ret = re.findall('[+-]?d+(?:.d+)?',exp)
            # sum = 0
            # for i in ret:
            #     sum += float(i)
            # return sum
    print(cal('2-1*-22+3-4/-5'))#测试一下
    
    def main(exp):#去除空格+主函数
        while True:
            exp = exp.replace(' ','')
            ret = re.search('([^()]+)',exp)#也可以用findall一个个换
            if ret:
                inner_bracket = ret.group()
                res = str(cal(inner_bracket))#只有在这里将float转成str才能最后返回的是float
                exp.replace(exp,res)
                exp = format(exp)
            else:
                break
        return cal(exp)#返回的是float类型
    print(main('2-1*-22+3-4/-5'))
    

      

    法二(自己想的,递归版):

    import re
    def format(exp):#标准化
        exp=exp.replace('--','+')
        exp=exp.replace('+-','-')
        exp=exp.replace('-+','-')
        exp=exp.replace('++','+')
        return exp
    def bracket_func(formula):
        ret = re.search('(([^()])+)',formula)
        if ret:
            ret = ret.group().replace('(', '').replace(')', '')#把传入式子的括号去除
            bracket_ret = multiplication_and_division(ret)
            formula = formula.replace('('+ret+')',bracket_ret)#去除主式子的括号
            return bracket_func(formula)
        else:
            return multiplication_and_division(formula)
    def multiplication_and_division(str1):
        format(str1)
        ret = re.search('(-?d+(.?d+)?[*/]-?d+(.?d+)?)',str1)
        if ret:
            str1 = str1.replace(ret.group(),str(eval(ret.group())),1)
            return multiplication_and_division(str1)#递归函数
        else:
            return subtraction_and_addition(str1)#没有乘除号传入乘除函数
    def subtraction_and_addition(str2):
        ret1 = re.search('(d+(.?d+)?+-?d+(.?d+)?)|(d+(.?d+)?--?d+(.?d+)?)',str2)#加减法可以用[+-]来表示,当时没想到.
        if ret1:
            str2 = str2.replace(ret1.group(),str(eval(ret1.group())),1)
            return subtraction_and_addition(str2)
        else:
            return str2
    formula = input('请输入计算式:
    ')
    print('%s的结果是:
    '%formula+bracket_func(formula.replace(' ','')))
    

      

  • 相关阅读:
    Java修饰符大汇总
    死锁
    线程的几种可用状态
    重载与覆盖(重写)
    Git
    JS跨域
    Spring中的Bean
    ZooKeeper
    Mysql(2)
    Maven
  • 原文地址:https://www.cnblogs.com/negu/p/11739657.html
Copyright © 2011-2022 走看看