欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python实现计算器功能的小练习

程序员文章站 2022-05-21 11:55:44
#知识点梳理 # 计算器的编程本文主要考虑思路:运算最小单元就是两个数的 = - * / n次方,以及一个数的阶乘。。其余都是重复进行运算 # 利用循环实现多个数相乘或相除 # 括号的关系:是又一层的循环。利用函数嵌套关系,将运算函数进行封装。 # 考核 正则表达式的运用 # \d+(\.\d+)?[*/]-?\d+(\.\d+)? 乘除法 # [+-]?\d+(?:\.\d+)? 加减法 # \(....
#知识点梳理
    # 计算器的编程本文主要考虑思路:运算最小单元就是两个数的 = - * / n次方,以及一个数的阶乘。。其余都是重复进行运算
    # 利用循环实现多个数相乘或相除
    # 括号的关系:是又一层的循环。利用函数嵌套关系,将运算函数进行封装。
    # 考核 正则表达式的运用
        # \d+(\.\d+)?[*/]-?\d+(\.\d+)?   乘除法
        # [+-]?\d+(?:\.\d+)?             加减法
        # \([^()]+\)                     括号
    # re模块的应用-----将字符串转为 列表
        # re.findall()    re.search()   roup()
    # 字符串的操作
        # replace   split
#知识点梳理
    # 计算器的编程本文主要考虑思路:运算最小单元就是两个数的 = - * / n次方,以及一个数的阶乘。。其余都是重复进行运算
    # 利用循环实现多个数相乘或相除
    # 括号的关系:是又一层的循环。利用函数嵌套关系,将运算函数进行封装。
    # 考核 正则表达式的运用
        # \d+(\.\d+)?[*/]-?\d+(\.\d+)?   乘除法
        # [+-]?\d+(?:\.\d+)?             加减法
        # \([^()]+\)                     括号
    # re模块的应用-----将字符串转为 列表
        # re.findall()    re.search()   roup()
    # 字符串的操作
        # replace   split

import re

def factorial_ts(exp):        # 定义阶乘算法
    if exp == 0 or exp == 1:
        return 1
    else:
        return exp * factorial_ts(exp-1)

def power_ts(exp_1,exp_2):              # 定义n次方
    if exp_2 == 0:
        return 1
    elif exp_2 == 1:
       return exp_1
    else:
        return exp_1 * power_ts(exp_1,exp_2-1)


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 = 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) #调用上面个的atom_cal计算
            exp = exp.replace(atom_exp,res) #将计算的结果把原来的算是替换掉
        else:return exp   #如果匹配不到的话说明乘除法计算完毕,返回计算结果

def add_sub(exp):  #计算加减法
    ret = re.findall('[+-]?\d+(?:\.\d+)?', exp)  #利用正则表达式匹配算式中的带符号的每项数字,返回一个列表
    exp_sum = 0
    for i in ret:
        exp_sum += float(i)   #将列表中的每一项求和
    return exp_sum


def factorial_exp(exp):                                     # 计算阶乘
    while True:
        exp_f = re.search('\d+(?:\.\d+)?!',exp) #       匹配符合阶乘形式的结果
        # print(info_f)
        if exp_f:
            info_f = exp_f.group()
            ret_f = factorial_ts(int(info_f[:-1]))  # 遍历匹配到的阶乘,将数字和运算号区分,并计算值
            # print(ret_f)
            exp = exp.replace(info_f, str(ret_f))  # 将计算结果替换输入的运算中需计算阶乘的位置,完成阶乘的运算并返回值
            # print(exp)
        else:return exp                         # 如果没有匹配到,则返回原值
# print(factorial_exp('5-3!-4!+5!+6'))

def power_exp(exp):
    while True:                       # 计算n次方
        info_p = re.search('\(-(?:\d+(?:\.\d+)?)\)\*\*\d+|\d+(?:\.\d+)?\*\*\d+',exp) # 匹配符合n次方形式的结果
        # print(info_p)
        if info_p:
            info_p = info_p.group()
            # print(info_p)
            exp_1, exp_2 = info_p.split('**')
            ret_p = power_ts(float(exp_1), int(exp_2))
            exp = exp.replace(info_p, str(ret_p))  # 将计算结果替换输入的运算中需计算阶乘的位置,完成阶乘的运算并返回值
            # print(exp)
        else:
            return exp  # 如果没有匹配到,则返回原值
# print(power_exp('2**4-3!-3**2+90/3/3'))

def cal(exp):    #计算加减乘除混合运算
    exp = factorial_exp(exp)
    exp = power_exp(exp)
    exp = mul_div(exp)  #调用mul_div函数先计算乘除法
    exp = format_exp(exp)  #调用format_exp处理计算时候的符号
    exp_sum =  add_sub(exp)  #调用add_sub计算加减法
    return exp_sum   # float  #返回计算结果

def c_input():
    str_fh = '+-*/!**.() '
    while True:
        info = input('请输入需要计算的数,输入完毕后按回车结束\n')
        i = 0
        while i <len(info):
            if info[i] not in str_fh and str.isdigit(info[i]) is False:
                print('您输入的数字和运算符号不合法')
                break
            i += 1
        if i == len(info):
            return info
# print(c_main())

def main():
    exp = c_input()
    # print(exp)
    exp = exp.replace(' ','')   #删除字符串中的空格
    # print(exp)
    while True:
        ret = re.search('\([^()]+\)',exp)  #匹配括号
        # print(ret)
        if ret :    #如果匹配到的话
            inner_bracket = ret.group() #用group()将匹配到的括号内容取出来
            # print(inner_bracket)
            res = str(cal(inner_bracket))  #调用cal()计算括号中的内容,将返回的结果转换成字符串
            # print(res)
            exp = exp.replace(inner_bracket,res)  #将匹配到的括号中的内容用计算结果替换
            # print(exp)
            exp = format_exp(exp)  #处理符号
            # print(exp)
        else:break  #直到没有括号跳出循环
    print(cal(exp))
    # return cal(exp)  #将剩下的内容进行计算,然后返回

if __name__ == '__main__':
    main()

部分内容参考:https://www.cnblogs.com/baijinshuo/p/9520320.html

本文地址:https://blog.csdn.net/duyue1/article/details/107135221