python学习之路 实现简单的计算机功能。

计算器的主要思维是:

1、对输入的表达式去除其空格

2、判断用户输入的表达式中的括号是否合法

3、每次找到这个表达式只有一对括号的表达式(就是这找到的表达式内部没有括号)

4、对找到的只有一对括号中的表达式进行先乘除再加减的运算,把计算的结果替换到找到的表达式中

5、直到表达式中没有括号为止。

6、我们在调用上面的有一个先计算乘除在计算加减的函数。最后得到结果。

具体的代码如下:

#!/usr/bin/env python
# -*-coding:utf-8-*-
import re
#  查看表达式的括号是否合法
def check_bracket(expression):
    tmp = []
    for i in expression:
        if i == '(':
            tmp.append(i)
        elif i == ')':
            if len(tmp)>0:
                tmp.pop()
            else:
                return False
    if len(tmp)>0:
        return False
    else:
        return True
# 去掉表达式中多余相连的符号
def clear_operator(expression):
    expression = expression.replace('--', '+')
    expression = expression.replace('+-', '-')
    return expression
# 计算乘除
def multiply_divide(exp_son):
    if '*' in exp_son:
        left, right = exp_son.split('*')
        return str(float(left)*float(right))
    else:
        left, right = exp_son.split('/')
        return str(float(left) / float(right))

# 4、没有括号的表达式先计算乘除在把只有加减的公式分割成一个列表相加列表中的一个个元素
def cal_no_bracket(expression):
    # 先去除只有一对括号的表达式的括号
    # 9-2*-5/3 + 7 /3*99/4*2998 +10 * 568/14
    # 先乘除在加减
    while True:
        ret = re.search('\d+\.?\d*[*/]-?\d+\.?\d*', expression)
        if ret:
            exp_son = ret.group()
            ret = multiply_divide(exp_son)  # 把公式匹配到的乘除传入这个函数计算其值
            expression = expression.replace(exp_son, ret)
            expression = clear_operator(expression)
        else:
            # 这里面只有加减我们把这里面所有的值用正则把除了+所有的数找出来[-3,34,3.2345]相当于以+做分隔符
            # 我们只要把里面所有的元素相加就行了
            ret = re.finditer('-?\d+\.?\d*',expression)
            sum = 0
            for i in ret:
                sum += float(i.group())
            return str(sum)

# 3、先去掉所有的括号在计算其结果
def remove_bracket(expression):
    while True:
        # 先去掉所有的括号
        express_a_bracket = re.search('\([^()]+\)',expression)
        if express_a_bracket:
            # 处理这个只有一对括号的表达式
            express_a_bracket = express_a_bracket.group()
            ret = cal_no_bracket(express_a_bracket.strip('()'))  # 把括号里的表达式进行运算
            expression = expression.replace(express_a_bracket, ret)
            expression = clear_operator(expression)
        else:
            new_expression = cal_no_bracket(expression)
            return new_expression



if __name__ == '__main__':
    # 1、去除用户输入的表达式去除空格
    # 2、这里我们用栈的方式确认用户输入的括号对是否合法
    expression_input = input('>>>:').replace(' ', '')
    if check_bracket(expression_input):  # 如果表达式的括号合法那就执行下面的
        ret = remove_bracket(expression_input)
        print(eval(expression_input))
        print(ret)
    else:
        print('表达式括号不合法')

猜你喜欢

转载自www.cnblogs.com/yang-China/p/9229882.html