微信小程序> python小项目——实现简易的计算器

python小项目——实现简易的计算器

浏览量:3342 时间: 来源:agbsc84668

开发一个简单的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/evn python  2 #coding:cp936  3 #Author:Siwen  4   5   6 print ("Hello world!")  7   8   9 import re 10  11 def handle_special_occactions(plus_minus,multiply_and_dividend): 12  #有时会出现这种情况 , ['-', '-'] ['1 ', ' 2 * ', '14969036.7968254'],2*...后面这段实际是 2*-14969036.7968254,需要特别处理下,太恶心了''' 13     for index,i in enumerate(multiply_and_dividend): 14         i = i.strip() 15         if i.endswith("*") or i.endswith("/"): 16             multiply_and_dividend[index] = multiply_and_dividend[index] + plus_minus[index] + multiply_and_dividend[index+1] 17             del multiply_and_dividend[index+1] 18             del plus_minus[index] 19     return plus_minus,multiply_and_dividend 20  21 def remove_jia(formula): 22     formula = formula.replace("++","+") 23     formula = formula.replace("+-","-") 24     formula = formula.replace("-+","-") 25     formula = formula.replace("--","+") 26     formula = formula.replace("- -","+") 27     return formula 28  29  30 def compute_mutiply_and_dividend(formula): 31     operators = re.findall("[*/]", formula ) 32     calc_list = re.split("[*/]", formula ) 33     t_res = None 34     for index,item in enumerate(calc_list): 35         item=item.strip() 36         if t_res: #代表不是第一次循环 37             if operators[index-1] == '/': 38                 t_res /=float(item) 39             if operators[index-1] == '*': 40                 t_res *=float(item)        41         else: 42             t_res = float(item) 43     print("乘除结果为:",t_res) 44     return(t_res) 45  46 def compute(formula): 47     #计算不带括号的算式 48     formula=formula.strip('()') 49     formula=remove_jia(formula) 50     plus_minus=re.findall(r'[+-]',formula) 51     multiply_and_dividend = re.split("[+-]", formula)#去除乘除的公式 52     if len(multiply_and_dividend[0].strip()) == 0:#代表这肯定是个负号 53         multiply_and_dividend[1] = plus_minus[0] + multiply_and_dividend[1] 54         del multiply_and_dividend[0] 55         del plus_minus[0] 56  57     plus_minus,multiply_and_dividend=handle_special_occactions(plus_minus,multiply_and_dividend) 58  59     for index,i in enumerate(multiply_and_dividend): 60         if re.search("[*/]" ,i): 61             sub_res = compute_mutiply_and_dividend(i) 62             multiply_and_dividend[index] =sub_res 63  64     print(multiply_and_dividend, plus_minus) 65     total_res = None 66     for index,item in enumerate(multiply_and_dividend): 67          68         if total_res: #代表不是第一次循环 69              70             if plus_minus[index-1] == '+': 71                 total_res +=float(item) 72             if plus_minus[index-1] == '-': 73                 total_res -=float(item)        74  75         else: 76             total_res = float(item) 77     print('算式%s计算结果为:'%formula,total_res) 78     return(total_res) 79      80      81  82 def cale(formula): 83     #主要逻辑,先算括号里的值,再算乘除,再算加减 84     parenthesise_flag=True 85     sub=None 86     sub_res=0 87     while parenthesise_flag: 88         m=re.search('([^()]*)',formula) 89          90         if m: 91             m=m.group() 92             print (m) 93             #print('先算括号里',m) 94             sub_res=compute(m) 95             print (sub_res) 96             formula=formula.replace(m,str(sub_res)) 97         else: 98             print('没有括号了') 99             #formula=formula.replace(m.group(),str(sub_res))100             print(formula)101             sub=compute(formula)102            # print '计算结果为:',sub103             parenthesise_flag=False#算式中的括号都已经被剥除了104 res="1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"105 #res='1+2*(3+4)'106 res=cale(res)107             108         

 

运行结果:

小程序

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