要求:

实现加减乘除及拓号优先级解析

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

流程图:

readme:

首先,根据计算符号的优先级考虑,带有括号的优先级最高,需要优先计算括号内的式子,计算完括号内的式子之后,破除括号,再进行加减乘除的运算。在四则运算中,加减运算是一个优先级的,乘除运算是一个优先级的,那么我们就可以先行计算乘除,将整个式子中的乘除全部计算完成以后,再次进行加减的计算,最终可以得到运算的结果。

针对于本程序,需要注意的有以下几点:

1、 可进行复杂运算处理,如

a)      1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))

效果如下图所示:

其中该运算最终值是通过函数进行计算得到的值

正确答案的值为通过eval()直接计算得到的值

2、 若需要退出系统,则可以直接输入q退出。

3、请保证值是在输入法为英文状态下输入的,若运算式中存在中文字符,则会出现计算失败的情况。如下图所示:

最后两个字符为中文状态下输入的,不管是运算最终值还是正确答案,都无法进行此类数值的计算。

4、 已知问题

系统暂不支持计算指数函数,若进行计算,则最终返回值和正确答案的值都不正确。

如下图所示:

PS.初入python,难免会有遗漏之处,若有不妥之处,望多指教。

代码:

#-*- coding:utf-8 -*-

importre#此处是用来计算乘法和除法的#乘法和除法优先级相同,先计算谁都可以,因此不会强制先计算谁

defchengchu(chengchu_filter2):

error_tag=""

#if "/" in chengchu_filter2 or "*" in chengchu_filter2:

#首先从传入值中提取第一组带有乘法或者除法的小组式子

try:

rep= re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', chengchu_filter2).group()#\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*

#\d+代表了匹配数字0-9 +号是表示连续数字按照一个来进行处理,代表了一个或者是多个的情况

#\.*代表了小数点,代表了可以出现0次或者多次

#\d*代表了小数点以后的数字可以出现0次或者多次

#[\*\/]代表了 乘号* 除号/出现一个即可

#[\+\-]?代表了+号 -号 出现一个即可,这里的+ - 代表的是正负

#\d+\.*\d*代表了后面又有一个带小数的数值

except:

error_tag="无法计算"

returnerror_tagif "/" in rep:#如果存在/,则开始进行除法运算

n1,n2=rep.split("/")

chengchu_filter3=float(n1)/float(n2)elif "*" in rep:#如果存在*,则开始乘法运算

n1,n2=rep.split("*")

chengchu_filter3=float(n1)*float(n2)#计算完成以后,将此小组式子带回原有的大式子中,然后将此值返回。

chengchu_filter4=chengchu_filter2.replace(rep,str(chengchu_filter3))returnchengchu_filter4defjiajian(chengchu_filter4):#此处的tag是用来证明传入的值仅剩下一个数了,无法再次进行运算。

#此种情况最多的是为了应对带有负号的数值

jiajian_tag=False#式子在经过简化或者运算,可能会出现以下几种情况,为了更好的计算,在此将这几种情况进行了合并。

if "++" inchengchu_filter4:

chengchu_filter_new=chengchu_filter4.replace("++","+")elif "+-" inchengchu_filter4:

chengchu_filter_new=chengchu_filter4.replace("+-","-")elif "-+" inchengchu_filter4:

chengchu_filter_new=chengchu_filter4.replace("-+","-")elif "--" inchengchu_filter4:

chengchu_filter_new=chengchu_filter4.replace("--","+")else:#如果式子中没有分析出来对应的符号,那么就直接将原值带入下一步的计算中

chengchu_filter_new=chengchu_filter4if "+" in chengchu_filter_new or "-" inchengchu_filter_new:try:#此处存在两个try except组,首先说最里面的一组,这一组是为了处理一种情况,就是-3+2这种,如果不进行此类情况的特殊处理,那么

#就会造成这样的情况,系统首先进行3+2的计算,然后再进行- 的计算,这样就造成了这个式子的结果为-5,在此处需要顾及数字前面的符号

#那么使用\A\W来进行单独抓取负数的负号,就可以避免出现这个问题。

#\A是说从字符串的开头进行匹配, \W是说不匹配0-9a-zA-Z等数字,这样的话就只能匹配到+-*/等符号。数字前面也一般都是-号。

