设计目标

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

用户输入'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 设计一个简单的计算器-Go语言中文社区相关推荐

  1. python写的篮球文字游戏_python制作一个简单的文字游戏——零基础学python 004

    前言: 之前我们简单的学习了一些函数,所谓学以致用.那么我们看看用这几个函数能够做出怎么样的文字游戏? 游戏的思路很简单,要求输入一个程序已经设置好的数字,猜中了返回一句话话,猜错了返回一句话:然而只 ...

  2. python构建简单神经网络_Python构建一个简单的神经网络,Pytorch,搭建

    首先搭建一个神经网络: import torch import torch.nn.functional as F from torch.autograd import Variable import ...

  3. python 简单数据库_Python打造一个简单的本地数据库

    先上效果图 用某特殊方法存到云端,想法是用网上的免费静态文件来储存我的数据库数据 main.py文件 # -*- coding:utf-8 -*- from HUAISQL import * whil ...

  4. html网页设计简单吗,如何做一个简单的网页设计

    很多网页设计初学者都说,国外的网页设计很简单,但是又很容易吸引用户,这里面有什么诀窍吗?做一个网页如何做到界面简洁,内容简单又能打动用户,粘贴住他们.本文素马将讲解简单容易出效果的网页设计技巧,附上精 ...

  5. Python开发第一步:如何制作一个简单的桌面应用

    Python开发第一步:如何制作一个简单的桌面应用 前言 大家好,我是baifagg, 一个热爱Python的编程爱好者. 今天我们来学习一下, 如何用Python制作一个简单的桌面应用程序. 虽然桌 ...

  6. python小项目实例流程-Python小项目:快速开发出一个简单的学生管理系统

    原标题:Python小项目:快速开发出一个简单的学生管理系统 本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: ...

  7. python小项目案例-Python小项目:快速开发出一个简单的学生管理系统

    本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管理 学生信息的管理 根据A ...

  8. python项目开发实例-Python小项目:快速开发出一个简单的学生管理系统

    本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管理 学生信息的管理 根据A ...

  9. 用Python实现音频卷积,并制作一个简单的HRTF效果

    用Python实现音频卷积,并制作一个简单的HRTF效果 作为一个刚刚入门Python的小白用户,写出这篇文章还是废了我很大的力气,不过幸运的是,在网上到处东拼西凑,我还是把它给做出来了. 废话不多说 ...

  10. python爬虫入门教程(二):开始一个简单的爬虫

    2019/10/28更新 使用Python3,而不再是Python2 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329 爬 ...

最新文章

  1. IE再次曝出安全漏洞 微软表示正在调查
  2. 【 FPGA 】认识关键BUFFER
  3. OpenCV gapi模块OMZ文本检测的实例(附完整代码)
  4. STL之红黑树容器:set,hash_set,multiset,hash_map,multimap
  5. java 连接redis_Redis 开发陷阱及避坑指南!
  6. Weak Pair HDU - 5877 树状数组+离散化+DFS遍历
  7. 科目三夜考考试内容及过关攻略
  8. LeetCode 739. 每日温度(单调栈)
  9. 25 矩阵——QR分解、Householder 矩阵、镜面反射
  10. 【Visual C++】Windows GDI贴图闪烁解决方法
  11. Android SDK下载安装及配置教程
  12. Android中各个国家语言对应的系统资源文件夹名称及对应简写
  13. stm32 薄膜键盘原理_stm32F4----薄膜4*4矩阵键盘读取(七)
  14. 圈子圈套,何谓成功?
  15. 简单的选课系统(6)——选课界面和管理员界面
  16. 完美解决vmware连接摄像头问题(驱动程序错误)
  17. 时序动作检测《BMN: Boundary-Matching Network for Temporal Action Proposal Generation》
  18. OpenCV 表盘指针自动读数
  19. 台式电脑怎么连接蓝牙和无线网
  20. DirectX11--深入理解与使用2D纹理资源

热门文章

  1. 形变立体跟踪-基于稠密运动估计和力学仿真(1)
  2. 软件开发中的一些感想
  3. 软件编程思想的些许感想
  4. 为什么说线索二叉树是一种物理结构
  5. 看雪学院课程《汇编语言详解与二进制漏洞初阶》笔记
  6. BUUCTF-Reverse:内涵的软件
  7. Linux下查看文件占用空间大小的du 和df 命令
  8. STM32F4 HAL库开发 -- 串口
  9. C语言再学习 -- 再论数组和指针
  10. 如何制作LINUX的patch文件及如何打patch