Python 设计一个简单的计算器
设计目标
实现加减乘除及拓号优先级解析 用户输入'1 - 2 * ( (6-3 +(-5/5)*(9-2*3/3 + 7/3*7/4*12 +10 * 5/5 )) - (-4*3)/ (12-3*2) )'等类似公式后, 必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致
流程图:

代码:
1、主文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/10/18 22:26
# @Author : Evescn
# @Site :
# @File : mian.py
# @Software: PyCharm import re def multi_or_divi(string):
# 乘除法函数
# 去掉括号
calc_list = re.search("[^()]+", string)
# 以乘除符号分割
sub_calc_list = re.split("[*/]", calc_list.group())
# 获取到字符串中的乘除符号
sub_operator_list = re.findall("[*/]", calc_list.group())
sub_res = None
for index in range(len(sub_calc_list)):
if sub_res:
if sub_operator_list[index-1] == "*":
sub_res *= float(sub_calc_list[index])
else:
sub_res /= float(sub_calc_list[index])
else:
sub_res = float(sub_calc_list[index])
return float(sub_res) def add_or_sub(string):
# 加减法函数
# 去掉括号
calc_list = re.search("[^()]+", string)
# 以加减符号分割
sub_calc_list = re.split("[+-]", calc_list.group())
# 获取到字符串中的加减符号
sub_operator_list = re.findall("[+-]", calc_list.group())
# 如果字符串已减号开头,需要特殊处理
if re.match("[-+]", calc_list.group()):
if sub_operator_list[0] == "-":
sub_calc_list[1] = -float(sub_calc_list[1])
# 对sub_operator_list和sub_calc_list进行字符串切割,或者到正确数据
sub_operator_list = sub_operator_list[1:]
sub_calc_list = sub_calc_list[1:]
# 对字符串切割后,如何sub_calc_list为空,表示传过来的数为-X,直接返回sub_calc_list[0]即可,无需乘除运算
if len(sub_operator_list) == 0:
return sub_calc_list[0]
sub_res = None
for index in range(len(sub_calc_list)):
if sub_res:
if sub_operator_list[index-1] == "+":
sub_res += float(sub_calc_list[index])
else:
sub_res -= float(sub_calc_list[index])
else:
sub_res = float(sub_calc_list[index])
return float(sub_res) def deal_minus_issue(ret):
# 处理减法字符串
# 创建一个新字符串用于返回处理后的字符串
new_ret = []
for index, item in enumerate(ret):
if item.endswith("*") or item.endswith("/"):
new_ret.append("%s-%s" %(ret[index], ret[index+1]))
elif re.search("[*/]", ret[index]):
new_ret.append(ret[index])
return new_ret def main():
# 输入字符串
a = '1 - 2 * ( (6-3 +(-5/5)*(9-2*3/3 + 7/3*7/4*12 +10 * 5/5 )) - (-4*3)/ (12-3*2) )'
# a = '+(-40/5+3*(-12))'
# 去空格
a = a.replace(" ", "")
# 设置循环退出的条件
count = 2
while True and count > 0:
# 最内行括号
calc_list = re.search(r'\([^()]+\)', a)
if calc_list:
# 如果能取到括号,把正则匹配结果赋值给calc_list_value
calc_list_value = calc_list.group()
else:
# 如果不能取到括号,说明已经没有括号了,这只有加减乘除,对多只需要2次计算即可得出结果
# 把a字符串赋值给calc_list_value
count -= 1
calc_list_value = a
if "+" in calc_list_value or "-" in calc_list_value:
if "*" in calc_list_value or "/" in calc_list_value:
# 去掉括号以便以加减符号分割字符串
calc_list1 = re.findall(r'[^()]+', calc_list_value)
# 以加减符号去分割
calc_list2 = re.split(r'[-+]', calc_list1[0])
# 调用处理减法字符串函数,处理下*-或者/-这类问题
calc_list2 = deal_minus_issue(calc_list2)
# 返回后的calc_list列表只有包含乘除的式子
for item in calc_list2:
# 对每一个乘除调用乘除函数
value = multi_or_divi(item)
# 把计算后的结果替换掉原来的值
a = a.replace(item, str(value))
# 处理下字符串中出现的++或+-问题
a = a.replace("+-", "-")
a = a.replace("--", "+")
else:
# 式子中没有乘除符号,那就只有加减符号,调用加减函数
value = add_or_sub(calc_list_value)
# 把计算后的结果替换掉原来的值
a = a.replace(calc_list_value, str(value))
# 处理下字符串中出现的++或+-问题
a = a.replace("+-", "-")
a = a.replace("--", "+")
else:
if "*" in calc_list_value or "/" in calc_list_value:
# 式子中没有加减符号,那就只有乘除符号,调用处理减法字符串函数,处理下*-或者/-这类问题
value = multi_or_divi(calc_list_value)
# 把计算后的结果替换掉原来的值
a = a.replace(calc_list_value, str(value))
# 处理下字符串中出现的++或+-问题
a = a.replace("+-", "-")
a = a.replace("--", "+")
print("a:", a) if __name__ == '__main__':
main()
2、运行结果
a: 1-2*((6-3+(-1.0)*(9-2*3/3+7/3*7/4*12+10*1.0))-(-4*3)/(12-3*2))
a: 1-2*((6-3-1.0*(9-2*3/3+7/3*7/4*12+10*1.0))-(-4*3)/(12-3*2))
a: 1-2*((6-3-1.0*(9-2.0+49.00000000000001+10.0))-(-4*3)/(12-3*2))
a: 1-2*((6-3-1.0*66.0)-(-4*3)/(12-3*2))
a: 1-2*((6-3-66.0)-(-4*3)/(12-3*2))
a: 1-2*(-63.0-(-4*3)/(12-3*2))
a: 1-2*(-63.0-(-12.0)/(12-3*2))
a: 1-2*(-63.0+12.0/(12-3*2))
a: 1-2*(-63.0+12.0/(12-6.0))
a: 1-2*(-63.0+12.0/6.0)
a: 1-2*(-63.0+2.0)
a: 1-2*-61.0
a: 1+122.0
a: 123.0
Python 设计一个简单的计算器的更多相关文章
- 【python免费代码】设计一个简单的学生信息管理系统
文章目录 前言 一.理解 二.部分截图展示 三.代码 四.总结 前言 设计一个简单的学生信息管理系统,实现以下功能(bug) : 录入学生信息,信息以文件方式存储 以学生学号或者学生姓名为条件查询该学 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- JS实现一个简单的计算器
使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择 ...
- 设计一个简单的,低耗的能够区分红酒和白酒的感知器(sensor)
学习using weka in your javacode 主要学习两个部分的代码:1.过滤数据集 2 使用J48决策树进行分类.下面的例子没有对数据集进行分割,完全使用训练集作为测试集,所以不符合数 ...
- 用Python设计一个经典小游戏
这是关于Python的第9篇文章,介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习 ...
- Android下实现一个简单的计算器源码
下面的内容是关于Android下实现一个简单的计算器的内容. import android.app.Activity; import android.os.Bundle;import android. ...
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- 180626-Spring之借助Redis设计一个简单访问计数器
文章链接:https://liuyueyi.github.io/hexblog/2018/06/26/180626-Spring之借助Redis设计一个简单访问计数器/ Spring之借助Redis设 ...
- python中一个简单的webserver
python中一个简单的webserver 2013-02-24 15:37:49 分类: Python/Ruby 支持多线程的webserver 1 2 3 4 5 6 7 8 9 10 11 ...
随机推荐
- 【Tech】CAS RESTful API使用笔记
在被maven,cas,tomcat各种贱人就是矫情的虐了好几天之后,终于跑通了demo,哈哈哈哈哈哈哈~ 在这里详细记录一下,给和我一样连maven都不会的小白一点福利,同时欢迎大神指正. 首先上最 ...
- tomcat8配置tomcat-users.xml不生效
一般想进入tomcat管理后台,只要在tomcat-users.xml配置文件中添加一下内容即可 <role rolename="manager-gui"/> < ...
- 高通平台MSM8916LCM模块移植(一)-bootloader部分【转】
本文转载自:http://www.mobile-open.com/2016/970947.html 高通平台中的bootloader叫做LK(Little Kernel,对于LCM来说LK部分相当重要 ...
- Golang 连接Kafka
Kafka介绍 Kafka是Apache软件基金会开发的一个开源流处理平台,由Java和Scala编写:Kafka是一种高吞吐.分布式.基于订阅发布的消息系统. Kafka名称解释 Producer: ...
- Git使用http clone客户端保存用户名密码
使用Git Bash时,用命令git pull或git push时总是要输入密码,很烦躁 解决办法 需要注意的是,这个方法是在Windows下使用 1. 新建环境变量 HOME 值为 %USERP ...
- 使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)
说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置 ...
- linux-RabbitMQ安装命令
一.RabbitMQ 1.安装配置epel源 $ rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.no ...
- 将Sql2008的数据库转到2005
今天碰到一个特别伤心的事情. 事情的起因是这样的,现在我负责评教系统的维护工作.由于中途服务器转迁,迁移之前数据库版本是2005,而现在的服务器版本是2008R2的.在这个过程并没有发生什么问题. 问 ...
- Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论
题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...
- async函数基础
async函数 含义 异步操作的函数,一句话,async函数就是generator函数的语法糖. 用法 async函数会将generator函数的星号(*)替换成async,将yield替换成awai ...