python计算器实验报告_python作业模拟计算器开发(第五周)

作业需求:

模拟计算器开发:

实现加减乘除及拓号优先级解析

用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致

思路解析:

1. 先实现基本+-*/

2. 使用re正则模块优先解析最内测的拓号进行运算

程序核心代码:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# Author: Colin Yao

"""模拟计算器开发作业"""

import re

def operator_update(formula):

formula = formula.replace(" ", "")

formula = formula.replace("+-", "-")

formula = formula.replace("--", "+")

return formula

def calc_muldiv(formula_list):

for index, element in enumerate(formula_list):

if "*" in element or "/" in element:

operators = re.findall("[*/]", element)

calc_list = re.split("[*/]", element)

num = None

for i, e in enumerate(calc_list):

if num:

if operators[i - 1] == "*":

num *= float(e)

elif operators[i - 1] == "/":

num /= float(e)

else:

num = float(e)

formula_list[index] = num

return formula_list

def calc_plumin(operators, num_list):

num = None

for i, e in enumerate(num_list):

if num:

if operators[i - 1] == "+":

num += float(e)

elif operators[i - 1] == "-":

num -= float(e)

else:

num = float(e)

return num

def merge(plus_minus_operator, multiply_divide_list):

for index, element in enumerate(multiply_divide_list):

if element.endswith("*") or element.endswith("/"):

multiply_divide_list[index] = element + plus_minus_operator[index] + multiply_divide_list[index + 1]

del multiply_divide_list[index + 1]

del plus_minus_operator[index]

return merge(plus_minus_operator, multiply_divide_list)

return plus_minus_operator, multiply_divide_list

def bracket_calc(formula):

formula = re.sub("[()]", "", formula) # 去除两边的()

formula = operator_update(formula)

plus_minus_operator = re.findall("[+-]", formula)

multiply_divide_list = re.split("[+-]", formula)

if multiply_divide_list[0] == "":

multiply_divide_list[1] = "-" + multiply_divide_list[1]

del plus_minus_operator[0]

del multiply_divide_list[0]

res = merge(plus_minus_operator, multiply_divide_list)

plus_minus_operator = res[0]

multiply_divide_list = res[1]

plus_minus_list = calc_muldiv(multiply_divide_list)

res = calc_plumin(plus_minus_operator, plus_minus_list)

return res

def calculate(formula):

while True:

formula_depth = re.search("\([^()]+\)", formula)

if formula_depth:

formula_depth = formula_depth.group()

res = bracket_calc(formula_depth)

formula = formula.replace(formula_depth, str(res))

print(formula)

else:

res = bracket_calc(formula)

print(res)

exit()

if __name__ == '__main__':

msg = '''

进行解析()的运算

例如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )

'''

print(msg)

formula = input("请输入要进行的运算>>>:")

# formula = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"

calculate(formula)

程序测试样图:

Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

Python作业模拟登陆(第一周)

模拟登陆:1. 用户输入帐号密码进行登陆2. 用户信息保存在文件内3. 用户密码输入错误三次后锁定用户 思路: 1. 用户名密码文件为passwd,锁定用户文件为lock 2. 用户输入账号密码采用i ...

python作业简单FTP(第七周)

作业需求: 1. 用户登陆 2. 上传/下载文件 3. 不同用户家目录不同 4. 查看当前目录下文件 5. 充分使用面向对象知识 思路分析: 1.用户登陆保存文件对比用户名密码. 2.上传用json序 ...

python作业高级FTP(第八周)

作业需求: 1. 用户加密认证 2. 多用户同时登陆 3. 每个用户有自己的家目录且只能访问自己的家目录 4. 对用户进行磁盘配额.不同用户配额可不同 5. 用户可以登陆server后,可切换目录 6 ...

python作业学员管理系统(第十二周)

作业需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上课纪录对应多条学 ...

Python作业选课系统(第六周)

作业需求: 角色:学校.学员.课程.讲师.完成下面的要求 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 ...

python作业day4计算器

思路: 用循环提取最里面的括号,再进行运算 运算时利用正则表达式寻找相应的运算符 先进行乘除,再进行加减 (参考武sir和金角大王的代码) 流程图: 代码: #!/usr/bin/env python ...

Python作业工资管理系统(第三周)

作业内容: 实现效果: 从info.txt文件中读取员工及其工资信息,最后将修改或增加的员工工资信息也写入原info.txt文件. 效果演示: 1. 查询员工工资 2. 修改员工工资 3. 增加新员工 ...

python作业:三级菜单(第一周)

一.作业需求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 二.三级菜单 ...

随机推荐

ssh保持链接

修改/etc/ssh/sshd_config配置文件 ClientAliveInterval 300(默认为0), 参数的是意思是每5分钟,服务器向客户端发一个消息,用于保持连接,使用service ...

[zz] Pixar’s OpenSubdiv V2: A detailed look

http://www.fxguide.com/featured/pixars-opensubdiv-v2-a-detailed-look/ Pixar’s OpenSubdiv V2: A detai ...

探索 Linux 内存模型--转

引用:http://www.ibm.com/developerworks/cn/linux/l-memmod/index.html 理解 Linux 使用的内存模型是从更大程度上掌握 Linux 设计 ...

HTTP - 基本认证

有数百万的人在用 Web 进行私人事务处理,访问私有的数据.通过 Web 可以很方便地访问这些信息,但是仅仅是方便访问还是不够的.我们要保证只有特定的人能看到我们的敏感信息并且能够执行我们的特权事务. ...

有关sybase的一些零星经验

clear transaction log >dump transaction master with truncate_only >dump transaction master wit ...

mac 神奇时光机

http://bbs.zol.com.cn/nbbbs/d544_8216.html

Go 解析JSON

JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读.尽管JSON是JavaScript的一个子集,但JSON是独立于 ...

Android_Studio常用插件

Android studio常用插件,可极大简化开发,增强开发效率. 不懂安装studio插件,看参考博文:android stuido插件安装:http://blog.csdn.net/liang5 ...

基础--Redis在Windows环境下的安装

1. 安装Redis 1.1 下载安装包 https://github.com/ServiceStack/redis-windows#3-run-the-redis-serverexe-using-t ...

ubuntu14.04 python2.7 安装配置OpenCV3.0

环境:ubuntu14.04  python2.7 内容:安装并配置OpenCV3.0 今天按照OpenCV官网上的步骤装了OpenCV但是,装好之后python提示“No module named ...

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值