用pathon实现计算器功能
实现计算类似公式的计算器程序
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
一.while循环版本
import re
s='1 - 2 * ( (60-30 +(-40/5 )* (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
s=s.replace(' ','')
while '('in s and ')'in s:
ret1 = re.search('\([^()]+\)', s).group() #用search一个个的找括号里面的公式
while 1:
if '*' in ret1 or '/' in ret1:
e, f = s.split(ret1) #用括号里面的内容将公式切割
# ret1 = ret1.lstrip('(').rstrip(')') #去掉括号的左右俩边"()"
ret2 = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', ret1).group() #用search一个个的找括号里面的公式的乘除法
c,d=ret1.split(ret2) #把括号里面的内容用乘除法切割
if '*' in ret2:
a,b=ret2.split('*') #用符号切割得到两边的数字
ret2=float(a)*float(b) #将字符串转化成浮点数进行运算
ret1=c + str(ret2) + d #把运算结果再转回字符串拼接到括号里面
s=e+ret1+f #把括号拼接到公式里
print(s)
elif '/' in ret2:
a, b = ret2.split('/')
ret2 = float(a) / float(b)
ret1 = c + str(ret2) + d
s=e+ret1+f
print(s)
else:break
if '+' in ret1 or '-' in ret1:
e, f = s.split(ret1) # 用括号里面的内容将公式切割
ret1 = ret1.lstrip('(').rstrip(')') # 去掉括号的左右俩边"()"
if '--' in s:
s = s.replace('--', '+')
if '-+' in s:
s = s.replace('-+', '-')
if '+-' in s:
s = s.replace('+-', '-')
if '++' in s:
s = s.replace('++', '+')
lst = re.findall('[+-]?\d+(?:\.\d+)?',ret1) # 用findall找到所有的加减法,放到列表里
print(lst)
res = sum([float(i) for i in lst])
s=e+str(res)+f
print(s)
while '*' in s or '/' in s: #计算括号外面的乘除法
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',s).group()
a,b=s.split(ret)
if '*' in ret:
c, d = ret.split('*')
ret=float(c)*float(d)
s = a +str(ret) + b
print(s)
elif '/' in ret:
a, b = ret.split('/')
ret= float(c)*float(d)
s = a + str(ret) + b
print(s)
if '--'in s:
s=s.replace('--','+')
if '-+'in s:
s=s.replace('-+','-')
if '+-'in s:
s=s.replace('+-','-')
if '++'in s:
s=s.replace('++','+')
lst=re.findall('[+-]?\d+(?:\.\d+)?',s) #用findall找到所有的加减法,放到列表里
print(lst)
res=sum([float(i) for i in lst])
print(res)
二,函数版本
import re
def mul_div(atom_exp):
'''
计算乘除法的表达式的函数
:param atom_exp: a*b 或者 a/b的表达式
:return: float数据类型的结果
'''
if '*' in atom_exp:
a,b=atom_exp.split('*')
return float(a)*float(b)
elif '/' in atom_exp:
a, b = atom_exp.split('/')
return float(a) / float(b) def add_sub(no_bracket_exp):
'''
接收一个只有加减法的表达式,计算加减法并返回最终结果
:param no_bracket_exp: 只剩加减法的表达式
:return:floatt数据类型的结果
'''
ret_lst=re.findall('[-+]?\d+(?:\.\d+)?',no_bracket_exp)
sum_count=0
for num in ret_lst:
sum_count += float(num)
return sum_count def exp_format(exp):
'''
负责表达式的整理
:param exp: 接收的表达式可能含有 ++ -- +- -+ 等操作
:return: 返回一个没有重叠+-符号的表达式
'''
exp=exp.replace('--','+')
exp = exp.replace('+-', '-')
exp = exp.replace('-+', '-')
exp = exp.replace('++', '+')
return exp
def cal(no_bracket_exp):
'''
负责计算加减乘除
:param no_bracket_exp:一个内部不再有括号的表达式
:return: 最终计算的结果
'''
while 1:
ret=re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',no_bracket_exp)
if ret:
ret_exp=ret.group()
res=str(mul_div(ret_exp))
no_bracket_exp=no_bracket_exp.replace(ret_exp,res)
else:break
no_bracket_exp=exp_format(no_bracket_exp)
sum_count=add_sub(no_bracket_exp)
return sum_count def main(exp):
exp=exp.replace(' ','')
while 1:
ret=re.search('\([^()]+\)',exp)
if ret:
no_bracket_exp=ret.group()
ret=str(cal(no_bracket_exp))
exp=exp.replace(no_bracket_exp,ret)
else:break
return cal(exp) exp = '1 - 2 * ( (60-30 + (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )* (-40/5)) - (-4*3)/ (16-3*2) )'
res=main(exp)
print(res)
用pathon实现计算器功能的更多相关文章
- 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...
- javaWeb 使用 jsp 和 javaBean 实现计算器功能
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- C#实现按键计算器功能
C#实现按键计算器功能 (一次失败的编程) 界面: 代码如下: using System; using System.Collections.Generic; using System.Compone ...
- Python-正则表达式实现计算器功能
需求: 用户输入运算表达式,终端显示计算结果 源代码: # !/usr/bin/env/ python3 # -*- coding: utf-8 -*- """用户输入计 ...
- JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。
编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...
- 利用PYTHON设计计算器功能
通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...
- Python+Tkinter 实现计算器功能
#=================================================================================== import tkinter ...
- python实现简单的计算器功能
如想实现一个计算器的功能,输入格式为字符串,不能运用python里面的内置方法,出去简单的加减乘除,设计一个相对高级的计算器: a = '1 - 2 * ( ( 6 0 -3 0 +(-40/5) * ...
- C++实现计算器功能(包括计算含未知量的式子),输出后缀表达式
大概描述 用c++语言在vc中实现部分数学计算功能.其中实现的数学计算功能包括加减乘除运算.开方计算.自然对数运算.以10为底的对数运算.幂计算.正弦余弦计算. 由用户输入要计算的表达式 ...
随机推荐
- 收缩事务日志(sqlserver)
sqlserver数据库的日志文件其实是由很多个逻辑上的日志文件组成,我们可以通过命令看一下数据库日志文件 可以看到的是sqlserver数据库日志文件是由很多文件组成的,当数据库日志文件已满的时候 ...
- Laravel 开源电商体验与部署
体验 开源项目已经部署了体验环境,开源通过扫描下方小程序码进行体验: 我们部署了 Laravel API demo 环境,访问地址:https://demo-open-admin.ibrand.cc/ ...
- pthread 的几个结构体
http://blog.csdn.net/yangzhongxuan/article/details/7397139 /* Copyright (C) 2002,2003,2004,2005,2006 ...
- 从零开始Vue项目实战(三)-项目结构
目录结构 ├── README.md 项目介绍 ├── index.html 入口页面 ├── build 构建脚本目录 │ ├── build-server.js 运行本地构建服务器,可以访问构建后 ...
- 【转】 ios的手势操作之UIGestureRecognizer浅析
一.概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式: - (void)touchesBegan:(NSSet *)touches withE ...
- P2939 改造路
P2939 [USACO09FEB]改造路Revamping Trails 裸地分层图最短路 培训的时候考到过 但是-- 我考试的时候写了个基本没有的树状数组优化.然后顺利的被卡到了70分(裸的spf ...
- 【洛谷P1118】数字三角形
数字三角形 题目链接 4 16 3 1 2 4 3 1 2 4 (3+1) (1+2) (2+4)(3+1+1+2) (1+2+2+4) (3+1+1+1+2+2+2+4)16=1*3+3*1+3*2 ...
- 【luogu P3369 【模板】普通平衡树(Treap/SBT)】 题解 pb_ds
我永远都爱STL ! 我爱PB_DS ! #include <iostream> #include <cstdio> #include <ext/pb_ds/tree_p ...
- 【题解】洛谷 P1525 关押罪犯
题目 https://www.luogu.org/problemnew/show/P1525 思路 把所有边sort一遍从大到小排列 运用并查集思想敌人的敌人就是朋友 从最大边开始查找连着的两个罪犯 ...
- ORA-01950:对表空间 'USERS' 无权限
在存储数据时出现ORA-01950:对表空间 'USERS' 无权限 错误,解决如下: 找到对象Users下的用户名,然后点编辑,角色权限添加dba 在oracle创建了一个新的表空间和一个新的用户, ...