python作业---计算器

作业需求: 
1.实现加减乘除及拓号优先级解析
2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致


作业思路
先把输入转成字符串,然后获取到最内层括号内的数据,根据运算优先级,从左到右先计算最内层括号内的运算,先乘除在加减,在循环,直到最内层括号内数据计算完,再从左到右计算次内层的括号,直到括号全部计算完,最后先乘除,最后加减,计算最终结果。


流程图

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:Ahappier
 4 
 5 import re
 6 
 7 
 8 def main():
 9     a=input("请输入需要计算的公式:")
10     b = "".join(a.split())
11     while True:
12         if "("in b:
13             c = re.search(r"\([^()]+\)",b)
14             if c is not None:
15                 e=c.group()
16                 d=cal(e)
17                 b=re.sub(r"\([^()]+\)",str(d),b,1)
18         else:
19             c=cal(b)
20             print(c)
21             break
22 
23 #addition  and subtraction
24 def add_sub(b):
25 
26     if "--" in b:
27         b=b.replace("--","+")
28     add_list = re.findall(r"-?\d+\.?\d*", b)
29     list=[]
30     for i in add_list:
31         list.append(float(i))
32     t=sum(list)
33     return t
34 
35 #multiplication
36 def mul(b):
37     mul_ch=re.search(r"\d+\.?\d*(\*-?\d+\.?\d*)",b)
38     if mul_ch is not None:
39         mul_ch=mul_ch.group()
40         mul_list=re.findall(r"-?\d+\.?\d*",mul_ch)
41         list=[]
42         for i in mul_list:
43             list.append(float(i))
44         multip=list[0]*list[1]
45         b=re.sub(r"\d+\.?\d*(\*-?\d+\.?\d*)",str(multip),b,1)
46         return b
47 
48 #division
49 def div(b):
50     div_ch=re.search(r"\d+\.?\d*(\/-?\d+\.?\d*)",b)
51     if div_ch is not None:
52         div_ch=div_ch.group()
53         div_list=re.findall(r"-?\d+\.?\d*",div_ch)
54         list=[]
55         for i in div_list:
56             list.append(float(i))
57         division=list[0]/list[1]
58         b=re.sub(r"\d+\.?\d*(\/-?\d+\.?\d*)",str(division),b,1)
59         return b
60 
61 #calculation
62 def cal(c):
63     while True:
64         if "*"in c:
65             s=c.split("*")
66             if "/"in s[0]:
67                 c=div(c)
68             else:
69                 c=mul(c)
70         elif "/"in c:
71             c=div(c)
72         elif "+"or "-" in c:
73             c=add_sub(c)
74             return c
75         else:
76             return c
77 
78 main()
View Code

 

 

转载于:https://www.cnblogs.com/garrett0220/articles/6861368.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值