#外面的这一组,是为了处理来的数完全不需要进行正则匹配处理,一旦进行匹配,就会出现问题,那这时候就说明了这个数已经成了—3这样情况的了

#那么为了下一步的计算,直接在函数末尾进行赋值处理,同时将代表仅剩一个数的tag点亮,完成运算。

try:

rep2=re.search('\A\W',chengchu_filter_new).group()+re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*',chengchu_filter_new).group()except:

rep2=re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*',chengchu_filter_new).group()if "+" inrep2:

n3,n4=rep2.split("+")

jiajian5=float(n3)+float(n4)elif "-"inrep2:try:

n3,n4=rep2.split("-")

jiajian5=float(n3)-float(n4)except:

jiajian6=chengchu_filter_new

jiajian_tag=Truereturnjiajian6,jiajian_tag#将计算好的式子替换到原有式子的相同位置,完成本次的运算。

jiajian6=chengchu_filter_new.replace(rep2,str(jiajian5))except:

jiajian6=chengchu_filter_new

jiajian_tag=Trueelse:#这种情况就是代表了进来的数值直接不需要进行计算。

jiajian6=chengchu_filter_new

jiajian_tag=Truereturnjiajian6,jiajian_tagdefjisuan(cal):

cal2=cal#'\(([^()]+)\)'

#这个式子仅需解释[^()]这部分即可。^()代表了除了()以外的其他数值,也就是说里面不可以出现括号,其他数值都可以,连起来的

#其他数值也可以加在里面。

cal_filter=re.findall(r'\(([^()]+)\)',cal)#此处是将所有的括号式子都已取出,因此下方需要使用循环来进行处理。

if len(cal_filter)!=0:for i inrange(0,len(cal_filter)):if "/" in cal_filter[i] or "*" in cal_filter[i]:#存在* /进行乘除运算

cal_filter3=chengchu(cal_filter[i])if cal_filter3=="无法计算":#若式子进入乘除运算以后出现错误,会返回'无法计算'的值,直接将此值赋予给最终的值

returncal2

cal2=cal2.replace(cal_filter[i],cal_filter3)#计算完成以后,将计算过的数字赋回原值的相同位置

else:#否则进行+-运算

cal_filter3,jiajian_tag=jiajian(cal_filter[i])if jiajian_tag==True:

cal_filter[i]="("+cal_filter[i]+")"cal2=cal2.replace(cal_filter[i],cal_filter3)elif len(cal_filter)==0:#此种情况是式子无法再进行分割,比如其中一种情况是式子中没有括号了。

if "/" in cal2 or "*" incal2:

cal_filter3=chengchu(cal2)

cal2=cal2.replace(cal2,cal_filter3)else:

cal_filter3,jiajian_tag=jiajian(cal2)if jiajian_tag==True:

cal2="("+cal2+")"cal2=cal2.replace(cal2,cal_filter3)if "+" not in cal2 or "-" not in cal2 or "*" not in cal2 or "/" not in cal2:#此种情况是最终值了,形式为 2017

if "(" in cal2 or ")" in cal2:#这种情况则是(2017)

cal2=cal2.strip("()")returncal2returnjisuan(cal2)print("欢迎进入计算器".center(50,"-"))whileTrue:#cal="1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"

cal=input("请输入计算公式:")if cal =="q":print("欢迎使用,再见!".center(50,"-"))

exit()else:

cal2=jisuan(cal)print("该运算最终值为:%s"%cal2)try:print("正确答案:%s"%eval(cal))except:print("正确答案:无法计算")

