学习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. Oracle-表被锁住

    1.如果update 某个表,没有报错,等待很久都没结束,那很有可能是表被锁了. 2.查看被锁的对象 select sid,serial#,username,SCHEMANAME,osuser,MAC ...

  2. 如何使用Flexbox和CSS Grid,实现高效布局

    CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想.幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来 ...

  3. eclipse设置背景保护色及常用设置

    1.设置背景颜色 2.代码自动补全 Windows-->Preferences-->Java-->Editor-->Content Asist,在Auto activation ...

  4. GCD之死锁

    GCD相当好用,但用不好就会死锁,始终要记着这样一句秘籍: 不要在串行队列放dispatch_sync.dispatch_apply 下面看几个例子 1 2 3 4 5 6 7 8 9 10 11 1 ...

  5. Java数据库 高级查询

    插入数据记录 1.插入单行数据 语法: INSERT INTO 表名 [(字段名列表)]  VALUES (值列表); 2.插入多行数据 语法:INSERT INTO 新表 (字段名列表) VALUE ...

  6. 深入浅出数据结构C语言版(22)——排序决策树与桶式排序

    在(17)中我们对排序算法进行了简单的分析,并得出了两个结论: 1.只进行相邻元素交换的排序算法时间复杂度为O(N2) 2.要想时间复杂度低于O(N2),算法必须进行远距离的元素交换 而今天,我们将对 ...

  7. HTML5基础知识及相关笔记

    HTML5基础 1.1HTML文件的基本结构和W3C标准 1.1.1HTML简介 HTML是一种描述网页的语言,一种超文本标记的语言! 1.1.2HTML文件的基本结构 头部(head) 头部是网页的 ...

  8. Ubuntu 定时任务中的环境变量设置

    背景 1,定时任务命令 crontab -e 2,默认的环境变量 SHELL=/bin/sh PATH=/usr/bin:/bin PWD=/home/owl LANG=zh_CN.UTF- SHLV ...

  9. 网时|ipone8爆冷,我的服务器空欢喜一场

    上周ipone可谓是占尽了风头,从face ID到全面屏,从人脸识别到逆天价格,小编都能预想到上市之后的一片火热了,苹果后台的服务器恐怕都早已做好了准备,加大带宽,稳定运行,确保万无一失. 9月22日 ...

  10. ListBox数据绑定无效

    public class DataList { public List<string> listSource; private DataTable table; public DataLi ...