作业 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等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致  2776672.6952380957

流程图:

详细代码:

  1. #!usr/bin/env python
  2. #-*-coding:utf-8-*-
  3. # Author calmyan
  4. import re
  5. #b='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
  6. #b='1 - 2 * ( (60-30 +(-40/5) * (9-2**5//3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)// (16-3*2) )'
  7. #print(b)
  8.  
  9. def list_format(b):#格式化字符串函数
  10. b=re.sub(' ','',b)
  11. b=[i for i in re.split('(\-?\d+\.*\d*)',b) if i]#循环判断,i 不为空,添加到列表 去空字符 -开头加后面的数字
  12. #print(b)
  13. tmp_list=[]#定义一个临时列表
  14. while True:
  15. if len(b)==0:break#如果列表为空就退出
  16. emp=b.pop(0)#取出第一个元素
  17. if (len(tmp_list)==0 and re.search('^\-\d*$',emp)) or (len(tmp_list)>0 and re.search('[\+\-\*\/\(\)]$',tmp_list[-1]) ):#判断开头与中间的负数
  18. tmp_list.append(emp)
  19. continue
  20. sny_nl=[i for i in re.split('([\+\-\*\/\(\)])',emp) if i]#对运算符进行分割
  21.  
  22. for index, i in enumerate(sny_nl):
  23. if i==' ':#去空格判断
  24. sny_nl.pop(index)#删除空格项
  25. tmp_list+=sny_nl
  26.  
  27. return tmp_list#返回列表
  28.  
  29. def Prioty(str_n,i):#比较优先级函数
  30. lev1=['+','-']
  31. lev2=['*','/']
  32. lev3=['(']
  33. lev4=[')']
  34. if str_n in lev1:
  35. if i in lev2 or i in lev3:#如果str_n 为+ - i 2,3级时返回小于
  36. return 1
  37. else:
  38. return 3
  39. elif str_n in lev2:#如果str_n 为*/ i 3级时返回小于
  40. if i in lev3:
  41. return 1
  42. else:
  43. return 3
  44. elif str_n in lev3:#如果str_n 为(i 4级时返回等于
  45. if i in lev4:
  46. return 2
  47. else:
  48. return 1
  49.  
  50. def sny(str):#判断是否为运算符
  51. sny_l=['+','-','*','/','**','//','(',')']
  52. tag=False
  53. if str in sny_l:
  54. return True#是运算符返回真
  55. else:
  56. return tag
  57.  
  58. def opera(num1,operation,num2):#运算函数
  59. res=0
  60. if operation=='+':
  61. res=num1+num2
  62. if operation=='-':
  63. res=num1-num2
  64. if operation=='*':
  65. res=num1*num2
  66. if operation=='/':
  67. res=num1/num2
  68. return res
  69.  
  70. def main(c):#主函数
  71. numbe_list=[]#定义数字堆栈
  72. sny_list=[]#定义运算符堆栈
  73. for i in c:
  74. if sny(i):#不是运算运
  75. while True:
  76. #print(numbe_list)
  77. #print(sny_list)
  78. if len(sny_list)==0:#如果列表为空,即第一个就无条件加入
  79. sny_list.append(i)
  80. break
  81. prty=Prioty(sny_list[-1],i)#
  82. if prty==1:#如果为一级
  83. sny_list.append(i)#运算符继续添加
  84. break
  85. elif prty==2:#如果为二级
  86. sny_list.pop()#运算符要取出最后一个
  87. break
  88. elif prty==3:#如果为三级
  89. operation=sny_list.pop()#运算符==取出最后一个
  90. num2=numbe_list.pop()#取出数字二
  91. num1=numbe_list.pop()#取出数字一
  92. numbe_list.append(opera(num1,operation,num2))#数字列表添加运算的结果
  93. #print(numbe_list,sny_list)
  94. continue
  95. else:
  96. i = float(i)#转为浮点数
  97. numbe_list.append(i)#添加到数字列表
  98. else:
  99. operation=sny_list.pop()#运算符==取出最后一个
  100. num2=numbe_list.pop()#取出数字二
  101. num1=numbe_list.pop()#取出数字一
  102. numbe_list.append(opera(num1,operation,num2))#数字列表添加运算的结果
  103. #print(numbe_list,sny_list)
  104. if len(sny_list):#如果运算符列表不为空再做一个运算
  105. operation=sny_list.pop()#运算符==取出最后一个
  106. num2=numbe_list.pop()#取出数字二
  107. num1=numbe_list.pop()#取出数字一
  108. numbe_list.append(opera(num1,operation,num2))#数字列表添加运算的结果
  109. return numbe_list[0]
  110.  
  111. #程序开始
  112. print("\033[35;1m欢迎使用python简易计算器\033[0m".center(60,'='))
  113. if __name__ =='__main__':
  114. while True:
  115. b=input('请输入你要计算的内容,按\033[31;1mQ/q\033[0m退出:')
  116. if b=='q' or b=='Q':
  117. exit()
  118. #print(c)
  119. try:
  120. c=list_format(b)#运行输入函数格式化字符串,存入列表
  121. number=main(c)
  122. print(number)
  123. except Exception as e:#出错可返回操作
  124. print('输入有误,请重新输入')

