Python 制作通用计算器小软件(附完整学习代码)

简单计算器开发需求:

实现简单的加减乘除运算,以及带括号的优先级解析,并能输出正确的计算结果。

分析:

1.首先需要检测用户的输入是否合法,如括号匹配问题

2.由于输入的是字符串,所以需要进行字符串解析,解析出” + – * / ( ) “等符号

3.优先级解析,先计算括号里的内容,在计算乘除运算,最后算加减

Python 制作通用计算器小软件(附完整学习代码)
#coding:utf-8
import re
from functools import reduce
def sub_calc(formula):#计算加减乘除表达式的值
    flag=True
    while flag:
        m=re.search('\d+\.?\d*[*/]-?\d+\.?\d*',formula)#5.12*-123.12 -5.12/-123.12
        #print('匹配到为\n',m.group())
        if m:
            sub_mul_div=m.group()
            res=calc_mul_div(sub_mul_div)
            formula=formula.replace(m.group(),res)#将乘除表达式的结果替换,循环判断是否还有乘除表达式
            print('结果是\n',formula)
        else:
            print('乘除计算完毕')
            flag=False
    print('计算完乘除之后的表达式\n',formula)
    result=calc_add_stract(formula)
    return  result
def calc_add_stract(formula):#计算所有的加减
    print('计算加减的表达式\n',formula)
    formula=format_formula(formula)
    print('处理完正负号的减号表达式为\n',formula)
 
    #对一个加减表达式,-变成+-,为了进行split成列表用于reduce计算
    formula=formula.replace('-','+-')
    formula_list=formula.split('+')
    print('被分割之后的列表是\n',formula_list)#第一个数为负数,则列表第一个字段为空
    if formula_list[0]=='':
        formula_list=formula_list[1:]
    result=0
    '''
    for i in formula_list:
            result += float(i)
    '''
    result = reduce(lambda x, y: float(x) + float(y), formula_list)
    return str(result)
 
 
 
def format_formula(formula):
    formula=  formula.replace('--','+')
    formula = formula.replace('-+', '-')
    formula = formula.replace('++', '+')
    formula = formula.replace('+-', '-')
    return formula
 
 
def calc_mul_div(formula):#计算单个乘除的表达式
    print('计算乘除的表达式\n', formula)
    first_list=re.split('[*/]',formula)
    print('单个乘除表达式的列表\n',first_list)
    res=0
    if '*' in formula:
        res=float(first_list[0])*float(first_list[1])
    elif '/' in formula:
        res=float(first_list[0])/float(first_list[1])
    return str(res)
def calc(formula):
    flag=True
    while flag:
        tmp=re.search('\([^()]*\)',formula)
        if tmp:
            print('匹配到的为\n',tmp.group())
            sub_formula=tmp.group().strip('()')
            res=sub_calc(sub_formula)#先计算括号内的表达式
            formula=formula.replace(tmp.group(),res)#将表达式计算出来的结果替换原括号,再一次循环判断是否还有括号
            print('计算完的串为\n',formula)
        else:
            flag=False
    print('最后一此的串为\n',formula)
    result=sub_calc(formula)
    return result
 
 
if __name__=='__main__':
    formula='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    formula=formula.replace(' ','')
    print('去除完空格之后的串为\n',formula)
    ret=calc(formula)
    print('最终的计算结果为\n',ret)
    #2776672.6952380957

6.总结
这个代码不怎么复杂,但是缺乏相应的了解,对于某些存在的情况没有及时考虑到。自己的逻辑不够清晰,对于一个大的问题没

有清晰完整的解决思路,当然了常用的套路也不是很熟悉(使用的少),例如通过一个flag来控制循环的跳出。

虽然通过eval()可以将一个字符串转换成一个算术表达式,但是通过这种解决方法能够提高面向过程的编程能力。

加油吧,骚年。

0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论