环境小硕的转行之路-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('请输入计算式:\n')
print('%s的结果是:\n'%formula+bracket_func(formula.replace(' ','')))

  

posted @ 2019-10-25 18:41  negu  阅读(146)  评论(0编辑  收藏  举报