用Python实现复杂的计算器,可以按照“()”、乘除、加减的优先级进行混合运算。主旨是对正则表达式进行学习。

设计思路:

1.在计算式中搜索最后一个“(”,再搜索和它匹配的“)”,截取两个括号间的表达式cul。

2.乘除的优先级高,循环搜索cul内的乘除号,进行计算后进行加减计算,得到结果ans。

3.用ans替换“(cul)”,重新搜索括号,知道将输入的公式简化成没有括号的四则运算。

4.对最后的四则运算计算结果。流程图如下:

设计时的注意事项:

1.在简化计算式过程中,如3*(1-3),简化后为3*-2,在进行乘运算的时候会报错。解决措施为将乘数前的负号移至被乘数前。将算术式更换为-3*2。除法也用相同的方法处理。

2.在出现“--”或“+-”的时候,可以把“--”替换成“+”,把“+-”替换成“-”。

代码分析:

代码的结构是这样的:

执行文件其实没啥说的!

1 importos,sys2 BASE_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))3 print(BASE_dir)4 sys.path.append(BASE_dir)5 from core importmain6 if __name__ == '__main__':7 main.run()

calculato.py就是将文件路径添加到环境变量中

1 importre2 defmul(processor):      #乘运算3 a = re.search(r"(\d+)?[.]?(\d+)[*]", processor).group()[:-1]4 b = re.search(r"[*]\d+[.]?(\d+)?", processor).group()[1:]5 ans = float(a) *float(b)6 ans =str(ans)7 processor_past = re.sub(r"\d+[.]?(\d+)?[*]\d+[.]?(\d+)?", ans, processor, count=1)8 returnprocessor_past9 defdiv(processor):     #除运算10 a = re.search(r"(\d+)?[.]?(\d+)[/]", processor).group()[:-1]11 b = re.search(r"[/]\d+[.]?(\d+)?", processor).group()[1:]12 ans = float(a) /float(b)13 ans =str(ans)14 processor_past = re.sub(r"\d+[.]?(\d+)?[/]\d+[.]?(\d+)?", ans, processor, count=1)15 returnprocessor_past16 defadd(processor):      #加运算17 a=re.search("(\d+)?[.]?(\d+)[+]",processor).group()[:-1]18 b=re.search("[+]\d+[.]?(\d+)?",processor).group()[1:]19 ans = float(a)+float(b)20 ans =str(ans)21 processor_past = re.sub(r"\d+[.]?(\d+)?[+]\d+[.]?(\d+)?",ans,processor,count=1)22 returnprocessor_past23 defsub(processor):      #减运算24 a=re.search("\d+[.]?(\d+)?[-]",processor).group()[:-1]25 b=re.search("[-]\d+[.]?(\d+)?",processor).group()[1:]26 ans = float(a)-float(b)27 ans =str(ans)28 processor_past = re.sub(r"\d+[.]?(\d+)?[-]\d+[.]?(\d+)?",ans,processor,count=1)29 return processor_past

