#知识点梳理
# 计算器的编程本文主要考虑思路:运算最小单元就是两个数的 = - * / 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
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://blog.csdn.net/duyue1/article/details/107135221
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!