老男孩Day6作业:计算器
作业需求:
1、实现加减乘除及拓号优先级解析
2、用户输入
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
等类似公式后
3、必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),
4、运算后得出结果,结果必须与真实的计算器所得出的结果一致
1)流程图

首先,根据计算符号的优先级考虑,带有括号的优先级最高,需要优先计算括号内的式子,计算完括号内的式子之后,破除括号,再进行加减乘除的运算。在四则运算中,加减运算是一个优先级的,乘除运算是一个优先级的,那么我们就可以先行计算乘除,将整个式子中的乘除全部计算完成以后,再次进行加减的计算,最终可以得到运算的结果
2、程序会判断用户输入的表达式是否符有效并给出相应提示

2、用户在主界面中输入:"q"程序会退出

3、程序通过eval函数计算出正确计算结果

二、具体实现
#-*- Coding:utf-8 -*-
# Author: D.Gray
import re,sys
'''
要求:
1\实现加减乘除及拓号优先级解析
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等类似功能偷懒实现),
运算后得出结果,结果必须与真实的计算器所得出的结果一致
'''
def compute_mul_div(mg):
'''
定义一个乘除函数
:param mg:
:return:
'''
num = mg[0] # -40/5
match = re.search("\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*",num)
if not match:
return
content = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*',num).group()
if len(content.split('*')) > 1:
v1,v2 = content.split('*')
value = float(v1) * float(v2)
# print('v1>>>%s and v2>>>%s'%(str(v1),str(v2)))
# print('computer_mul:%s and %s'% (str(content),str(value)))
else:
v1, v2 = content.split('/')
value = float(v1) / float(v2)
# print('v1>>>%s and v2>>>%s' % (str(v1), str(v2)))
# print('computer_del:%s and %s' % (str(content),str(value)))
pur,suf = re.split('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*',num,1)
new_str = '%s%s%s'%(pur,value,suf)
mg[0] = new_str
#print('pur>>>%s value>>>%s uer>>>%s new_str>>>%s' % (pur, value,suf,new_str))
compute_mul_div(mg) def compute_add_sub(mg):
'''
运算表达式加减函数
:param mg:
:return:
'''
while True:
if mg[0].__contains__('+-') or mg[0].__contains__('++') or mg[0].__contains__('-+') or mg[0].__contains__('--'):
mg[0] = mg[0].replace('+-', '-') # 将-替换掉+-
mg[0] = mg[0].replace('++', '+') # 将+替换掉++
mg[0] = mg[0].replace('-+', '-') # 将-替换掉-+
mg[0] = mg[0].replace('--', '+') # 将+替换掉--
else:
break
if mg[0].startswith('-'): # 如果arg的第0个元素是以-开头
mg[1] += 1 # arg的第一个元素自加1
mg[0] = mg[0].replace('-', '&')
mg[0] = mg[0].replace('+', '-')
mg[0] = mg[0].replace('&', '+') # 将-变+,+变-
mg[0] = mg[0][1:] # 将arg中第0个元素中前面多出来的符号去掉
num = mg[0] # -40/5
match = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*',num)
if not match:
return
content = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*',num).group()
if len(content.split('+')) > 1:
v1, v2 = content.split('+')
value = float(v1) + float(v2)
# print('v1>>>%s and v2>>>%s' % (str(v1), str(v2)))
# print('computer_add:%s and %s' % (str(content),str(value)))
else:
v1, v2 = content.split('-')
value = float(v1) - float(v2)
# print('v1>>>%s and v2>>>%s' % (str(v1), str(v2)))
# print('computer_sub:%s and %s' % (str(content),str(value)))
pur,suf = re.split('\d+\.*\d*[\+\-]{1}\d+\.*\d*',num,1)
new_str = '%s%s%s'%(pur,value,suf)
mg[0] = new_str
compute_add_sub(mg) def calate(match_group):
'''
计算表达式函数
:param match_group:
:return:
'''
mg = [match_group.strip('()'),0] # mg = ['-40/5']
compute_mul_div(mg) #调用乘除运算函数
compute_add_sub(mg) #调用加减运算函数
if divmod(mg[1],2)[1] == 1:
result = float(mg[0])
result *= -1
#print('divmod_result:%s'%result)
else:
result = float(mg[0])
#print('in the calator-new_str():%s'%mg)
return result def kuohao(calculate):
'''
取出表达式中括号函数
:param calculate:
:return:
'''
while True:
match = re.search('\([^()]+\)',calculate) #使用正则表达式 取出优先级最高的括号 并计算
if match: #如果表达式中有括号
match_group = match.group() #
match_result = calate(match_group) #调用计算函数
calculate = calculate.replace(match_group,str(match_result)) #将括号计算后的结果替换原参数
else: #若表达式中没有括号
calate(calculate)
break
return calate(calculate) print('\033[33m 欢迎使用计算器 :\033[0m'.center(50,'-'))
print('例:1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))')
while True:
calculate_input = input('\033[32m请输入计算的表达式 | (退出:q)>>>\033[0m')
calculate_input = re.sub('\s*','',calculate_input)
if calculate_input == 'q':
exit('程序退出')
if len(calculate_input) == 0:
continue
if re.search('[^\d\+\-\*/\(\)]',calculate_input): #使用正则表达式判断用户输入是否是数字、"+-*/"、"()"
print('\033[31m 输入错误,请重新输入!!!\033[0m')
else:
result = kuohao(calculate_input) #调用去除括号的函数
print('\033[34m 计算结果>>>%s\033[0m'%result)
print('\033[35m 正确结果>>>%s\033[0m' % eval(calculate_input))
老男孩Day6作业:计算器的更多相关文章
- Day6作业:计算器
嗯,稀里糊涂就居然写完了...... readme: 程序说明: 此计算器比较简单,只支持普通的加减乘除和小括号,不支持[],{},求幂之类的均不支持! 测试过的字符串: -1/2*((60-30+( ...
- 老男孩python作业5-开发一个简单的python计算器
开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...
- day6作业详解
1.day6题目 1,老男孩好声⾳选秀⼤赛评委在打分的时候呢, 可以进⾏输入. 假设, 老男孩有10个评委. 让10个评委进⾏打分, 要求, 分数必须⼤于5分, 小于10分. 电影投票. 程序先给出⼀ ...
- day4 作业计算器
作业:计算器开发 (1)实现加减乘除及拓号优先级解析: (2)用户输入 1 - 2 * ( (60-30 +(-40/5) * (-9-2*5/-3 + 7 /3*99/4*2998 +10 * 56 ...
- 老男孩Day16作业:登录、注册、后台管理页面(动态)
一.作业需求: 1.后台管理主界面(左边菜单框.(全选.反选)框.返回顶部按钮) 2.老男孩登录.注册页面 二.博客地址:https://www.cnblogs.com/catepython/p/93 ...
- 老男孩Day7作业:选课系统
1.作业需求:角色:学校.学员.课程.讲师 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包 ...
- python基础: day4作业计算器
作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - ...
- day6作业--游戏人生完善
本节作业: 熟练使用类和模块,写一个交互性强.有冲突的程序. 一.作业目的 1.规范程序写法,要按照模块来规范书写: 2.类的使用,文件之间的调用练习: 3.思路的开阔,自己编写冲突,实现调用 ...
- Day6作业及默写
1.使⽤循环打印以下效果: 1: * ** *** **** ***** for num in range(1,6): print('*' * num) 2: ***** **** *** ** * ...
随机推荐
- python第十一天-----补:缓存操作
memcached,首先下载python-memcached模块,在cmd中执行pip install python-memcached即可 memcached比较简单,默认情况仅支持简单的kv存储, ...
- 问题:oracle case when;结果:Oracle CASE WHEN 用法介绍
Oracle CASE WHEN 用法介绍 1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ...
- Delphi 询问框 汉化
Delphi 询问框 汉化 d:\program files (x86)\embarcadero\studio\17.0\source\fmx\FMX.Consts.pas add this file ...
- NLTK词性标注解释
1. CC Coordinating conjunction 连接词2. CD Cardinal number 基数词3. DT Determin ...
- HDU 4921 Map(状态压缩)
题意看这篇博客. 思路参考的这篇博客. 补充:面对这种问题有一个常见的套路.比如计算若干个区间对答案的贡献这种问题,直接暴力可能复杂度到O(n ^ 2), 而我们可以计算出每个元素在多少个合法区间中, ...
- Java-马士兵设计模式学习笔记-工厂模式-用Jdom模拟Spring
一.概述 1.目标:模拟Spring的Ioc 2.用到的知识点:利用jdom的xpath读取xml文件,反射 二.有如下文件: 1.applicationContext.xml <?xml ve ...
- 100197G Robbers
传送门 题目大意 看式子懂题意系列... 分析 自然想到我们先按比例下取整得到一个值,再按每个人这样分配所产生的值从大到小排序,然后将剩下的几个金币自大到小每人分配一个,代码挺好理解的,详见代码. 代 ...
- 10.model/view实例(4)
任务:给表单的每一列添加列名. 思考: 1.只需要添加一个函数 headerData(). 横向方面添加列名 代码如下: QVariant MyModel::headerData(int sectio ...
- MySQL介绍与安装
mysql介绍 #mysql就是一个基于socket编写的C/S架构的软件 #客户端软件 mysql自带:如mysql命令,mysqldump命令等 python模块:如pymysql 数据库管理软件 ...
- Entity Framework Tutorial Basics(27):Update Entity Graph
Update Entity Graph using DbContext: Updating an entity graph in disconnected scenario is a complex ...