# 开发一个简单的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-计算器实现的更多相关文章

  1. python 计算器的(正则匹配+递归)

    经过2天的长时间的战斗,python计算器终于完成了. import re val="1-2*((60-30*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3 ...

  2. Python计算器实操

    要求: 开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...

  3. 7_python之路之python计算器

    7_python之路之python计算器 1.程序说明:Readme.cmd 1.程序文件及说明: calculator.py 2.python版本:python-3.5.3 3.程序使用:pytho ...

  4. 作业1开发一个简单的python计算器

    开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...

  5. 老男孩python作业5-开发一个简单的python计算器

    开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...

  6. project1_calculator(使用tkinter实现python计算器,含有具体过程与注释)

    最终的运行效果图(程序见序号7): #!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------- ...

  7. Github Python计算器开源项目 二次开发--增加函数图形

    先上原项目链接:https://github.com/xhf79/Calculator_pyqt python+Qt 开发的计算器 原项目界面和功能如图所示: 科学计算的内容基本都有,但按照项目的提示 ...

  8. python计算器

    思路:优先级处理思路一:正则表达式+递归(计算时间慢)思路二:堆栈的方式队列:先进先出电梯-->队列上电梯(入队123):第三个人3,第二个人2,第一个人1>>> li = [ ...

  9. 开发一个简单的python计算器

    要求: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4* ...

  10. 初版python计算器

    作业: 使用正则表达式实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 先看运行结果: 请输入您的计算式: 1 - 2 * ( (60-30 +(-40.0/5) * ...

随机推荐

  1. 原生js--异步请求

    1.异步请求的方法: iframe.script.XMLHttpRequest.comet(服务器端发起) 2.XMLHttpRequest request = new XMLHttpRequest( ...

  2. ubuntu安装vncserver实现图形化访问

    请注意: 如果在安装中部分软件无法安装成功,说明软件源中缺包,先尝试使用命令#apt-get update更新软件源后尝试安装.如果还是不行,需要更换软件源.更换步骤: a)输入命令#cp /etc/ ...

  3. Artech的MVC4框架学习——第七章Action的执行

    概况:Action的执行不仅包含action方法的执行,还包含相关筛选器的执行. 第一基于线程池的请求,http请求称谓工作线程(p321),基于线程池优势:工作线程重用和工作线程数量的限制. 第二两 ...

  4. 关于servlet3.0中的异步servlet

    刚看了一下维基百科上的介绍,servlet3.0是2009年随着JavaEE6.0发布的: 到现在已经有六七年的时间了,在我第一次接触java的时候(2011年),servlet3.0就已经出现很久了 ...

  5. g++编译器的使用

    关于g++ g++  是GNU组织开发出的编译器软件集合(GCC)下的一个C++编译器.它是Unix 和 Linux  系统下标配的 基于命令行的 C++编译器.如果你的系统是Windows,可以按照 ...

  6. mysql的sql优化

    https://dev.mysql.com/doc/refman/8.0/en/statement-optimization.html 8.2 Optimizing SQL Statements 8. ...

  7. JAVA基础知识点转载

    JAVA部分: 1.Java 指定线程执行顺序(三种方式) 转载link:https://blog.csdn.net/difffate/article/details/63684290 2.jdk7中 ...

  8. Solve Error: 'has incomplete type', foward declaration of 'class x'

    在C++的OOB编程中,有时候我们会遇到这样的错误Error: 'has incomplete type',forward declaration of 'class x',那么是什么原因引起的这个问 ...

  9. 对crf++的template的理解 ©seven_clear

    这是以前的一篇草稿,当初没写完,今天发出来,但总觉得水平有限,越学越觉得自己菜,写的博客水准低,发完这篇以后就谨慎发博了,毕竟自己菜,不能老吹B,下面是原稿. 好久没更了,本来年前想写篇关于爬虫的总结 ...

  10. PHP中有丰富的运算符集,它们中大部分直接来自于C语言

    PHP中有丰富的运算符集,它们中大部分直接来自于C语言.按照不同功能区分,运算符可以分为:算术运算符.字符串运算符.赋值运算符.位运算符.条件运算符,以及逻辑运算符等.当各种运算符在同一个表达式中时, ...