python模拟计算器程序代码_python作业:模拟计算器相关推荐

  1. python入门小程序代码_Python入门小程序(二)

    学习了Python编程从入门到实践的第九章,本次的内容是类的创建.对象的实例化以及继承等内容. 1. 创建一个名为Restaurant的类,其方法__init__()设置两个属性:restaurant ...

  2. python抖音表白程序代码_python教程之抖音同款表白神器——Python让你的七夕更完美!-Go语言中文社区...

    又到了一年一度的七夕!大家都准备送什么给自己心仪的对象呢?今天给大家带来python教程之抖音同款表白神器--Python让你的七夕更完美! 先上效果: python表白小程序 代码: from tk ...

  3. 2020年低压电工复审模拟考试及低压电工作业模拟考试

    题库来源:安全生产模拟考试一点通公众号小程序 2020年低压电工复审模拟考试及低压电工作业模拟考试,包含低压电工复审模拟考试答案和解析及低压电工作业模拟考试练习.由安全生产模拟考试一点通公众号结合国家 ...

  4. 2020低压电工复审模拟考试及低压电工作业模拟考试

    题库来源:安全生产模拟考试一点通公众号小程序 2020低压电工复审模拟考试及低压电工作业模拟考试,包含低压电工复审模拟考试答案解析及低压电工作业模拟考试练习.由安全生产模拟考试一点通公众号结合国家低压 ...

  5. 2020高压电工复审模拟考试及高压电工作业模拟考试

    题库来源:安全生产模拟考试一点通公众号小程序 2020高压电工复审模拟考试及高压电工作业模拟考试,包含高压电工复审模拟考试答案解析及高压电工作业模拟考试练习.由安全生产模拟考试一点通公众号结合国家高压 ...

  6. python抢票软件代码_Python抢票程序优化,可以选择车次和座次

    通过程序自动化去刷新并点击抢票,就有了这个 Python 抢票程序.这个程序是 Python 模拟手工去操作浏览器的,所以会因为各种网络或者其他因素导致程序终止.本文主要讲解增加车次选择功能和座次选择 ...

  7. python实用脚本 知乎_Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的文章,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  8. python程序代码_python基础二

    Python基础-注释的引入 注释的分类: <1>单行注释:以#开头,#右边的所有文字当作说明,而不是真正要执行的程序,起辅助说明作用 多行注释用三个单引号 ''' 或者三个双引号 &qu ...

  9. python模拟银行存取款_python 简单模拟银行转账功能

    看python教程第三节课的作业 首先画出流程图,流程图与现实代码有出入,因为刚开始画流程图的时候,有些东西没考虑进去,后来写着写着就慢慢能想起来并实现了. 另有一点经验推荐给新手朋友,如果说碰到一个 ...

  10. python实现电脑程序自动化_python基于pywinauto实现PC客户端自动化

    一.前言 我们柠檬班的小可爱,在学完我们柠檬班自动化的课程之后,就掌握了接口自动化,web自动化,app自动化,这些工作中常用的自动化技能,在工作足以够应对90%以上的自动化需求了.不过近期也有部分小 ...

最新文章

  1. 节能无线信标Ver0:功率测试
  2. cxLookupComboBox使用方法
  3. while(1); 作用
  4. 使用Java的RESTful Web服务
  5. vue项目创建,redis列表字典操作,django用redis的第二种方法
  6. CSS中position的4种定位详解
  7. vfp 界面_VFP之老树新花
  8. Google大调整:搜索与AI分家独立,原SVP引退,Jeff Dean终掌大权
  9. html打开txt文件怎么打开是乱码了,使用记事本打开TXT文件变乱码的解决办法
  10. 科研画图——流程图软件draw.io
  11. 走好职场每一步:关于求职技巧、跳槽迷思、职场困惑
  12. 加权评分模型(weighted scoring model)
  13. amlogic logo amlogic rk tvbox 电视盒 定制化开发(一) 开机logo 定制
  14. excel不显示提示对话框
  15. 【Splay】【ZJOI2006】书架
  16. LED驱动芯片TM1668驱动代码
  17. 汇编基础练习题1:将AX中的数显示输出。
  18. 横向TableVIew的实现
  19. Web全栈~04.css入门
  20. ios自制电话本-swift

热门文章

  1. 英国高端SPA级奢养护肤品牌EVE LOM相继入驻成都IFS、北京连卡佛;FILA斐乐携手梵高博物馆推出全新联名系列 | 知消...
  2. win7配置TomCat环境
  3. Starbound正式版的Mod制作(二)nbsp;…
  4. 无盘服务器chkdsk *: /f)修复命令,让你的电脑运行更快点 使用CHKDSK/F磁盘修复命令...
  5. python中numpy中的shape和get_shape解析
  6. 维基百科--文件系统大全
  7. 微信小程序 关于头像上传,showActionSheet,chooseImage,uploadFile
  8. 利用Cookie进行自动登录
  9. win7打开桌面计算机很慢,鼠标右键刷新桌面很慢怎么办?Win7右键刷新反应特别慢的解决方法...
  10. linux删除arp绑定失败,我用这个命令后总是说“ARP项目删除失败:请求的操作需要提升...