python-—计算器
python-练习—计算器
一、要求
传入字符串,计算结果
string='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
二、实现思路
1、先去除字符串内的空格。
2、然后按照括号优先的规则先用正则找出最里层的括号。
3、去除括号后把括号里的内容传入计算的函数。
4、在计算函数内用递归对传入的内容按照先乘除后加减的顺序进行计算和替换,直到得到一个数字。
5、最后把计算的结果返回赋值并对整个字符串进行替换。
6、在把新的字符串传入进行寻找括号的计算。
7、如果已经没有括号了就直接把该字符串传入计算。
8、直到最后如果已经找不到加减乘除这些计算符号,得到的就是最后的结果。
三、流程图
四、实现
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 import re
4 #当加减相叠时使其转换成一个
5 def plus_minus(string):
6 string = string.replace('++','+')
7 string = string.replace('--','+')
8 string = string.replace('-+','-')
9 string = string.replace('+-','-')
10 return string
11
12 #运算函数
13 def count(result):
14 result = plus_minus(result) #调用plus_minus函数,去除想叠的加减
15 if re.search('\d+\.?\d*[\+\-\*\/]\d+\.?\d*',result): #如果匹配到有+-*/,进入下面的if
16 if re.search("[\/\*]",result): #先判断是否有乘除,有则先进入计算乘除
17 #该正则意思为匹配:两个相乘或相除的整数或浮点数
18 ss=re.search('(\d+\.?\d*)[\*\/]([\+\-]*\d+\.?\d*)',result).group()
19 if re.search("\*",ss): #如果匹配的是相乘
20 a=re.split("\*",ss) #以*分隔开
21 a1=float(a[0])*float(a[1]) #取出两个数相乘
22 result=result.replace(ss,str(a1)) #把计算好的结果替换到result里
23 return count(result) #把新的result传入count函数继续计算
24 if re.search("\/",ss): #如果匹配的是相除
25 a=re.split("\/",ss) #以/分隔开
26 a1=float(a[0])/float(a[1]) #取出两个数相除
27 result=result.replace(ss,str(a1)) #同上
28 return count(result)
29 else: #如果没有匹配到乘除,则进入计算加减
30 if re.search("[\+\-]",result): #先判断是否有加减
31 ss=re.search('(\d+\.?\d*)[\+\-]([\+\-]*\d+\.?\d*)',result).group()
32 if re.search("\+",ss): #如果匹配的是相加
33 a=re.split("\+",ss) #以+分隔开
34 a1=float(a[0])+float(a[1]) #取出两个数相加
35 result=result.replace(ss,str(a1)) #把计算好的结果替换到result里
36 return count(result)
37 if re.search("\-",ss): #如果匹配的是相减
38 a=re.split("\-",ss) #以-分隔开
39 a1=float(a[0])-float(a[1]) #取出两个数相减
40 result=result.replace(ss,str(a1)) #同上
41 return count(result)
42 else:
43 return result
44
45 #取值替换
46 def inin(string):
47 string = plus_minus(string)
48 if re.search('\(([\+\-\*\/]*\d+\.*\d*)+\)',string): #如果该字符串能匹配括号
49 result=re.search('\(([\+\-\*\/]*\d+\.*\d*)+\)',string).group() #取出最里面的括号
50 print(result)
51 result1=result.strip("\(\)") #除去括号
52 aa=count(result1) #把除去括号的结果传入count函数
53 cc=string.replace(result,aa) #把函数返回的计算结果替换到string
54 print(cc)
55 else: #如果没有匹配到括号
56 return count(string) #直接把string传入count函数
57 return inin(cc) #把新的string字符串传入count
58
59 #程序开始
60 if __name__ == '__main__':
61 print('1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )')
62 string=input("请输入表达式:")
63 string = re.sub('\s*','',string) #除空格
64 string_result=inin(string) #把string传入inin函数,并把返回的结果赋值给string_result
65 print(string_result) #输出结果
改进版,加了**和//
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 import re
4 #当加减相叠时使其转换成一个
5 def plus_minus(string):
6 string = string.replace('++','+')
7 string = string.replace('--','+')
8 string = string.replace('-+','-')
9 string = string.replace('+-','-')
10 return string
11
12 #加减乘除运算函数
13 def count(result):
14 result = plus_minus(result) #调用plus_minus函数,去除想叠的加减
15
16 result=count_add(result) #运算幂次等其他算法
17 if re.search('\d+\.?\d*[\+\-\*\/]\d+\.?\d*',result): #如果匹配到有+-*/,进入下面的if
18 if re.search("[\/\*]",result): #先判断是否有乘除,有则先进入计算乘除
19 #该正则意思为匹配:两个相乘或相除的整数或浮点数
20 ss=re.search('(\d+\.?\d*)[\*\/]([\+\-]*\d+\.?\d*)',result).group()
21 if re.search("\*",ss): #如果匹配的是相乘
22 a=re.split("\*",ss) #以*分隔开
23 a1=float(a[0])*float(a[1]) #取出两个数相乘
24 result=result.replace(ss,str(a1)) #把计算好的结果替换到result里
25 return count(result) #把新的result传入count函数继续计算
26 if re.search("\/",ss): #如果匹配的是相除
27 a=re.split("\/",ss) #以/分隔开
28 a1=float(a[0])/float(a[1]) #取出两个数相除
29 result=result.replace(ss,str(a1)) #同上
30 return count(result)
31 else: #如果没有匹配到乘除,则进入计算加减
32 if re.search("[\+\-]",result): #先判断是否有加减
33 ss=re.search('(\d+\.?\d*)[\+\-]([\+\-]*\d+\.?\d*)',result).group()
34 if re.search("\+",ss): #如果匹配的是相加
35 a=re.split("\+",ss) #以+分隔开
36 a1=float(a[0])+float(a[1]) #取出两个数相加
37 result=result.replace(ss,str(a1)) #把计算好的结果替换到result里
38 return count(result)
39 if re.search("\-",ss): #如果匹配的是相减
40 a=re.split("\-",ss) #以-分隔开
41 a1=float(a[0])-float(a[1]) #取出两个数相减
42 result=result.replace(ss,str(a1)) #同上
43 return count(result)
44 else:
45 return result
46
47 def count_add(result):
48 result = plus_minus(result)
49 if re.search('\d+\.?\d*\*\*\d+\.?\d*',result) or re.search('\d+\.?\d*\/\/\d+\.?\d*',result):
50 if re.search('\d+\.?\d*\*\*\d+\.?\d*',result):
51 ss=re.search('\d+\.?\d*\*\*\d+\.?\d*',result).group()
52 a=re.split("\*\*",ss)
53 a1=float(a[0])**float(a[1])
54 result=result.replace(ss,str(a1))
55 return count_add(result)
56 if re.search('\d+\.?\d*\/\/\d+\.?\d*',result):
57 ss=re.search('\d+\.?\d*\/\/\d+\.?\d*',result).group()
58 a=re.split("\/\/",ss)
59 a1=float(a[0])//float(a[1])
60 result=result.replace(ss,str(a1))
61 return count_add(result)
62 else:
63 return result
64
65 #取值替换
66 def inin(string):
67 string = plus_minus(string)
68 if re.search('\(([\+\-\*\/]*\d+\.*\d*)+\)',string): #如果该字符串能匹配括号
69 result=re.search('\(([\+\-\*\/]*\d+\.*\d*)+\)',string).group() #取出最里面的括号
70 print(result)
71 result1=result.strip("\(\)") #除去括号
72 aa=count(result1) #把除去括号的结果传入count函数,运算加减乘除
73 cc=string.replace(result,aa) #把函数返回的计算结果替换到string
74 print(cc)
75 else: #如果没有匹配到括号
76 return count(string) #直接把string传入count函数
77 return inin(cc) #把新的string字符串传入count
78
79 #程序开始
80 if __name__ == '__main__':
81 print('1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )')
82 string=input("请输入表达式:")
83 string = re.sub('\s*','',string) #除空格
84 string_result=inin(string) #把string传入inin函数,并把返回的结果赋值给string_result
85 print(string_result) #输出结果
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) * ...
随机推荐
- Python特点
用一种方法,最好只用一种方法来做一件事 1.面向对象(解决一个问题,先考虑由“谁”来做,怎么做是“谁”的职责) 函数.模块.数字.字符串都是对象 在Python中一切皆对象 完全支持继承.重载.多重继 ...
- 廖雪峰网站:学习python函数—递归函数(四)
# 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数 # 计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: # fact ...
- spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient区别
在使用服务发现的时候有两种注解, 一种为@EnableDiscoveryClient, 一种为@EnableEurekaClient, 用法上基本一致,下文是从stackoverflow上面找到的对这 ...
- MySQL_插入更新 ON DUPLICATE KEY UPDATE
平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件. 此时 插入数据的时候 ,经常会有这样的情况: 我们想向数据库插入一条记录: 若数据表中存在以 ...
- 解决maven 找不到指定路径应该如何
如果打开每个项目都有红x!!!解决办法: 1) 2)-->点击clean ,ok!!
- 线程池 execute 和 submit 的区别
代码示例: public class ThreadPool_Test { public static void main(String[] args) throws InterruptedExcept ...
- 解决QPainter::drawText修改文字方向
今天在绘制双坐标曲线的时候需要修改y轴文字提示 QPainter的drawText()函数提供了绘制文本的功能. 它有几种重载形式,我们使用了其中的一种,即制定文本的坐标然后绘制 正常我们的文字书写方 ...
- Linux下使用systemctl命令
systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 ...
- mac nginx+php-fpm配置(安装过后nginx后访问php文件下载,访问php文件请求200显示空白页面)
访问php文件下载是因为没配置php-fpm 两个问题主要都是nginx.conf配置的问题: /usr/local/etc/nginx/nginx.conf server { listen 8 ...
- C++解析四-友员函数、内联函数、静态成员
友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员.尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数.友元可以是一个函 ...