学习python过程中的作业。实现了+、-、×、/、及幂运算,支持括号优先级。

代码为python3.5

 import re
def formatEquation(string):
string = string.replace("--", "+")
string = string.replace("-+", "-")
string = string.replace("++", "+")
string = string.replace("+-", "-")
string = string.replace("*+", "*")
string = string.replace("/+", "/")
string = string.replace(' ', '')
return string
def findErrorChar(equation):
'''
查找非计算的字符
'''
re_rule = r"[^ \.\d\+\-\*\/\(\)]+"
req = re.findall(re_rule,equation)
return req
def findErrorOperator(equation):
'''
查找连续多次出现的运算符号
'''
re_rule = r'[+\-/*][+\-/*][+\-/*]*'
req = re.findall(re_rule,equation)
while '**' in req:
req.remove('**')
return req
def addSubtract(equation):
'''
加减法运算,递归运算
'''
re_rule = r'[-]?\d+\.?\d*[+-]\d+\.?\d*'
if re.search(re_rule,equation):
req = re.search(re_rule,equation).group()
if '+' in req:
x,y = req.split('+')
string = str(float(x) + float(y))
equation = formatEquation(equation.replace(req,string))
return addSubtract(equation)
if '-' in req:
if req.startswith('-'):
req1 = req[1:]
x,y = req1.split('-')
x = '-'+x
else:
x,y = req.split('-')
string = str(float(x) - float(y))
equation = formatEquation(equation.replace(req,string))
return addSubtract(equation)
else:
return equation def multiplicationDivision(equation):
'''
乘除法及幂运算,递归运算
'''
re_rule = r'\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*'
print(11)
if re.search(re_rule,equation):
req = re.search(re_rule,equation).group()
print(req)
if '**' in req:
x,y = req.split('**')
string = str(float(x) ** float(y))
equation = formatEquation(equation.replace(req,string))
return multiplicationDivision(equation)
if '*' in req:
x,y = req.split('*')
string = str(float(x) * float(y))
equation = formatEquation(equation.replace(req,string))
return multiplicationDivision(equation)
if '/' in req:
x,y = req.split('/')
string = str(float(x) / float(y))
equation = formatEquation(equation.replace(req,string))
return multiplicationDivision(equation)
else:
return equation
def removeBrackets(equation):
'''
计算算式中括号里的公式,直到所有括号的计算已完成
'''
re_rule = r'\([^()]*\)'
equation = formatEquation(equation)
if re.search(re_rule,equation):
req = re.search(re_rule,equation).group()
string = addSubtract(multiplicationDivision(req[1:-1]))
equation = equation.replace(req,string)
return removeBrackets(equation)
else:
return equation
if __name__ == '__main__':
while 1:
#equation = input("请输入需要计算的公式")
equation = "1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
equation = equation.replace(' ','')
#判断字符是否合法
if findErrorChar(equation) :
errorChar = findErrorChar(equation)
print("下列字符不合法:",''.join(errorChar))
elif findErrorOperator(equation):
errorOperator = findErrorOperator(equation)
print("下列字符不合法:",''.join(errorOperator))
else:
#格式化算式
formatEquation(equation)
print("输入的公式为:",equation)
#去除括号
equation = removeBrackets(equation)
#计算结果
equation = addSubtract(multiplicationDivision(equation))
print('程序计算结果为:',equation)
print('eval计算结果为:',eval(equation))
break

源代码

使用python实现计算器功能的更多相关文章

  1. 利用PYTHON设计计算器功能

    通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...

  2. python实现计算器功能

    import re def strip_operate(exp): # 合并多余的操作符 exp = exp.replace("+-", "-") exp = ...

  3. python 实现计算器功能 输入字符串,输出相应结果

    import re formul='1 - 2 *( (6 0- 30+(0-40/5) * (9-2* 5/3 +7 /3*99/4*2998 +10 *568/14)) - (-4*3) / (1 ...

  4. 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

    #!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...

  5. python实现计算器

    计算器功能 实现优先级解析,加减乘除四则运算 自定义小数位精度 实现思想: 先找到最里层括号,根据乘除,加减优先级,调用写好的乘除.加减运算函数算出括号内总值,再将原括号式用所得值替换,此过程循环进行 ...

  6. python之计算器(第四天)

    作业: 使用正则表达式和递归实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 一.实例说明: 本实例自己写了个版本,但依旧存在一点bug,例:-2-2等计算问题,故最后 ...

  7. 从零开始学习PYTHON3讲义(二)把Python当做计算器

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  8. javaWeb 使用 jsp 和 javaBean 实现计算器功能

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  9. C#实现按键计算器功能

    C#实现按键计算器功能 (一次失败的编程) 界面: 代码如下: using System; using System.Collections.Generic; using System.Compone ...

随机推荐

  1. Intellij idea 断点调试

    前言 之前使用Intellij Idea断点调试都是极其简单的,都是下一步下一步下一步这样子-..还有最坑爹的以为:IDEA只能调试一次.调试完就要重启Tomcat服务器-..因此花了大量的冤枉时间- ...

  2. [python学习笔记] String格式化

    格式化 S % (args...) 方式 特点 str里的占位符同java里的占位符. 优势 这种方式可以限定格式化的时候接受的数据类型. 常见占位符 %d 接收数字,格式化为 十进制 %x 接收数字 ...

  3. Thinkphp5.0 在自己定义一个公共方法的控制器并且继承了Controller类的时候报错

    在建立网站的时候,你通常想着把一些共有的方法提取出来,放入一个控制器内,如果你是将业务逻辑写入了构造函数里面,那么就得注意了. 在thinkphp5.0当中,有一个初始化的方法,类似于构造函数,那就是 ...

  4. 【DDD】领域驱动设计实践 —— UI层实现

    前面几篇blog主要介绍了DDD落地架构及业务建模战术,后续几篇blog会在此基础上,讲解具体的架构实现,通过完整代码demo的形式,更好地将DDD的落地方案呈现出来.本文是架构实现讲解的第一篇,主要 ...

  5. TOP命令详解(负载情况)

    简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...

  6. JSP入门 Listener

    实现HttpSessionListener 编写一个OnlineUserListener类 package anni; import java.util.List; import javax.serv ...

  7. 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya's Game。

    废话不多说,先上题目. 51nod Codeforces 两个其实是一个意思,看51nod题目就讲的很清楚了,题意不再赘述. 直接讲我的分析过程:刚开始拿到手有点蒙蔽,看起来很难,然后......然后 ...

  8. bzoj1143 祭祀river(最大独立集)

    [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2175  Solved: 1098[Submit][Status] ...

  9. 【codevs1001】[bzoj1050]舒适的路线

    给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径上最大边和最小边的比值最小. ...

  10. hadoop(二)搭建伪分布式集群

    前言 前面只是大概介绍了一下Hadoop,现在就开始搭建集群了.我们下尝试一下搭建一个最简单的集群.之后为什么要这样搭建会慢慢的分享,先要看一下效果吧! 一.Hadoop的三种运行模式(启动模式) 1 ...