计算器简单篇(项目篇)
一、功能分析
日常生活中我们用的计算器都包括加减乘除幂平方立方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
计算器简单篇(项目篇)相关推荐
- 【微信小程序控制硬件 第12篇-项目篇】微信小程序蓝牙控制硬件应如何开始动手?为您全面解析微信小程序蓝牙API的使用;(附带demo)
[微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...
- python将姓王的都改成老王_老王Python基础+进阶+项目篇(高清无密)
老王Python教程 基础篇 基础篇1-福利课python先入为主上 基础篇2-福利课-python先入为主下篇 基础篇3-虚拟机安装xubuntu开发环境 基础篇4-linux基本命令以及开发环境 ...
- 一位Java开发攻城狮的自我修养之项目篇
攻城狮的自我修养之项目篇 基础知识 Java基础 SpingBoot SpringCloud LeetCode题库 大数据 项目实战 商城系统 权限管理系统 脚手架系统 人事管理系统 论坛系统 博客系 ...
- Redux其实很简单(原理篇)
在上一篇文章中,我们通过一个示例页面,了解到Redux的使用方法以及各个功能模块的作用.如果还不清楚Redux如何使用,可以先看看Redux其实很简单(示例篇),然后再来看本文,理解起来会更加轻松. ...
- 博客系统项目:编码篇-基础篇-架构搭建
博客系统项目:编码篇-基础篇 1 背景 2 环境 2.1 环境说明 2.2 模式说明 2.2.1 MTV模式 2.2.2 MVC 3 前置工作 3.1 环境搭建 4 编码实现 4.1 项目调整 4.1 ...
- Kotlin第5篇项目实战2:开发【Kotlin】版QQ2006聊天工具-关东升-专题视频课程
Kotlin第5篇项目实战2:开发[Kotlin]版QQ2006聊天工具-420人已学习 课程介绍 本视频是智捷课堂推出的一套"Kotlin语言学习立体教程"的视频 ...
- Java从小白到大牛第4篇项目实战视频课程2——Java版QQ-关东升-专题视频课程
Java从小白到大牛第4篇项目实战视频课程2--Java版QQ-1778人已学习 课程介绍 本项目是Java SE技术实现的QQ2006聊天工具,所涉及到的知识点:Java面向对象.L ...
- Java从小白到大牛第4篇项目实战1——PetStore宠物商店-关东升-专题视频课程
Java从小白到大牛第4篇项目实战1--PetStore宠物商店-1764人已学习 课程介绍 PetStore是Sun(现在Oracle)公司为了演示自己的Java EE技术,而编写的 ...
- JAVA伴我行——项目篇(一):开发模型,敏捷开发和瀑布模型的结合
在项目的开发过程中,我们或多或少都会遵循一定的模式.最常见的就是瀑布模型了(也许平时没有注意,但你确实在遵循这个模型). 瀑布模型的典型表现就是遵循以下顺序:需求调研/分析,详细设计/概要设计,编码阶 ...
最新文章
- bert [unused*] 特殊符号
- “80后”财富新贵创业秘诀
- 【正则】匹配html标签里的内容,不含标签
- 转-iOS开发系列--地图与定位
- 启动指定参数_SpringBoot的三种启动方式
- eslint 禁用命令
- java jpa 模糊查询_JPA 以SQL实现分页不模糊查询(参数可能为空)
- ppt 2 html工具,PPTools PPT2HTML
- autoflowchart软件使用步骤_【AutoFlowChart流程图自动生成软件】|C语言流程图生成工具(AutoFlowchart)下载_v1.0 中文版_9号软件下载...
- 缺少链接库报错:ld: symbol(s) not found for architecture x86_64
- Linux常用的查找命令总结
- 企业生存与发展的前提是安全
- 超牛无损图片放大神器PhotoZoom
- ASP.NET 抓取网页源文件
- HTTP:超文本传输协议
- PythonGUI颜色扩散游戏
- OGRE的学习资源简单总结
- STM32单片机-低功耗设置
- 手用计算机怎么弄声音,手把手教你电脑声音太小怎么处理
- 乔布斯传阅读体会【持续更新】