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-—计算器的更多相关文章

  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. Git创建新项目

    1. git init 2. git remote add origin 3. git pull origin --allow-unrelated-histories 4. git push orig ...

  2. Python中单线程、多线程和多进程的效率对比实验

    GIL机制导致如下结果: Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)python多线程适合io操作密集型的任务(如sock ...

  3. ubuntu计划任务的编写

    1,首先,我编写的计划任务是在ubunut系统上的.首先我们来认识一下每一个 * 这样子的符号代表什么意思吧! *  *  *  *  * 从左到右: 第1列表示分钟1-59 每分钟用*或者 */1表 ...

  4. python 日期操作【转】

    SQLite中的时间日期函数这是我学习SQLite时做的笔记,参考并翻译了Chris Newman写的<SQLite>中的<Working with Dates and Times& ...

  5. C语言实现哈夫曼编码(最小堆,二叉树)

    // 文件中有通过QT实现的界面#include <stdio.h> #include <stdlib.h> #include <string.h> typedef ...

  6. python javar send

    # -*- coding: utf-8 -*-import jpypeimport os.pathjarpath = os.path.join(os.path.abspath('.'), 'axja' ...

  7. Ubuntu下环境变量的设置

    远程登录时,不是ssh登陆:  xrdp 可以修改并添加 /etc/xrdp/startwm.sh 代码: #!/bin/sh if [ -r /etc/default/locale ]; then  ...

  8. python load mat

    from scipy import io dataset = io.loadmat("a.mat") exclude = ['__globals__', '__header__', ...

  9. laravel的validation 中文 文件

    使用方法: 直接替换resources/lang/en/validation.php中的内容 <?php return [ 'unique' => ':attribute 已存在', 'a ...

  10. bzoj4310

    题解: 后缀数组求出本质不同的串 然后二分答案 贪心判断是否可行 代码: #include<bits/stdc++.h> ; using namespace std; typedef lo ...