python-计算器实现
# 开发一个简单的python计算器
# 实现加减乘除及括号优先级解析
# 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
# 等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致 一.对公式进行简单处理(去掉空格及公式化简)
import re def format_string(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 check_expression(string):
check_result = True
if not string.count("(") == string.count(")"):
print('括号不对称')
check_result = False
if re.findall('[a-z]',string.lower()):
print('表达式有错,包含非法字符')
check_result = False
return check_result
三.进行乘除运算,并将计算的结果替换掉原公式中的乘除法运算
def mul_div(string):
#正则表达式匹配(x乘以y或x除以y)
regular = '\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*'
#一直到公式中没有除法或乘法运算时,退出循环
while re.findall(regular,string):
expression = re.search(regular,string).group()
#计算乘法,并将计算的结果替换原来的式子
if expression.count("*") == 1:
x,y = expression.split('*')
mul_result = str(float(x) * float(y))
string = string.replace(expression,mul_result)
string = format_string(string)
#计算除法,并将计算的结果替换原来的式子
if expression.count("/") :
x,y = expression.split('/')
div_result = str(float(x) / float(y))
string = string.replace(expression,div_result)
string = format_string(string)
return string
四.进行加减法运算
def add_sub(string):
sub_regu = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
add_regu = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
#计算加法
while re.findall(add_regu,string):
add_list = re.findall(add_regu,string)
for add_str in add_list:
x,y = add_str.split("+")
add_result = "+" + str(float(x) + float(y))
string = string.replace(add_str, add_result)
#计算减法
while re.findall(sub_regu,string):
sub_list = re.findall(sub_regu,string)
for sub_str in sub_list:
numbers = sub_str.split('-')
if len(numbers) == 3:
result = 0
#计算-1-2这种情况
for v in numbers:
if v:
result -= float(v)
else:
x,y = numbers
result = float(x)-float(y)
string = string.replace(sub_str,"+" + str(result))
string = format_string(string)
return string
五.轮子造好了,主逻辑程序
if __name__ =="__main__":
if check_expression(source):
strs = format_string(source)
while source.count('(') > 0:
#匹配最里层括号的内容
strs = re.search('\([^()]*\)',source).group()
replace_str = mul_div(strs)
replace_str = add_sub(replace_str)
#每次计算的结果去掉括号
source = format_string(source.replace(strs,replace_str[1:-1]))
# print(source)
#else下边的逻辑是计算不带括号的式子
else:
replace_str = mul_div(source)
replace_str = add_sub(replace_str)
source = source.replace(source,replace_str)
print(source)
六.总结-难点
1.匹配最里层的式子:'\([^()]*\)'
2.匹配乘除法及加减法的正则表达式
3.主逻辑的设计
七.总程序
import re def format_string(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 mul_div(string):
"计算乘除运算,所得的结果替换原先的表达式返回"
regular = '\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*'
while re.findall(regular,string):
expression = re.search(regular,string).group()
if expression.count("*") == 1:
x,y = expression.split('*')
mul_result = str(float(x) * float(y))
string = string.replace(expression,mul_result)
string = format_string(string)
if expression.count("/") :
x,y = expression.split('/')
div_result = str(float(x) / float(y))
string = string.replace(expression,div_result)
string = format_string(string)
return string def add_sub(string):
sub_regu = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
add_regu = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
#计算加法
while re.findall(add_regu,string):
add_list = re.findall(add_regu,string)
for add_str in add_list:
x,y = add_str.split("+")
add_result = "+" + str(float(x) + float(y))
string = string.replace(add_str, add_result)
#计算减法
while re.findall(sub_regu,string):
sub_list = re.findall(sub_regu,string)
for sub_str in sub_list:
numbers = sub_str.split('-')
if len(numbers) == 3:
result = 0
#计算-1-2这种情况
for v in numbers:
if v:
result -= float(v)
else:
x,y = numbers
result = float(x)-float(y)
string = string.replace(sub_str,"+" + str(result))
string = format_string(string)
return string def check_expression(string):
check_result = True
if not string.count("(") == string.count(")"):
print('表达式有错,括号不对')
check_result = False
if re.findall('[a-z]',string.lower()):
print('表达式有错,包含非法字符')
check_result = False
return check_result if __name__ =="__main__":
source = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
if check_expression(source):
strs = format_string(source)
while source.count('(') > 0:
strs = re.search('\([^()]*\)',source).group()
replace_str = mul_div(strs)
replace_str = add_sub(replace_str)
source = format_string(source.replace(strs,replace_str[1:-1]))
else:
replace_str = mul_div(source)
replace_str = add_sub(replace_str)
source = source.replace(source,replace_str)
print(source)
python-计算器实现的更多相关文章
- python 计算器的(正则匹配+递归)
经过2天的长时间的战斗,python计算器终于完成了. import re val="1-2*((60-30*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3 ...
- Python计算器实操
要求: 开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...
- 7_python之路之python计算器
7_python之路之python计算器 1.程序说明:Readme.cmd 1.程序文件及说明: calculator.py 2.python版本:python-3.5.3 3.程序使用:pytho ...
- 作业1开发一个简单的python计算器
开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...
- 老男孩python作业5-开发一个简单的python计算器
开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...
- project1_calculator(使用tkinter实现python计算器,含有具体过程与注释)
最终的运行效果图(程序见序号7): #!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------- ...
- Github Python计算器开源项目 二次开发--增加函数图形
先上原项目链接:https://github.com/xhf79/Calculator_pyqt python+Qt 开发的计算器 原项目界面和功能如图所示: 科学计算的内容基本都有,但按照项目的提示 ...
- python计算器
思路:优先级处理思路一:正则表达式+递归(计算时间慢)思路二:堆栈的方式队列:先进先出电梯-->队列上电梯(入队123):第三个人3,第二个人2,第一个人1>>> li = [ ...
- 开发一个简单的python计算器
要求: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4* ...
- 初版python计算器
作业: 使用正则表达式实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 先看运行结果: 请输入您的计算式: 1 - 2 * ( (60-30 +(-40.0/5) * ...
随机推荐
- 关于SQL优化(转载,格式有调整)
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
- 遍历json数组实现树
今天小颖在工作中遇到要遍历树得问题了,实现后,怕后期遇到又忘记啦,所以记录下嘻嘻,其实这个和小颖之前写过得一篇文章 json的那些事 中第4点有关json的面试题有些类似. 数组格式: v ...
- 如何在mysql中查询每个分组的前几名
问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition 语句来解决,但在MySQL中就比较麻烦了.这次翻译的文章就是 ...
- 使用sql语句删除数据库中重复的数据
在数据库中有一批数据,但是由于数据入库之前某些不当的操作引入了一些重复的数据,需要将这些重复的数据删除.数据的结构大概是下面的样子 CREATE TABLE [dbo].[aaa]( [id] [in ...
- android分辨率适配
重要概念 什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 什么是dp.dip.dpi.sp.px?他们之间的关系是什么? 什么是mdpi.hdpi.xdpi.xxdpi?如何计算和区分? 在下面的内容中我 ...
- Express 4.x Node.js的Web框架----《转载》
本文使用node.js v0.10.28 + express 4.2.0 1 Express概述 Express 是一个简洁而灵活的node.js的MVC Web应用框架,提供一系列强大特性创建各种W ...
- 单引号、双引号、int和char
首先说一下C语言中用单引号和双引号的不同(一直搞不清楚): 单引号代表的是一个整数,而这个整数的值是编译器所采用的字符集中的字符序列对应的值.所以一般'A'和ASCII中的65意义相同.对于双引号定义 ...
- react封装组织架构递归树
想用react实现一个递归树,但一些框架里面的有些不符合需求,于是自己写了个,功能比较简单,欢迎批评指正.. react实现这样一个组织架构递归树,下级部门的收起和展开,点击部门名称时请求接口获取下级 ...
- uid列表来讲讲我是如何利用php数组进行排重的
经常接到要对网站的会员进行站内信.手机短信.email进行群发信息的通知,用户列表一般由别的同事提供,当中难免会有重复,为了避免重复发送,所以我在进行发送信息前要对他们提供的用户列表进行排重. 假如得 ...
- easyui---easyloader.js
1.easyloader.js 是根据用户指定,动态加载组件,可以替换下面jqueryeasyui <!-- <script type="text/javascript" ...