计算器程序编写_python
2024-09-02 11:46:12
一、计算一串字符串的最终值,相当于eval函数功能:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
#Author:chenxz
import re
def check(s): #检查字符串函数是否合法
s=s.replace(' ','').strip() #去除空格
if len(re.findall('\(',s)) != len(re.findall('\)',s)):#判断括号是否成对
print("括号不匹配")
exit()
if re.search('(\([*+/])|([*+\-/]\))',s): #判断是否含(*/+ 或+-*/) 这种不合法的
print('格式不正确')
exit()
return s def count_last(sub_str): #处理n[+-*/]mg格式计算值
sub_str=re.sub('\+-','-',sub_str) #格式化
sub_str=re.sub('--', '+', sub_str) #格式化
if '*' in sub_str: #计算乘
sub_list=sub_str.split('*')
res=str(float(sub_list[0])*float(sub_list[1]))
elif '/' in sub_str: #计算除
sub_list=sub_str.split('/')
res=str(float(sub_list[0])/float(sub_list[1]))
elif '+' in sub_str: #计算加
sub_list=sub_str.split('+')
res=str(float(sub_list[0])+float(sub_list[1]))
elif '-' in sub_str: #计算减
sub_list=sub_str.split('-')
res=str(float(sub_list[0])-float(sub_list[1]))
return res def count_mid(cal_str): #处理类似(1+3*5)的字符串中间函数
cal_str = cal_str[1:-1] #去除括号
while re.search('\d+\.?\d{0,}[*/]-?\d+\.?\d{0,}',cal_str): #循环匹配乘除
sub_str=re.search('\d+\.?\d{0,}[*/]-?\d+\.?\d{0,}',cal_str).group()
res=count_last(sub_str)#子函数计算n[*/]m返回对应值
cal_str=cal_str.replace(sub_str,res)#对应值替代
while re.search('\d+\.?\d{0,}[+\-]-?\d+\.?\d{0,}',cal_str):#循环匹配加减
sub_str=re.search('\d+\.?\d{0,}[+\-]-?\d+\.?\d{0,}',cal_str).group()
res=count_last(sub_str)#子函数计算n[+-]m返回对应值
cal_str=cal_str.replace(sub_str,res) #对应值替代
return cal_str 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=check(s) #检查输入的合法性
while re.search('\([^()]+\)',s): #循环将最里面的括号找出来
cal_str=re.search('\([^()]+\)',s).group()
res=count_mid(cal_str) #最里面的括号和表达式,通过处理函数返回对应值
s=s.replace(cal_str,res) #对应值替代
s=count_mid('(%s)'%s) #去除完括号之后的字符串,加上括号给count_mid函数能自动计算除结果
print(s) #2776677.4952380955
最新文章
- css实现了hover显示title的效果
- CSS3的高级特性
- Support Vector Machine (2) : Sequential Minimal Optimization
- 更新整理本人所有博文中提供的代码与工具(C++,2013.10)
- C++之路进阶——codevs2933(诗人小G)
- js setInterval
- ABBYY如何使用电子邮件发送OCR结果
- Halcon标定步骤
- virtualbox 打不开ubuntu解决
- SQL Server 外键约束的例子
- Android之修改部分字体颜色
- 初入angular4——实际项目搭建总结
- HTML (Hyper Text Markup Language) 常用标签
- interface接口
- Linux发行版 CentOS6.5下的分区操作
- freemarker报错之十三
- 2018.11.04 NOIP训练 小水塘(并查集)
- python笔记03:使用字符串
- Hadoop整理五(基于Hadoop的数据仓库Hive)
- 721. Accounts Merge合并电子邮件账户
热门文章
- 浅析word2vec(一)
- Oracle导出警告&;ldquo;EXP-00003: 未找到段 (0,0) 的存储定义&;rdquo;解决
- 【转】Makefile步步为营
- java Reflection(反射)基础知识讲解
- JSP开发机票预定系统 源码
- Golang模块之HTTP
- Linux物理磁盘扩容流程
- Protobuf用法
- 基于java开发jsp+ssm+mysql实现的在线考试系统 源码下载
- jsonArray jsonString list<;Object>; 之间转换