作业:

使用正则表达式和递归实现计算器功能。

实现:

1、实现带括号的计算

2、实现指数、加减乘除求余等功能

一、实例说明:

本实例自己写了个版本,但依旧存在一点bug,例:-2-2等计算问题,故最后在武SIR的代码基础上加了指数、求余等功能。

该计算器思路:
1、递归寻找表达式中只含有 数字和运算符的表达式,并计算结果
2、由于整数计算会忽略小数,所有的数字都认为是浮点型操作,以此来保留小数
使用技术:
1、正则表达式
2、递归

二、流程图:

三、代码:

#!/usr/bin/python27
#_*_ coding=utf-8 _*_'''
''''''
该计算器思路:1、递归寻找表达式中只含有 数字和运算符的表达式,并计算结果2、由于整数计算会忽略小数,所有的数字都认为是浮点型操作,以此来保留小数
使用技术:1、正则表达式2、递归执行流程如下:
******************** 请计算表达式: 1 - 2 * ( (60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) ********************
before: ['1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']
-40.0/5=-8.0
after: ['1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']
========== 上一次计算结束 ==========
before: ['1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']
9-2*5/3+7/3*99/4*2998+10*568/14=173545.880953
after: ['1-2*((60-30+-8.0*173545.880953)-(-4*3)/(16-3*2))']
========== 上一次计算结束 ==========
before: ['1-2*((60-30+-8.0*173545.880953)-(-4*3)/(16-3*2))']
60-30+-8.0*173545.880953=-1388337.04762
after: ['1-2*(-1388337.04762-(-4*3)/(16-3*2))']
========== 上一次计算结束 ==========
before: ['1-2*(-1388337.04762-(-4*3)/(16-3*2))']
-4*3=-12.0
after: ['1-2*(-1388337.04762--12.0/(16-3*2))']
========== 上一次计算结束 ==========
before: ['1-2*(-1388337.04762--12.0/(16-3*2))']
16-3*2=10.0
after: ['1-2*(-1388337.04762--12.0/10.0)']
========== 上一次计算结束 ==========
before: ['1-2*(-1388337.04762--12.0/10.0)']
-1388337.04762--12.0/10.0=-1388335.84762
after: ['1-2*-1388335.84762']
========== 上一次计算结束 ==========
我的计算结果: 2776672.69524
'''import re,os,sysdef compute_exponent(arg):""" 操作指数:param expression:表达式:return:计算结果"""val = arg[0]pattern = re.compile(r'\d+\.?\d*[\*]{2}[\+\-]?\d+\.?\d*')mch = pattern.search(val)if not mch:returncontent = pattern.search(val).group()if len(content.split('**'))>1:n1, n2 = content.split('**')value = float(n1) ** float(n2)else:passbefore, after = pattern.split(val, 1)new_str = "%s%s%s" % (before,value,after)arg[0] = new_strcompute_exponent(arg)def compute_mul_div(arg):""" 操作乘除:param expression:表达式:return:计算结果"""val = arg[0]pattern = re.compile(r'\d+\.?\d*[\*\/\%\/\/]+[\+\-]?\d+\.*\d*')mch = pattern.search(val)if not mch:returncontent = pattern.search(val).group()if len(content.split('*'))>1:n1, n2 = content.split('*')value = float(n1) * float(n2)elif len(content.split('//'))>1:n1, n2 = content.split('//')value = float(n1) // float(n2)elif len(content.split('%'))>1:n1, n2 = content.split('%')value = float(n1) % float(n2)elif len(content.split('/'))>1:n1, n2 = content.split('/')value = float(n1) / float(n2)else:passbefore, after = pattern.split(val, 1)new_str = "%s%s%s" % (before,value,after)arg[0] = new_strcompute_mul_div(arg)def compute_add_sub(arg):""" 操作加减:param expression:表达式:return:计算结果"""while True:if arg[0].__contains__('+-') or arg[0].__contains__("++") or arg[0].__contains__('-+') or arg[0].__contains__("--"):arg[0] = arg[0].replace('+-','-')arg[0] = arg[0].replace('++','+')arg[0] = arg[0].replace('-+','-')arg[0] = arg[0].replace('--','+')else:breakif arg[0].startswith('-'):arg[1] += 1arg[0] = arg[0].replace('-','&')arg[0] = arg[0].replace('+','-')arg[0] = arg[0].replace('&','+')arg[0] = arg[0][1:]val = arg[0]pattern = re.compile(r'\d+\.?\d*[\+\-]{1}\d+\.?\d*')mch = pattern.search(val)if not mch:returncontent = pattern.search(val).group()if len(content.split('+'))>1:n1, n2 = content.split('+')value = float(n1) + float(n2)else:n1, n2 = content.split('-')value = float(n1) - float(n2)before, after = pattern.split(val, 1)new_str = "%s%s%s" % (before,value,after)arg[0] = new_strcompute_add_sub(arg)def compute(expression):""" 操作加减乘除:param expression:表达式:return:计算结果"""inp = [expression,0]# 处理表达式中的指数compute_exponent(inp)# 处理表达式中的乘除求余等compute_mul_div(inp)# 处理表达式的加减compute_add_sub(inp)if divmod(inp[1],2)[1] == 1:result = float(inp[0])result = result * -1else:result = float(inp[0])return resultdef exec_bracket(expression):""" 递归处理括号,并计算:param expression: 表达式:return:最终计算结果"""pattern = re.compile(r'\(([\+\-\*\/\%\/\/\*\*]*\d+\.*\d*){2,}\)')# 如果表达式中已经没有括号,则直接调用负责计算的函数,将表达式结果返回,如:2*1-82+444#if not re.search('\(([\+\-\*\/]*\d+\.*\d*){2,}\)', expression):if not pattern.search(expression):final = compute(expression)return final# 获取 第一个 只含有 数字/小数 和 操作符 的括号# 如:#    ['1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']#    找出:(-40.0/5)content = pattern.search(expression).group()# 分割表达式,即:# 将['1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']# 分割更三部分:['1-2*((60-30+(    (-40.0/5)      *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']before, nothing, after = pattern.split(expression, 1)print('before:',expression)content = content[1:len(content)-1]# 计算,提取的表示 (-40.0/5),并活的结果,即:-40.0/5=-8.0ret = compute(content)print('%s=%s' %( content, ret))# 将执行结果拼接,['1-2*((60-30+(      -8.0     *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']expression = "%s%s%s" %(before, ret, after)print('after:',expression)print("="*10,'previous result is',"="*10)# 循环继续下次括号处理操作,本次携带者的是已被处理后的表达式,即:# ['1-2*((60-30+   -8.0  *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']# 如此周而复始的操作,直到表达式中不再含有括号return exec_bracket(expression)# 使用 __name__ 的目的:
#   只有执行 python index.py 时,以下代码才执行
#   如果其他人导入该模块,以下代码不执行
if __name__ == "__main__":flag = Trueos.system('clear')                                                     ###清屏###print('\n================================================================')print('\033[33m 欢迎使用计算器 :\033[0m')print('\n================================================================')while flag:calculate_input = raw_input('\033[32m请输入计算的表达式 | (退出:q)\033[0m')calculate_input = re.sub('\s*','',calculate_input)if len(calculate_input) == 0:continueelif calculate_input == 'q':sys.exit('退出程序')elif re.search('[^0-9\.\-\+\*\/\%\/\/\*\*\(\)]',calculate_input):print('\033[31m 输入错误,请重新输入!!!\033[0m')else:result = exec_bracket(calculate_input)print('the expression result is %s' % result)

四、针对python2.7和python3.4无太大差别,故只需要一个版本即可。

做人一定要靠自己

转载于:https://www.cnblogs.com/cfj271636063/p/5822976.html

python 编程之计算器相关推荐

  1. python编程简易计算器_Python编程练习049:简单计算器实现

    以下代码用于实现简单计算器实现,包括两个数基本的加减乘除运算: 定义函数 def add(x, y): """相加""" return x ...

  2. python编程计算_python编程 小小计算器

    我是刚学的python编程 今天想编一个计算器,结果提示错误 各位老鸟帮帮忙 # Filename : jisuanqi.py a = int(raw_input('a')) fu = raw_inp ...

  3. python写科学计算器代码_Python编程使用tkinter模块实现计算器软件完整代码示例...

    Python编程使用tkinter模块实现计算器软件完整代码示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 Python编程使用tkinter模块实现计算器软件完整代码示例 ...

  4. python实现一个整数加法计算器_如何使用python编程写一个加法计算器-Python教程...

    一.关上idle.点击file,而后点击new file.这是创立一个新的文件. 新建一个文件之后,咱们输出第一行代码,应用print函数,正在屏幕上打印一句话,此中字符串要应用双引号,输出法要应用英 ...

  5. python编程计算器_Python设计实现的计算器功能完整实例

    本文实例讲述了Python设计实现的计算器功能.分享给大家供大家参考,具体如下: 通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/ ...

  6. python编程计算器_Python3-用Python编写计算器的3种方法

    用python实现简单的计算器功能,有很多思路,这里介绍三种方法,并分析各自的优缺点.下图是一个真是的计算器,由StellrWeb摄于Unsplash: 众所周知,根据Tao of Python的规定 ...

  7. python手机版怎么用-如何优雅的在手机上进行Python编程

    原标题:如何优雅的在手机上进行Python编程 很多人都在学习Python,但是我们往往在清香于忙碌工作的同时的时候,很少有空余时间去学习py.今天就给大家推荐一个运行在android手机上的开发软件 ...

  8. python 编程一日一练-python每日一练

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 过滤掉列表中的负数 筛选出字典{lilei: 79,jim: 88,lu ...

  9. python手机版怎么用-在手机上也可以优雅地进行python编程,你知道吗?

    我们经常在电脑上进行python编程,但好像不是那么方便,需要随时都带着电脑,现在若是可以在手机上优雅地进行python编程,你会不会感到很兴奋? 大家都知道有安卓上有一个QPython,可以写Pyt ...

最新文章

  1. poj 1679 次小生成树
  2. 232.用栈实现队列
  3. 低通采样和带通采样定理
  4. 网页的手机版本是否值得去做?,互联网营销
  5. Java里的堆(heap)栈(stack)和方法区(method)
  6. 【机器视觉】 HDevelop语言基础(六)-错误处理
  7. 老司机们都是怎么学习STM32的?
  8. linux 在家工作_我如何调整在家工作的习惯
  9. linux安装gtk命令,Ubuntu 下安装 GTK2.0
  10. Android中AppWidget的分析与应用:AppWidgetProvider .
  11. js中substr与substring的区别
  12. docxtemplater 图片模块_使用docxtemplater来处理word模板
  13. 一款很好看的个人主页简单源码
  14. ps怎么对比原图快捷键_Photoshop最常用的10个快捷键,让你修图事半功倍!
  15. iphone11返回上一级手势怎么设置_iPhone11怎么返回手势操作
  16. Jmeter javax.swing.text.BadLocationException: Position not represented by view 解决方法
  17. 我来告诉大家一些无耻的电脑知识
  18. 360签名工具 linux,360apk签名工具下载
  19. DingTalk「开发者说」如何开发钉钉高价值应用三部曲
  20. 程序员实习过程中应该掌握的问问题技巧

热门文章

  1. 【机器视觉】Qt集成Halcon开发环境详解(二)
  2. 112家it公司薪水
  3. C++ STL next_permutation() prev_permutation(a,a+n)用法。
  4. 每天一道LeetCode-----最长无重复子串
  5. 计算机屏幕显示电缆借口,电脑关机后显示器显示请检查电缆接口怎么办成功解决...
  6. CPU流水线的探秘之旅
  7. 正则表达式matches_正则表达式在VBA中间是如何应用?正则表达式的实现方式?...
  8. attribute关键字
  9. c++名字查找和作用域的一个例子的感想
  10. mysql的内连接查询