使用python实现计算器功能 - Guo磊

时间:2024-03-12 07:44:33

使用python实现计算器功能

# 实现带括号的复杂加减乘除优先级运算
# 主要运用到了正则表达式、while循环、列表的几种方法等。
# 为实现要求的运算功能该代码共分为两个部分,一个是实现不带括号的加减乘除运算的函数add_sub_mul_div
# 另外一个是一个循环加6行代码来不断去掉最内层括号并完成括号内表达式,该部分将不断调用函数add_sub_mul_div
# 实例 a = \'1-2*(3+4/((5-6*7)+8)*9/10-(11+12)*13*14/15/(16-17)/18/19)*20\'
# 运算结果 a = -146.67385897694427

# 代码正文:

 1 import re
 2 a = \'1-2*(3+4/((5-6.0*7)+8)*9/10-(11+12)*13*14/15/(16-17)/18/19)*20\'
 3 b = re.findall(\'([\d\.]+|-[\d\.]+|\+|/|\*|-|\(|\))\', a)
 4 
 5 
 6 def add_sub_mul_div(exp):
 7     # 完成复杂的不带括号的加减乘除运算
 8     sum = 0
 9     while \'*\' in exp and \'/\' in exp:
10         # 遵循乘除运算从左到右计算
11         i = exp.index(\'*\')
12         j = exp.index(\'/\')
13         if i < j:
14             exp[i] = float(exp[i-1]) * float(exp[i+1])
15             del exp[i+1], exp[i-1]
16         else:
17             exp[j] = float(exp[j-1]) / float(exp[j+1])
18             del exp[j+1], exp[j-1]    
19     while \'*\' in exp:
20         # 乘法运算
21         i = exp.index(\'*\')
22         exp[i] = float(exp[i-1]) * float(exp[i+1])
23         del exp[i+1], exp[i-1]
24     while \'/\' in exp:
25         # 除法运算
26         i = exp.index(\'/\')
27         exp[i] = float(exp[i-1]) / float(exp[i+1])
28         del exp[i+1], exp[i-1]
29     while \'+\' in exp:
30         # 加法运算
31         i = exp.index(\'+\')
32         exp[i] = float(exp[i-1]) + float(exp[i+1])
33         del exp[i+1], exp[i-1]
34     while \'-\' in exp:
35         # 减法运算
36         i = exp.index(\'-\')
37         exp[i] = float(exp[i-1]) - float(exp[i+1])
38         del exp[i+1], exp[i-1]
39     for j in exp:
40         # 将剩余的正负数进行相加求和
41         sum += float(j)
42     return sum
43 
44 
45 while \'(\' in b:
46     y = b.index(\')\')  # 最里面的小括号中右括号的索引位置
47     list_copy = b.copy()[0:y+1]
48     list_copy.reverse()
49     x = y - list_copy.index(\'(\')  # 最里面小括号中左括号的索引位置
50     b[x] = add_sub_mul_div(b[x+1:y])  # 完成最里面小括号内加减乘除运算并赋值给左括号
51     del b[x+1:y+1]  # 删除完成运算后的小括号以及里面的表达式
52 add_sub_mul_div(b)
53 print(add_sub_mul_div(b))