在func.py中定义了运算的方法,由于形参是字符串形式,需将计算结果转换成字符串,然后将结果和算术式替换:如mul("3*2+1)的返回值是“6+1”。

这里还用了字符串的切片方法,删掉第一个值:[1:],删掉最后一个值为[:-1]。

以乘法为例,"*"前必须为数字,被乘数是小数的话还会有小数点和整数位,所以在正则表达式的查询关键字为r“(\d+)?[.]?(\d+)[*]”,所引出字符串后删掉最后的“*”,而“*”后紧跟的是数字,小数点和小数点后的数为非必须字符。用r"[*]\d+[.]?(\d+)?"查找。

在查询关键字时“*"和”+“为转义字符,要在字符串前加”r“

1 importre2 from core importfunc3 def find_brackets(cul): #将“()”内表达式分析出来

4 while re.search("[(].+", cul):5 cul = re.search("[(].+", cul).group()[1:]6 cul = cul[::-1]7 while re.search("[)].+", cul):8 cul = re.search("[)].+", cul).group()[1:]9 cul = cul[::-1]10 return(cul)11

12 def change(search,ans,cul): #将运算结果和()里的表达式更换

13 search = re.sub("[+]", '\+',search)14 search = re.sub("[*]", '\*',search)15 cul = re.sub("[(]%s[)]"%search,ans,cul)#在正则表达式中插入变量

16 returncul17

18 def change_minus(search, ans, before): #和move_minus一起移动乘除号后面的负号

19 search = re.sub("[+]", '\+', search)20 search = re.sub("[*]", '\*', search)21 after =re.sub(search, ans, before)22 returnafter23

24 defmove_minus(cul):25 b =cul26 if re.search(r"(\d+)?[.]?\d+[*][-](\d+)?[.]?\d+?", cul):27 a = re.search(r"(\d+)?[.]?\d+[*][-](\d+)?[.]?\d+?", cul).group()28 c =a29 a = re.sub("[-]", "", a)30 a = '-' +a31 b =change_minus(c, a, cul)32 elif re.search(r"(\d+)?[.]?\d+[/][-](\d+)?[.]?\d+?", cul):33 a = re.search(r"(\d+)?[.]?\d+[/][-](\d+)?[.]?\d+?", cul).group()34 c =a35 a = re.sub("[-]", "", a)36 a = '-' +a37 b =change_minus(c, a, cul)38 returnb39

40

41 def mul_div(str_past): #乘除优先级一致,进行乘除运算

42 ans =str_past43 while re.search("[\*]|[/]",ans):44 res = re.search("[/]|[\*]",ans).group()45 if res == "*":46 ans =func.mul(ans)47 elif res =="/":48 ans =func.div(ans)49 returnans50

51 def add_reduce(str_past): #加减优先级一致,进行加减运算

52 ans =str_past53 ans = re.sub("--","+",ans)54 ans = re.sub(r"[+][-]","-",ans)55 while re.search(r"[+]|[-]",ans):56 if re.match("-",ans):57 break

58 else:59 res = re.search(r"[+]|[-]",ans).group()60 if res == "+":61 ans =func.add(ans)62 elif res =="-":63 ans =func.sub(ans)64 returnans65

66 defcul(str):67 cul =str68 ans =str69 while re.search("[(]",cul):70 cul = re.sub("--", "+", cul)71 cul = re.sub(r"[+][-]", "-", cul)72 cul_1 =find_brackets(cul)73 ans =mul_div(cul_1)74 ans =add_reduce(ans)75 ans =change(cul_1,ans,cul)76 cul =ans77 cul =move_minus(cul)78 ans =move_minus(ans)79 ans =mul_div(ans)80 ans =add_reduce(ans)81 return ans

calcu.py定义了整个计算的流程。

cul()中不断索引括号,将索引出的算术式计算后用结论替代。每简化一轮后检查乘除号后是否有负号的状态。

乘除法的优先级比加减高,可以把乘除的运算放在一起,

while re.search("[\*]|[/]",ans):

用这个方法可以从左到右循环搜索算术式内的乘除运算。

1 importre2 importos,sys3 from core importcalcu,func.log4 defrun():5 print("欢迎使用计算器!!!")6 whileTrue:7 cul = input("请输入计算公式:")8 if cul == "exit":9 print("退出计算器!")10 break

11 elif re.findall("[(]", cul).__len__() != re.findall("[)]", cul).__len__():12 print("括号不匹配!")13 elif re.search("[(]|[)]",cul):14 print("请使用英文符号!")15 elif re.search("[a-z]|[A-Z]",cul):16 print("请输入数字!")17 else:18 ans =calcu.cul(cul)19 print(ans)20 log.logger(cul,ans)

main.py调用了整个算式的计算过程,并对输入的公式进行了一些纠错措施并在每次计算后将计算式和结论存储在日志中。

1 importtime2 deflogger(cul,ans):3 fp = open("logger.txt",'a+',encoding="UTF-8")4 now =time.time()5 fp.write("%s %s=%s\n"%(now,cul,ans))6 fp.close()

log.py就是将每次运算的公式和结论存储在日志中。

存在的问题:日志文件应存储在log路径下,但是现在每次执行完会在bin路径下生成新日志文件并进行存储操作。还在想办法改进中!

python实现高级计算器_Python实现的复杂的计算器的代码相关推荐

  1. python语言设计简单计算器_Python 设计一个简单的计算器-Go语言中文社区

    设计目标 实现加减乘除及拓号优先级解析 用户输入'1 - 2 * ( (6-3 +(-5/5)*(9-2*3/3 + 7/3*7/4*12 +10 * 5/5 )) - (-4*3)/ (12-3*2 ...

  2. python的高级函数_Python的高级函数

    Python的高级函数 1. map函数 map(func, *itertables) 对itertables中的每个元素使用func,当最短的itertable结束时便停止.map可以传入多个ite ...

  3. python代码测试健康指数计算器_python编写的bmi体重指数计算器、出租车费用计算器、个税计算器、猜数字游戏...

    ''' 写四个函数 分别包含bmi体重指数计算器.出租车费用计算器.个税计算器.猜数字游戏 ''' #体重指数计算器 def bmi(): while 1: #声明变量 身高.体重 height=in ...

  4. python抢购火车票源代码_Python动刷新抢12306火车票的代码(附源码)

    摘要:这篇Python开发技术栏目下的"Python动刷新抢12306火车票的代码(附源码)",介绍的技术点是"12306火车票.Python.12306.附源码.火车票 ...

  5. python实现一个简单的加法计算器_Python简易项目 加减计算器的实现

    Python Calculator 1.0 支持功能:add.minus 输入表达式不含括号,允许不加'=' 非常简单的一个小计算器,还缺少很多功能,目的是为了练练手. 日后会对其进行更新. 源码 # ...

  6. python汇率换算程序_Python学习笔记8——汇率计算器

    前两次,我们初步学习了Python的图形界面库Tkinter,这一次,我们来试着做一个汇率换算计算器. 还是老样子,先把上次的代码弄过来: fromtkinterimport* root = Tk() ...

  7. python列表高级操作_python强势来袭-0019-列表循环高级操作

    在前面的课程中,我们已经学习了循环和函数的基本操作,这节内容主要针对循环和函数在项目使用过程中的一些更加有使用价值的操作进行分析和讲解 本节内容: 循环部分 列表构建器 列表动态构建器 循环操作序列对 ...

  8. python计算器_Python实现的复杂的计算器的代码

    用Python实现复杂的计算器,可以按照"()".乘除.加减的优先级进行混合运算.主旨是对正则表达式进行学习. 设计思路: 1.在计算式中搜索最后一个"(",再 ...

  9. python字典高级用法_Python 进阶编程之字典的高级用法

    一. collections 中 defaultdict 的使用 1.1 字典的键映射多个值 将下面的列表转成字典 l = [('a',2),('b',3),('a',1),('b',4),('a', ...

  10. python实现一个简单的加法计算器_Python tkinter实现简单加法计算器代码实例

    tkinter 是 Python 的标准 GUI 库.Python 使用 tkinter 可以快速的创建 GUI 应用程序.由于 tkinter 是内置到 python 的安装包中.只要安装好 Pyt ...

最新文章

  1. cas无法使用_一文彻底搞懂CAS实现原理
  2. 18万,是特斯拉的底线,是马斯克的目标!
  3. Nginx配置指令之listen
  4. Lucene学习笔记(1)
  5. spring social_Spring Social入门–第2部分
  6. python 图片背景前景分离_【绝了】用 Python 把朋友头像变表情包!
  7. python递归和循环的区别_递归与伪递归区别,Python 实现递归与尾递归
  8. Ubuntu 安装 Linux Deepin 截图工具(.deb)
  9. Mysql Literal(文字,既常量)
  10. C#实现把科学计数法(E)转化为正常数字值 (转)
  11. StoreOnce的未来:惠普是否能真正实现一体化去重
  12. 浅析智慧照明,实现建筑节能
  13. hdu 5053 水
  14. 使用rufus制作windows系统安装u盘
  15. 062:vue+openlayers绘制正方形、矩形、六芒星( 代码示例 )
  16. 从技术面试官的角度谈谈简历和面试那些事儿
  17. matlab实用小程序段 —— 串口发送和读取
  18. professional issue复习
  19. Tesseract OCR简介(一)
  20. python-docx中文文档使用小结

热门文章

  1. 磊科路由器信号按键_磊科路由器怎么设置中继? | 192路由网
  2. 谷歌浏览器扩展程序XDM_如何下载和安装扩展程序?
  3. 一次内存泄露的分析及总结
  4. 打印机扫描无法连接到计算机名,网络打印机无法扫描到电脑怎么处理
  5. ICMP协议(网际报文控制协议)详解
  6. 第三方API的简单调用
  7. angular中的cookie读写
  8. [吴恩达机器学习课程笔记] week four强化学习
  9. 转行成为数据分析师的经验分享
  10. pspice仿真:参数扫描