python第二十一天---昨天没写完作业的更多相关文章

  1. Word 双栏排版最后多一页空白页删不掉、左栏文字没写完就到右栏了

    1. 问题 问题:Word双栏排版,最后多一页空白页,删不掉.如图: 原因分析:删不掉是因为末尾文字处其实有个下一页分节符,只不过可能看不到. 如何清晰的看到? 视图 > 大纲,就可以看到了.如 ...

  2. XObject.java 对象还没写完,希望电脑不会丢失。坏笑,早点见。

    /*面向对象强调的是对象, 面向过程强调的是功能行为,打开行为,关闭行为,执行行为,把多个行为封装成对象执行更强大的功能就是面向对象,是把多个函数, 多 个行为封装在一起,单一的函数执行对象的功能太困 ...

  3. 【Luogu】【关卡2-7】深度优先搜索(2017年10月)【AK】【题解没写完】

    任务说明:搜索可以穷举各种情况.很多题目都可以用搜索完成.就算不能,搜索也是骗分神器. P1219 八皇后 直接dfs.对角线怎么判断:同一条对角线的横纵坐标的和或者差相同. #include < ...

  4. python Web抓取(一)[没写完]

    需要的模块: python web抓取通过: webbrowser:是python自带的,打开浏览器获取指定页面 requests:从因特网上下载文件和网页 Beautiful Soup:解析HTML ...

  5. QBXT Day2主要是数据结构(没写完先占坑)

    简单数据结构 本节课可能用到的一些复杂度: O(log n). 1/1+1/1/.....1/N+O(n log n) 在我们初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询 ...

  6. D5(太长了md没写完)

    动态规划 三种常见实现方法 对于一个斐波那契数列,我们想要求第n项的值,就需要一项一项的递归来求 来看代码 f[o] = 0; f[1] = 1; for (int i = 2; i <= n; ...

  7. 前端性能测试工具 : dynaTrace Ajax (还没写完)

    今天开始写这个工具, #什么是dynaTrace Ajax? 随着 jQuery.Dojo.YUI 等框架的兴起让构建 Web2.0 应用更加容易,但随之带来的定位等应用问题也越来越难,尤其是与性能相 ...

  8. D3(没写完

    说在博客前 这篇博客有许多使用到 STL 的地方,由于本人实在是记不全,所以我也参考了北大的一些教材,就别说我黈力了 QwQ 数据结构 今天讲的是数据结构啦(也是我这个蒟蒻最喜欢的 一些天天见面的好盆 ...

  9. mock的使用及取消,node模仿本地请求:为了解决前后端分离,用户后台没写完接口的情况下

    借鉴:https://www.jianshu.com/p/dd23a6547114 1.说到这里还有一种是配置node模拟本地请求 (1)node模拟本地请求: 补充一下 [1]首先在根目录下建一个d ...

随机推荐

  1. Java排序方法sort的使用详解(转)

    一.对数组的排序: //对数组排序 public void arraySort(){ int[] arr = {1,4,6,333,8,2}; Arrays.sort(arr);//使用java.ut ...

  2. 把本地项目放进新建的仓库(idea)

    1,获取仓库地址 比如: git@bitbucket.org:360717118/springboot_servlet-filter-listener-file.git,   2,idea 设置:

  3. Mac上安装pipenv时报错

    version:mac os Mojave 10.14.2 执行时报错: pip install pipenv 改为: sudo pip install pipenv --upgrade --igno ...

  4. bigdata-01-应用

    1, 基本概念 在互联网技术发展到现今阶段,大量日常.工作等事务产生的数据都已经信息化,人类产生的数据量相比以前有了爆炸式的增长,以前的传统的数据处理技术已经无法胜任,需求催生技术,一套用来处理海量数 ...

  5. JavaWeb学习 (十七)————JSP属性范围

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  6. .Net Core Cors中间件解析

    一.同源策略和资源跨域共享 1.同源策略 同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同. 1 ...

  7. spring cloud zuul 传递 header

    最近在做一个项目时,发现在网关中调用和在子系统中调用request.getRequestURL()所得到的请求url是不一样的,在网关中得到的是通过域名访问的地址,而在子系统中得到的是网关发起的子系统 ...

  8. OOA/OOD&UML部分

    UML是什么?有哪些常用的图? UML是标准的建模语言:常用图包括:用例图.静态图(包括类图.对象图和包图),行为图.交互图(顺序图.合作图),实现图. 简述一下Singleton模式. Single ...

  9. ABP Zero项目入门踩坑

    1.下载ABP项目模板, 打开网址https://aspnetboilerplate.com/Templates,选择MultiPage Web Application,输入项目名称和验证码,即可点击 ...

  10. 【RabbitMQ】7、RabbitMQ主备复制是异步还是同步?

    转自:https://yq.aliyun.com/articles/73040?spm=5176.100240.searchblog.116.RcXYdl 我们知道RabbitMQ可以配置成Queue ...