一、功能分析

日常生活中我们用的计算器都包括加减乘除幂平方立方1 - 2 * ( (60-30 +(-9**5-2-5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )这么这么长的一个式子,大家算的时候都知道先算幂,立方,平方,再算乘除,加减

二、知识点

所用到的python的知识点有:

  • 正则表达式re模块

  • 字符串的处理

三、程序实现流程分析

  • 用正则表达式处理字符串,只提取其中的数字和运算符,并转换成列表

  • 编写一个函数,处理没有括号的基本运算的基本表达式

  • 再写一个函数递归处理带有括号的函数,先计算最内部括号中的表达式, 然后将最内部的括号替换为计算后的结果, 在递归外部一层的, 最后返回的就是所需的结果

四、代码部分

上面也说了处理的时候先处理幂,平方,立方

1、处理幂函数

import re,sys
def Power(arg):'''计算幂函数:param arg: 传进来的等式:return: 返回计算完的等式'''while True:relust = re.split(r"(\d+\.?\d*[\*/]{2}-?\d+\.?\d*)", arg, 1)if len(relust) == 3:                                    # 判断切割出来的是不是3个元素before = relust[0]                                  # 第一个元素赋值给beforecontent = relust[1]                                   # 第二个元素赋值给contentafter = relust[2]if "**" in content:                                 #如果等式里面有“**”start,end = content.split("**")                 #用**吧分割开finlly = float(start) ** float(end)              #计算幂等式arg = before + str(finlly) + after               #把结果替换回原等式else:return arg

2、处理乘除

从左往右的时候不能先算乘,必须遇到乘就算乘遇到除就算除,楼主在这踩过坑,所以大家也注意下:

def Multply_didvid(arg):         #定义乘除运算的函数'''计算加减:param arg: 传进来的算法:return: 返回运算结果'''while True:                                                                 #while循环每一次传进来的运算arg = re.sub(r"\+\+","+",arg)arg = re.sub(r"\+\-", "-", arg)arg = re.sub(r"\-\+", "-", arg)arg = re.sub(r"\-\-", "+", arg)relust = re.split(r"(\d+\.?\d*[\*/]-?\d+\.?\d*)",arg,1)              #把从左往右第一次匹配到得乘法# print(relust)if len(relust) ==3:                                                     #判断切割出来的是不是3个元素before = relust[0]                                                  #第一个元素赋值给beforecontent = relust[1]                                                 #第二个元素赋值给contentafter = relust[2]                                                   #第三个元素赋值给afterif "*" in content:                                                 #判断第二个元素里面有没有"*"start,end = content.split("*")                                 #用“*”把分割开赋值给start,endfinlly = float(start) * float(end)                             #运算出乘法arg = before+str(finlly)+after                                #替换原来的运算式else:                                                              #否则就是除法start, end = content.split("/")                                #用/分割开赋值给start,endfinlly = float(start) / float(end)                             #把除法算出来arg = before + str(finlly) + after                             #替换原来的元算是# print(arg)else:return arg                                                         #将运算结果返回去

3、处理加减

加减是最简单的,把每个数字带前面的符号给切割出来,然后给定义一个计数器,依次相加就可得出结果

def Add_sub(arg):                                                             #加减法运算-9-2-5-2+5-3'''计算加减运算:param arg: 传进来的算术:return: 返回运算结果'''result = re.findall(r"[\+\-]?\d+\.?\d*",arg)                            #列出所有的元素start = 0                                                                  #定义空值让他挨个去加for i in result:start += float(i)                                                    #让素有元素相加return start                                                             #返回运算结果

4、式子处理函数

拿到式子,我们肯定是先处理式子,把有括号得拿出来处理

def Calculate(source):'''计算函数:param source: 传进来的等式:return: 返回计算结果'''while True:source = re.sub(r"\s*", "", source)                                        #去掉空格source = source.replace("++","+").replace("+-","-").replace("--","+").replace("-+","-")     #替换符号res = re.split(r"\(([^()]+)\)",source,1)                                   #先取出括号里面的值if len(res) ==3:                                                            #判断分割出来的是不是3个元素before = res[0]                                                          #分别将元素赋值给三个值content = res[1]after = res[2]powe = Power(content)mu_di = Multply_didvid(powe)                                        #执行乘除ad_su = Add_sub(mu_di)                                                 #执行加减res = before + str(ad_su) + after                                      #运算结果替换原来等式source = res                                                            #赋值给其他传进来元素#print("去括号得到得值为:",source)else:powe = Power(source)mu_di = Multply_didvid(powe)                                         #没括号得等式ad_su = Add_sub(mu_di)                                                 #计算加法source = ad_su# print('最后结果为:',ad_su)                                            #打印最后结果return source

到这里为止,代码就可以算是完成了,下面把代码总和起来,可以运行试试看:

import re,sys
def Power(arg):'''计算幂函数:param arg: 传进来的等式:return: 返回计算完的等式'''while True:relust = re.split(r"(\d+\.?\d*[\*/]{2}-?\d+\.?\d*)", arg, 1)if len(relust) == 3:                                    # 判断切割出来的是不是3个元素before = relust[0]                                  # 第一个元素赋值给beforecontent = relust[1]                                   # 第二个元素赋值给contentafter = relust[2]if "**" in content:                                 #如果等式里面有“**”start,end = content.split("**")                 #用**吧分割开finlly = float(start) ** float(end)              #计算幂等式arg = before + str(finlly) + after               #把结果替换回原等式else:return argdef Multply_didvid(arg):         #定义乘除运算的函数'''计算加减:param arg: 传进来的算法:return: 返回运算结果'''while True:                                                                 #while循环每一次传进来的运算arg = re.sub(r"\+\+","+",arg)arg = re.sub(r"\+\-", "-", arg)arg = re.sub(r"\-\+", "-", arg)arg = re.sub(r"\-\-", "+", arg)relust = re.split(r"(\d+\.?\d*[\*/]-?\d+\.?\d*)",arg,1)              #把从左往右第一次匹配到得乘法# print(relust)if len(relust) ==3:                                                     #判断切割出来的是不是3个元素before = relust[0]                                                  #第一个元素赋值给beforecontent = relust[1]                                                 #第二个元素赋值给contentafter = relust[2]                                                   #第三个元素赋值给afterif "*" in content:                                                 #判断第二个元素里面有没有"*"start,end = content.split("*")                                 #用“*”把分割开赋值给start,endfinlly = float(start) * float(end)                             #运算出乘法arg = before+str(finlly)+after                                #替换原来的运算式else:                                                              #否则就是除法start, end = content.split("/")                                #用/分割开赋值给start,endfinlly = float(start) / float(end)                             #把除法算出来arg = before + str(finlly) + after                             #替换原来的元算是# print(arg)else:return arg                                                         #将运算结果返回去def Add_sub(arg):                                                             #加减法运算-9-2-5-2+5-3'''计算加减运算:param arg: 传进来的算术:return: 返回运算结果'''result = re.findall(r"[\+\-]?\d+\.?\d*",arg)                            #列出所有的元素start = 0                                                                  #定义空值让他挨个去加for i in result:start += float(i)                                                    #让素有元素相加return start                                                             #返回运算结果def Calculate(source):'''计算函数:param source: 传进来的等式:return: 返回计算结果'''while True:source = re.sub(r"\s*", "", source)                                        #去掉空格source = source.replace("++","+").replace("+-","-").replace("--","+").replace("-+","-")     #替换符号res = re.split(r"\(([^()]+)\)",source,1)                                   #先取出括号里面的值if len(res) ==3:                                                            #判断分割出来的是不是3个元素before = res[0]                                                          #分别将元素赋值给三个值content = res[1]after = res[2]powe = Power(content)mu_di = Multply_didvid(powe)                                        #执行乘除ad_su = Add_sub(mu_di)                                                 #执行加减res = before + str(ad_su) + after                                      #运算结果替换原来等式source = res                                                            #赋值给其他传进来元素#print("去括号得到得值为:",source)else:powe = Power(source)mu_di = Multply_didvid(powe)                                         #没括号得等式ad_su = Add_sub(mu_di)                                                 #计算加法source = ad_su# print('最后结果为:',ad_su)                                            #打印最后结果return sourceprint('\n****************************************************************')
print('                \033[33m 欢迎使用计算器(^-_-^) \033[0m')
print('\n****************************************************************')
print("计算等式直接复制即可!:","1 - 2 *  ( (60-30 +(-9**5-2-5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")
while True:inp = input("请输入计算等式(q\退出):")if inp =="q":sys.exit("欢迎下次光临!")elif  not inp.strip():inp = inp.strip()continueelse:fin = Calculate(inp)print("计算结果为:%s" % fin)print("eval结果为:%s" % eval(inp))

计算器

五:总结

死是不是发现还有点复杂,我相信大家还能写出更简单的,当然python为了追求简单,一行代码也可以搞定,eval()函数直接搞定,但是自己写下好提高自己的能力嘛,嘿嘿

转载于:https://www.cnblogs.com/aylin/p/5517793.html

计算器简单篇(项目篇)相关推荐

  1. 【微信小程序控制硬件 第12篇-项目篇】微信小程序蓝牙控制硬件应如何开始动手?为您全面解析微信小程序蓝牙API的使用;(附带demo)

    [微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...

  2. python将姓王的都改成老王_老王Python基础+进阶+项目篇(高清无密)

    老王Python教程 基础篇 基础篇1-福利课python先入为主上 基础篇2-福利课-python先入为主下篇 基础篇3-虚拟机安装xubuntu开发环境 基础篇4-linux基本命令以及开发环境 ...

  3. 一位Java开发攻城狮的自我修养之项目篇

    攻城狮的自我修养之项目篇 基础知识 Java基础 SpingBoot SpringCloud LeetCode题库 大数据 项目实战 商城系统 权限管理系统 脚手架系统 人事管理系统 论坛系统 博客系 ...

  4. Redux其实很简单(原理篇)

    在上一篇文章中,我们通过一个示例页面,了解到Redux的使用方法以及各个功能模块的作用.如果还不清楚Redux如何使用,可以先看看Redux其实很简单(示例篇),然后再来看本文,理解起来会更加轻松. ...

  5. 博客系统项目:编码篇-基础篇-架构搭建

    博客系统项目:编码篇-基础篇 1 背景 2 环境 2.1 环境说明 2.2 模式说明 2.2.1 MTV模式 2.2.2 MVC 3 前置工作 3.1 环境搭建 4 编码实现 4.1 项目调整 4.1 ...

  6. Kotlin第5篇项目实战2:开发【Kotlin】版QQ2006聊天工具-关东升-专题视频课程

    Kotlin第5篇项目实战2:开发[Kotlin]版QQ2006聊天工具-420人已学习 课程介绍         本视频是智捷课堂推出的一套"Kotlin语言学习立体教程"的视频 ...

  7. Java从小白到大牛第4篇项目实战视频课程2——Java版QQ-关东升-专题视频课程

    Java从小白到大牛第4篇项目实战视频课程2--Java版QQ-1778人已学习 课程介绍         本项目是Java SE技术实现的QQ2006聊天工具,所涉及到的知识点:Java面向对象.L ...

  8. Java从小白到大牛第4篇项目实战1——PetStore宠物商店-关东升-专题视频课程

    Java从小白到大牛第4篇项目实战1--PetStore宠物商店-1764人已学习 课程介绍         PetStore是Sun(现在Oracle)公司为了演示自己的Java EE技术,而编写的 ...

  9. JAVA伴我行——项目篇(一):开发模型,敏捷开发和瀑布模型的结合

    在项目的开发过程中,我们或多或少都会遵循一定的模式.最常见的就是瀑布模型了(也许平时没有注意,但你确实在遵循这个模型). 瀑布模型的典型表现就是遵循以下顺序:需求调研/分析,详细设计/概要设计,编码阶 ...

最新文章

  1. bert [unused*] 特殊符号
  2. “80后”财富新贵创业秘诀
  3. 【正则】匹配html标签里的内容,不含标签
  4. 转-iOS开发系列--地图与定位
  5. 启动指定参数_SpringBoot的三种启动方式
  6. eslint 禁用命令
  7. java jpa 模糊查询_JPA 以SQL实现分页不模糊查询(参数可能为空)
  8. ppt 2 html工具,PPTools PPT2HTML
  9. autoflowchart软件使用步骤_【AutoFlowChart流程图自动生成软件】|C语言流程图生成工具(AutoFlowchart)下载_v1.0 中文版_9号软件下载...
  10. 缺少链接库报错:ld: symbol(s) not found for architecture x86_64
  11. Linux常用的查找命令总结
  12. 企业生存与发展的前提是安全
  13. 超牛无损图片放大神器PhotoZoom
  14. ASP.NET 抓取网页源文件
  15. HTTP:超文本传输协议
  16. PythonGUI颜色扩散游戏
  17. OGRE的学习资源简单总结
  18. STM32单片机-低功耗设置
  19. 手用计算机怎么弄声音,手把手教你电脑声音太小怎么处理
  20. 乔布斯传阅读体会【持续更新】

热门文章

  1. 为什么C++可以重载函数
  2. 科技有毒 | 今天,请互联网人狠狠爱自己!
  3. 原码、反码、补码之间的快速转换和简单运算
  4. 琢石成器之自动化去广告神器(Green Creator)
  5. 测试、发布、小组合作及经验启示
  6. 前端-html-01
  7. 185-186 抽象类+接口案例/运动员和教练
  8. Py之utils:Python库之utils的简介、安装、使用方法之详细攻略
  9. 下一个行业风口:NFT 数字藏品,是机遇还是泡沫?
  10. GPG在PHP中的使用