老男孩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: ***** **** *** ** * ...
随机推荐
- json例子--bai
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- RPC: program not registered (ZT)
When we trying to use a particular RPC program, below may indicate that rpcbind is not running or t ...
- c#.net常用字符串函数 字符串常用方法 string
RegionsStr = RegionsStr.Remove(RegionsStr.LastIndexOf(","), 1); //去掉最后一个逗号 string html = ...
- python的程序书写以及保存
在前面的微博里已经叙述Python的安装以及路径的设置. 在我们的windows的电脑上面我们已经安装完了python以及设置了它的路径,所以我们可以再cmd里面进行Python的编写(cmd的快速打 ...
- struts-hibernate整合(1)配置环境
①加载jar包 创建类库: 在myeclipse中点击windows---Preference---Java---Build Path---User Libraries---new 输入创建类库名字s ...
- strophe与openfire模拟的XMPP简单hello程序
/* * 参考<XMPP高级编程+使用JavaScript和jQuery>第三章例子. * 我修改了作者的XMPP服务器到本地的openfire.JavaScript跨域请求,使用Ngin ...
- android 中context的具体作用和意义
context在android中是非常重要的一个类,此类一般用于activity之中 从字面意思来看,这是环境变量,内部实现了一些方法,但是此类也可以看做是一个句柄,用来唯一标示activity 举个 ...
- day70-oracle 12-触发器
查询是没有触发器的.trigger是一个数据库的对象.PL/SQL程序是在我插入之前执行还是在插入之后执行?触发器类似于java中的监听器. 监听插入操作,执行一段PLSQL程序. 禁止在非工作时间插 ...
- go 语言介绍
特点1. 静态类型,编译开源语言 2. 脚本化的语法,支持多种编程范式(函数式,面向对象) 3. 原生,给力的并发支持并发编程 Go语言的优势: 1.脚本化的语法:开发效率高,容易上手 2.静态类型+ ...
- linux 监控内存介绍
一:系统监控:1.对cpu的监测:查看进程占用内存情况 top pid user PRI NI size RSS share stat 进程号 进程所属用户 优先级 优先级 进程所占空间 使用物理内存 ...