使用python实现计算器功能
学习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实现计算器功能的更多相关文章
- 利用PYTHON设计计算器功能
通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...
- python实现计算器功能
import re def strip_operate(exp): # 合并多余的操作符 exp = exp.replace("+-", "-") exp = ...
- 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 ...
- 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...
- python实现计算器
计算器功能 实现优先级解析,加减乘除四则运算 自定义小数位精度 实现思想: 先找到最里层括号,根据乘除,加减优先级,调用写好的乘除.加减运算函数算出括号内总值,再将原括号式用所得值替换,此过程循环进行 ...
- python之计算器(第四天)
作业: 使用正则表达式和递归实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 一.实例说明: 本实例自己写了个版本,但依旧存在一点bug,例:-2-2等计算问题,故最后 ...
- 从零开始学习PYTHON3讲义(二)把Python当做计算器
<从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...
- javaWeb 使用 jsp 和 javaBean 实现计算器功能
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- C#实现按键计算器功能
C#实现按键计算器功能 (一次失败的编程) 界面: 代码如下: using System; using System.Collections.Generic; using System.Compone ...
随机推荐
- Oracle-SQL-按月统计自助终端交易量
SQL实现的目标: 基本情况 现金交易情况 转账情况 转账交易情况(明细) 其它业务情况 交易量汇总 日均交易量 交易金额 绩效情况(万元) 支行名 支行号 所属网点 网点号 管理员帐户 管理员 终端 ...
- 【机器学习实战】Machine Learning in Action 代码 视频 项目案例
MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apa ...
- [UIKit学习]03.关于UILable
代码创建UILabel UILabel *label = [[UILabel alloc] init]; label.text = @"单肩包"; label.frame = CG ...
- day16<集合框架+>
集合框架(去除ArrayList中重复字符串元素方式) 集合框架(去除ArrayList中重复自定义对象元素) 集合框架(LinkedList的特有功能) 集合框架(栈和队列数据结构) 集合框架(用L ...
- TCP/IP中你不得不知的十大秘密
这段时间 有一点心很浮躁,不过希望自己马上要矫正过来.好好学习编程!这段时间我想好好地研究一下TCP/IP协议和网络传输这块!加油 一.TCP/IP模型 TCP/IP协议模型(Transmission ...
- Opengl4.5 中文手册—E
索引 A B C D E F G H I J K L M N O P Q ...
- vue实例讲解之vue-router的使用
实例讲解系列之vue-router的使用 先总结一下vue-router使用的基本框架: 1.安装并且引入vue-router 安装:npm install vue-router --save-dev ...
- cnblog排版
记录一些自己写博客中的排版技巧 一.标题 红色部分代码用在标题的CSS样式中 <p style="background: gray; font-size: 18px; font-fam ...
- js-异步机制与同步机制
Javascript的优势之一是其如何处理异步代码.异步代码会被放入一个事件队列,等到所有其他代码执行后才进行,而不会阻塞线程 1 理解异步代码: 1.1 JavaScript最基础的异步函数是set ...
- webpack html
调用了原模板 修改路径 使html放在JS外面 可以传递参数 多个html指定对应chunks 除了某些模块其余的都被引入