[ Python ] 計算器

做業要求:python

經過python re模塊計算表達式:正則表達式

1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )

禁止使用 eval 或者 直接運算,結合正則表達式進行處理算法

 

README部分ide

使用正則表達式計算帶括號的四則運算

1. 去除表達式中的括號
2. 經過正則表達式獲取最內層的第一個括號
3. 去掉括號進行先乘除再加的算法
4. 用計算結果替換掉括號裏的內容
5. 判斷是否還存在括號,存在重複執行一、二、三、4
6. 不存在括號執行先乘除、再加的算法計算出最終結果
README

 

流程圖:函數

 

 

代碼實現部分:spa

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import re

s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'


def wipe(s):
    '''
    根據數學運算,去除重複的運算符號
    :param s: 只剩下加減運算的表達式
    :return: 去除多餘的表達式符號
    '''
    res = s.replace('+-', '-').replace('-+', '-').replace('++', '+').replace('--', '+')  # 經過replace進行替換
    return res


def get(s):
    '''
    去除原始表達式中的空格,並經過re.split以最內層括號第一個分隔爲三個元素,最內層括號第一個表達式的索引爲 1
    :param s: 最原始的運算表達式
    :return: 返回list,其中其中索引爲1的元素就是最內層括號第一個首先要計算的表達式
    '''
    no_space_exp = re.sub(' ', '', s)  # re.sub 去除表達式中的空格符
    res = re.split("(\([^()]+\))", no_space_exp, 1)  # 分解成列表且索引爲1的元素即第一個要計算的表達式
    return res


def add_num(s):
    '''
    加減運算
    :param s: 去括號後的計算表達式
    :return: 加減表達式計算後的結果值
    '''
    s = wipe(s)  # 進行加減運算的時候,去除掉多餘的符號
    list_num = re.findall("([+-]?\d+\.?\d*)", s)  # 查找表達式中的每一個具體的數字
    k = 0
    for i in list_num:
        k += float(i)  # 進行累加操做
    return k


def mul(s):
    '''
    乘除算法,若是表示不存在乘除運算就返回到加減函數中
    :param s: 括號中要計算的表達式
    :return: 加減函數
    '''
    while True:
        res = re.split("(\d+\.?\d*[*/][+-]?\d+\.?\d*)", s, 1)  # 獲取括號內的計算表達式
        if len(res) == 3 and '*' in res[1]:  # 判斷計算表達式是不是乘法計算
            a, b, c = res
            d, e = b.split('*')
            res_b = float(d) * float(e)  # 進行乘法計算
            s = a + str(res_b) + c  # 括號內計算的結果替換掉帶括號的表達式
        elif len(res) == 3 and '/' in res[1]:  # 判斷計算表達式是不是除法計算
            a, b, c = res
            d, e = b.split('/')
            res_b = float(d) / float(e)  # 進行除法計算
            s = a + str(res_b) + c  # 括號內計算的結果替換掉帶括號的表達式
        else:
            return add_num(s)  # 若是表達式不存在乘法和除法,則進行加減運算


def counter(s):
    '''
    循環計算括號中的表達式,並將計算結果替換原始表達式括號的內容
    :param s: 傳入要計算的原始表達式
    :return: 當全部的括號計算完成並替換完畢後,在進行最後的計算並獲得最終結果
    '''
    while True:
        res = get(s)
        if len(res) == 3:
            a, b, c = res
            res_b = mul(b)
            s = a + str(res_b) + c
        else:
            return mul(s)


print(counter(s))
計算器代碼實現
相關文章
相關標籤/搜索