作业 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

流程图:

详细代码:

 #!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import re
#b='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
#b='1 - 2 * ( (60-30 +(-40/5) * (9-2**5//3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)// (16-3*2) )'
#print(b) def list_format(b):#格式化字符串函数
b=re.sub(' ','',b)
b=[i for i in re.split('(\-?\d+\.*\d*)',b) if i]#循环判断,i 不为空,添加到列表 去空字符 -开头加后面的数字
#print(b)
tmp_list=[]#定义一个临时列表
while True:
if len(b)==0:break#如果列表为空就退出
emp=b.pop(0)#取出第一个元素
if (len(tmp_list)==0 and re.search('^\-\d*$',emp)) or (len(tmp_list)>0 and re.search('[\+\-\*\/\(\)]$',tmp_list[-1]) ):#判断开头与中间的负数
tmp_list.append(emp)
continue
sny_nl=[i for i in re.split('([\+\-\*\/\(\)])',emp) if i]#对运算符进行分割 for index, i in enumerate(sny_nl):
if i==' ':#去空格判断
sny_nl.pop(index)#删除空格项
tmp_list+=sny_nl return tmp_list#返回列表 def Prioty(str_n,i):#比较优先级函数
lev1=['+','-']
lev2=['*','/']
lev3=['(']
lev4=[')']
if str_n in lev1:
if i in lev2 or i in lev3:#如果str_n 为+ - i 在2,3级时返回小于
return 1
else:
return 3
elif str_n in lev2:#如果str_n 为*/ i 在3级时返回小于
if i in lev3:
return 1
else:
return 3
elif str_n in lev3:#如果str_n 为(i 在4级时返回等于
if i in lev4:
return 2
else:
return 1 def sny(str):#判断是否为运算符
sny_l=['+','-','*','/','**','//','(',')']
tag=False
if str in sny_l:
return True#是运算符返回真
else:
return tag def opera(num1,operation,num2):#运算函数
res=0
if operation=='+':
res=num1+num2
if operation=='-':
res=num1-num2
if operation=='*':
res=num1*num2
if operation=='/':
res=num1/num2
return res def main(c):#主函数
numbe_list=[]#定义数字堆栈
sny_list=[]#定义运算符堆栈
for i in c:
if sny(i):#不是运算运
while True:
#print(numbe_list)
#print(sny_list)
if len(sny_list)==0:#如果列表为空,即第一个就无条件加入
sny_list.append(i)
break
prty=Prioty(sny_list[-1],i)#
if prty==1:#如果为一级
sny_list.append(i)#运算符继续添加
break
elif prty==2:#如果为二级
sny_list.pop()#运算符要取出最后一个
break
elif prty==3:#如果为三级
operation=sny_list.pop()#运算符==取出最后一个
num2=numbe_list.pop()#取出数字二
num1=numbe_list.pop()#取出数字一
numbe_list.append(opera(num1,operation,num2))#数字列表添加运算的结果
#print(numbe_list,sny_list)
continue
else:
i = float(i)#转为浮点数
numbe_list.append(i)#添加到数字列表
else:
operation=sny_list.pop()#运算符==取出最后一个
num2=numbe_list.pop()#取出数字二
num1=numbe_list.pop()#取出数字一
numbe_list.append(opera(num1,operation,num2))#数字列表添加运算的结果
#print(numbe_list,sny_list)
if len(sny_list):#如果运算符列表不为空再做一个运算
operation=sny_list.pop()#运算符==取出最后一个
num2=numbe_list.pop()#取出数字二
num1=numbe_list.pop()#取出数字一
numbe_list.append(opera(num1,operation,num2))#数字列表添加运算的结果
return numbe_list[0] #程序开始
print("\033[35;1m欢迎使用python简易计算器\033[0m".center(60,'='))
if __name__ =='__main__':
while True:
b=input('请输入你要计算的内容,按\033[31;1mQ/q\033[0m退出:')
if b=='q' or b=='Q':
exit()
#print(c)
try:
c=list_format(b)#运行输入函数格式化字符串,存入列表
number=main(c)
print(number)
except Exception as e:#出错可返回操作
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. GNum试用体验

    只需在GNum上注册一个用户名,填上自己的电话号码,它就会自动生成一个URL,你的朋友(可以不注册GNum)在浏览器上进入这个 URL,就可以给你的手机打电话,目前可以免费通话200分钟,而且如果你邀 ...

  2. 使用Project进行项目管理

    下面开始介绍Project的使用. 1.  从下列地址获取Project 2010的副本. 版权问题,已删除地址. 2.安装 2.1 版权页 2.2 自定义安装页 2.3 安装完毕. 3.使用该软件进 ...

  3. 《java并发编程实战》

    目录 对本书的赞誉 译者序 前 言 第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更 ...

  4. ACM学习<一>

    c++指针|指针入门 什么是指针? 其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据.这是一个非常重要的概念,有很多 ...

  5. BBWebImage 设计思路

    BBWebImage 设计思路 BBWebImage 是高性能 Swift 图片组件,用于图片下载.缓存.编解码.编辑与展示. GitHub 地址: https://github.com/Silenc ...

  6. vuex学习及使用

    什么是vuex? 在SPA单页面组件的开发中vuex称为状态管理:简单的理解就是你在state中定义了一个数据之后,你可以在所在项目中的任何一个组件里进行获取.进行修改,并且你的修改可以得到全局的响应 ...

  7. 5步搭建GO环境

    Easy Go Programming Setup for Windows Dec 23, 2014 I’ve had to do this more than once recently, so I ...

  8. Linux NFS存储服务部署

    什么是NFS 中文意思是网络文件系统,主要功能是通过网络(一般是局域网)让不同主机之间可以共享文件或目录 NFS属于本地文件存储服务 缺点1: 1 2 3 4 5 6 7 windows上无法使用   ...

  9. 新建 .NET Core 控制台项目

    1. 安装 .NET Core SDK 1.0 参考微软官方网站 https://www.microsoft.com/net/download/windows 2. 打开命令提示符:输入以下代码验证S ...

  10. SQL SERVER 一个SQL语句的执行顺序

    一个SQL 语句的执行顺序 1.From (告诉程序 来自哪张表  如果是表表达式 依旧是如此顺序) 2.Where(条件筛选  谓词筛选 ) 3.Group by(分组) 4.Having(分组   ...