老男孩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: ***** **** *** ** * ...
随机推荐
- Oracle RMAN 学习
Oracle RMAN 学习:三思笔记 1 进入rman Rman--物理备份(结构/数据) 1 本地db Cmd set oracle_sid=orcl 1 rman target / Rman&g ...
- C#的颜色解析及操作和相关Brush
一.颜色表示方式 // // Summary: // Creates a System.Drawing.Color structure from a 32-bit ARGB value. // // ...
- [Python Study Notes]pd.read_csv()函数读取csv文件绘图
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- Android指针管理:RefBase,SP,WP
Android中通过引用计数来实现智能指针,并且实现有强指针与弱指针.由对象本身来提供引用计数器,但是对象不会去维护引用计数器的值,而是由智能指针来管理. 要达到所有对象都可用引用计数器实现智能指针管 ...
- requestLayout, invalidate和postInvalidate的异同
requestLayout 当一个VIEW的布局属性发生了变化的时候,可以调用该方法,让父VIEW调用onmeasure 和onlayout重新定位该view的位置,需要在UI线程调用 invalid ...
- springBoot数据库jpa+对接mybatis
1 spring Data jpa hibernate引领数据访问技术,使用orm对象关系映射来进行数据库访问,通过模型和数据库进行映射,通过操作对象实现对数据库操作,把数据库相关操作从代码中独立出 ...
- oracle语法练习汇总
全是自己一个一个敲出来的啊 啊 啊 --(1)查询20号部门的所有员工信息. --(2)查询所有工种为CLERK的员工的工号.员工名和部门名. select e.empno,e.ename,d.dna ...
- bzoj 2653 middle(主席树)
题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...
- Condition实现多个生产者多个消费者
Condition实现多对多交替打印: import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.R ...
- 204. Count Primes 统计<n的质数的个数
[抄题]: Count the number of prime numbers less than a non-negative number, n. [暴力解法]: 时间分析: 空间分析: [优化后 ...