学习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. mybatis入门篇基——基本配置与参数说明

    Mybatis 好吧这是我第一次写这种文章~如果有不足和错误之处欢迎评论,指点.今天想谈谈关于mybatis的一些基础入门知识. 进入正题~~: a.关于mybatis: 我个人觉得mybatis深得 ...

  2. angular之表单验证与ngMessages

    刚接触angular1.x很多经常用到的ngMessages的地方,这里顺便记一下,效果如下图: 如果引用了angular-messages.js报如下错误,说明你的angular.js和angula ...

  3. 关于MySQL 事务,视图,索引,数据库备份,恢复

      /*创建数据库*/ CREATE DATABASE `mybank`;/*创建表*/USE mybank;CREATE TABLE `bank`(    `customerName` CHAR(1 ...

  4. Minutes和TotalMinutes的区别

    今天测试提了一个BUG,说是消息提醒的时机不对,设置的提前2小时,还没到就提醒了. 看了下代码 (m.ExpectReceiveTime - DateTime.Now).Minutes < (p ...

  5. .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的.附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够了 ...

  6. spark与hive的集成

    一:介绍 1.在spark编译时支持hive 2.默认的db 当Spark在编译的时候给定了hive的支持参数,但是没有配置和hive的集成,此时默认使用hive自带的元数据管理:Derby数据库. ...

  7. Java EE开发环境——MyEclipse2017破解 和 Tomcat服务器配置

    Java EE开发,我们可以搭建如下开发环境: 底层运行环境:jdk 和 jre. Web服务器:Tomcat 后台数据库:SQL Server 可视化集成开发环境:MyEclipse Java EE ...

  8. S2_OOP第一章

    面向对象设计的过程就是抽象的过程 步骤: 第一步:发现类 第二步:发现类的属性 第三步:发现类的方法 抽象是遵循的原则 属性和方法的设置是为了解决业务问题 关注主要属性和方法 如果没有必要,不增加额外 ...

  9. ssh项目访问路径及url请求书写

    在ssh项目中配置好Struts后,一般可以采用两种方式进行后台请求: 1.html形式,包括a标签,form表单,ajax等.此时的访问链接必须写全路径,可以是相对路径,也可以是绝对路径 相对路径方 ...

  10. css系列教程1-选择器全解

    全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css系列教程1-选择器全解 css系列教程2-样式操作全解 css选择器全解: css选择器包括:基本选择器.属性选择器.伪类选择器.伪元 ...