计算器计算复杂算式

本文介绍了一个使用正则表达式实现的计算器程序,该程序能够处理包含括号、加减乘除运算的数学表达式,并通过递归方式计算结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文编写一个计算机程序,为了熟悉正则表达式,所以不用eval的方式,而是直接匹配运算符号进行运算。

计算式子例如:1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))

此程序核心算法是递归表达式,计算此算式的架构图如下(仅供参考):

下面开始进行编程:

首先先定义所需要进行的操作,比如先算乘除算法再算加减算法,有括号的先计算括号里面的内容。

先定义乘除的算法:

import re
def cheng(c):
if re.search('\d{1,}(\.\d{1,})?[\*\/]\d{1,}(\.\d{1,})?',c)==None:
return c
else:
i=re.search('\d{1,}(\.\d{1,})?[\*\/]\d{1,}(\.\d{1,})?',c).group()
j=re.findall('[^\d.]',i)
k=0
b=i.split(j[0])
if j[0]=='*':
k=float(b[0])*float(b[1])
elif j[0]=='/':
k=float(b[0])/float(b[1])
t=str(k)
d=c.split(i)
c='%s%s%s'%(d[0],t,d[1])
d=cheng(c) #递归调用
return d

 再定义加减的算法:

def jia(c):
if re.search('\d{1,}(\.\d{1,})?[\+\-]{1,}\d{1,}(\.\d{1,})?',c)==None:
return c #没有加减直接返回原字符串
else:
i=re.search('\d{1,}(\.\d{1,})?[\+\-]{1,}\d{1,}(\.\d{1,})?',c).group()
j=re.findall('[^\d.]',i)
k=0
b=i.split(j[0])
if (j[0]=='+'):
k=float(b[0])+float(b[1])
elif (j[0]=='-'):
k=float(b[0])-float(b[1])
t=str(k)
d=c.split(i)
c='%s%s%s'%(d[0],t,d[1])
#print(c)
d=jia(c) #递归调用
return d
如果出现了(20.33)等类似的情况,则需要将括号去掉:
def kuohao(c):
if re.search('\(\-?\d*(\.\d*)?\)',c)==None:
return c
e=re.search('\(\-?\d*(\.\d*)?\)',c).group()
#print(e)
f=re.search('\-?\d{1,}(\.\d{1,})?',e).group()
#print(f)
g=c.split(e)
c='%s%s%s'%(g[0],f,g[1])
#print(c)
m=kuohao(c) #递归调用
return m
有时在去括号之后可能会出现*-或/-这种情况,因为括号之内的数字可能是小数,比如2*(-40/8),所以针对这种情况需要处理一下:
def cheng_jian(b):
if re.search('\d{1,}(\.\d{1,})?[\*\/]\-',b)==None:
return b
c=re.search('\d{1,}(\.\d{1,})?[\*\/]\-',b).group()
e=b.split(c)[0]
g=b.split(c)[1]
d=c.split('-')[0]
h='%s%s'%('-',d)
b='%s%s%s'%(e,h,g)
#print(b)
f=cheng_jian(b)
return f
定义好这些函数后就可以写对真个算式进行计算的函数啦:
def kuohao1(b):
if re.search('\(\-{0,}\d{1,}(\.\d{1,})?([\*\-\+\/]{1,}\d{1,}(\.\d{1,})?){1,}\)',b)==None:
b = b.replace('+-', '-') #+-和-同义
b = b.replace('--', '+') #--等于+
b=cheng_jian(b)
m=cheng(b)
n=jia(m)
return n
c=re.search('\(\-{0,}\d{1,}(\.\d{1,})?([\*\-\+\/]{1,}\d{1,}(\.\d{1,})?){1,}\)',b).group()
zhi=cheng(c) #先算乘除,再算加减
zhi2=jia(zhi)
d=b.split(c)[0]
e=b.split(c)[1]
k='%s%s%s'%(d,zhi2,e)
b=kuohao(k) #去括号
b=b.replace('+-','-')
b=b.replace('--','+')
b=cheng_jian(b)
#print(b)
e=kuohao1(b) #递归调用,直到算出一个结果
e = e.replace('+-', '-')
e = e.replace('--', '+')
e = cheng_jian(e)
m = cheng(e)
n = jia(m)
return n #返回最后的结果
然后用户自定义一个字符串,并将参数值传给kuohao1就完成了:
a=input('请输入算式:')
if re.search('[^\d\(\)\+\-\*\/]',a)!=None: #对输入做一个判断
print('输入表达式有误!')
else:
print(kuohao1(a))

测试:

 

转载于:https://www.cnblogs.com/qianmeng/p/7344563.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值