python作业day4计算器
思路:
用循环提取最里面的括号,再进行运算
运算时利用正则表达式寻找相应的运算符
先进行乘除,再进行加减
(参考武sir和金角大王的代码)
流程图:

代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
def cheng_and_chu(arg): #计算乘除
val = arg[0] #把传入的列表中第0个元素赋值给val
mch = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val) #利用正则表达式的查找字符串功能匹配val中的算数符赋值给mch
if not mch: #如果mch中没有乘除
return #结束函数返回这个mch中的值
content = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val).group() #利用正则表达式的查找字符串功能匹配val中的算数符,并使用group获取分组赋值给content
if len(content.split('*'))>1: #将content中的组以*分割,分割后的字符串长度大于1
n1,n2 = content.split('*') #将content中的组以*分割,分割后的两部分分别赋值给n1,n2
value = float(n1) * float(n2) #将n1,n2转换为浮点数,并相乘,结果赋值给value
else:
n1,n2 = content.split('/')
value = float(n1) / float(n2)
qianzhui,houzhui = re.split('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val, 1) #用正则中的分割方法,吧val中的值以\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*分割,并将分割后的值分别赋值给qianzhi,后缀
new_str = "%s%s%s"%(qianzhui,value,houzhui) #将字符串重新格式化拼接
arg[0] = new_str #讲新的字符串复制给arg中的第0个元素
cheng_and_chu(arg) #继续运行乘除函数 def jia_and_jian(arg): #计算加减
while True:
if arg[0].__contains__('+-') or arg[0].__contains__("++") or arg[0].__contains__('-+') or arg[0].__contains__("--"): #如果arg的第0个元素是'+-','--','++','-+'
arg[0] = arg[0].replace('+-','-') #将-替换掉+-
arg[0] = arg[0].replace('++','+') #将+替换掉++
arg[0] = arg[0].replace('-+','-') #将-替换掉-+
arg[0] = arg[0].replace('--','+') #将+替换掉--
else:
break
if arg[0].startswith('-'): #如果arg的第0个元素是以-开头
arg[1] += 1 #arg的第一个元素自加1
arg[0] = arg[0].replace('-','&')
arg[0] = arg[0].replace('+','-')
arg[0] = arg[0].replace('&','+')#将-变+,+变-
arg[0] = arg[0][1:]#将arg中第0个元素中前面多出来的符号去掉
val = arg[0]
mch = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val)
if not mch:
return
content = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val).group()
if len(content.split('+'))>1:
n1, n2 = content.split('+')
value = float(n1) + float(n2)
else:
n1, n2 = content.split('-')
value = float(n1) - float(n2)
before, after = re.split('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val, 1)
new_str = "%s%s%s" % (before,value,after)
arg[0] = new_str
jia_and_jian(arg) def jisuan(sr): #计算函数
new_sr = [sr.strip('()'),0] #将传入的值两边括号去掉,并组成列表赋值给new_sr
cheng_and_chu(new_sr) #调用乘除函数
jia_and_jian(new_sr) #调用加减函数
if divmod(new_sr[1],2)[1] == 1: #将运算后的传回的列表中的第1个元素处于2,除后得到的元组第1个元素等于1的话,
jieguo = float(new_sr[0]) #将运算后传回的列表中的第0个元素转化为浮点型,赋值给jieguo
jieguo = jieguo * -1 #并将jieguo乘-1
else: #如果不等于1
jieguo = float(new_sr[0]) #将运算后传回的列表中的第0个元素转化为浮点型,赋值给jieguo
return jieguo #结束函数返回jieguo def kuohao(sr): #去除括号函数
flag = True #设置一个标志位
while flag:
m = re.search("\([^()]+\)",sr) #找出sr中最里面的括号,赋值给m
if m:
sub_sr = m.group() #截取m中第一个括号
sub_res = jisuan(sub_sr) #调用计算函数,返回值赋值给sub_res
sr = sr.replace(m.group(),str(sub_res)) #将m截取的第一个括号内容替换为转化为str类型的sub_res
else:
print('结果:',jisuan(sr)) #如果没有括号了,打印计算函数返回的结果
flag = False #将标志位设置为False,用于跳出循环 if __name__ == "__main__":
print("----------欢迎使用计算器----------")
while True:
flag = True #设置一个标志位
sr = input("输入要计算的函数(q:退出):") #让用户输入计算函数,赋值给sr
sr = re.sub("\s*","",sr) #在sr中找到所有的空格,删除
error = re.search('[0-9q\*\/\-\+]',sr) #使用正则查找方法,在sr中找到0-9q\*\/\-\+这些字符,赋值给error
while flag:
if not error: #如果error为空
print("输入有误") #打印输入有误
sr = input("请重新输入要计算的函数(q:退出):") #重新让用户输入
else:
if error.group() == 'q': #如果用户输入的是q
exit("感谢使用,再见") #则推出整个程序
kuohao(sr) #用户输入的是计算函数,则调用去除括号函数
flag = False #并将标志位设置为False
计算器
python作业day4计算器的更多相关文章
- python作业模拟计算器开发(第五周)
作业需求: 模拟计算器开发: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...
- Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- 程序设计第三次作业--C++计算器初始部分
面向对象程序设计作业3--C++计算器初始部分 Github 链接:https://github.com/luojingzhao/object-oriented/tree/master/calcula ...
- Python作业第一课
零基础开始学习,最近周边的同学们都在学习,我也来试试,嘿嘿,都写下来,下次不记得了还能来看看~~ Python作业第一课1)登陆,三次输入锁定,下次不允许登陆2)设计一个三级菜单,菜单内容可自行定义, ...
- Python作业-选课系统
目录 Python作业-选课系统 days6作业-选课系统: 1. 程序说明 2. 思路和程序限制 3. 选课系统程序目录结构 4. 测试帐户说明 5. 程序测试过程 title: Python作业- ...
- 第五次程序设计作业 C++计算器雏形 调用文件输入输出
一.C++计算器作业系列链接 第三次作业:C++计算器雏形 第三次作业附加:代码规范 第四次作业:命令行的调用及计算 MyGithub 二.本次作业相关 要求:第五次程序设计作业 根据这一次的作业要求 ...
- python作业ATM(第五周)
作业需求: 额度 15000或自定义. 实现购物商城,买东西加入 购物车,调用信用卡接口结账. 可以提现,手续费5%. 支持多账户登录. 支持账户间转账. 记录每月日常消费流水. 提供还款接口. AT ...
- day4 计算器
作业:计算器开发 (1)实现加减乘除及拓号优先级解析: (2)用户输入 1 - 2 * ( (60-30 +(-40/5) * (-9-2*5/-3 + 7 /3*99/4*2998 +10 * 56 ...
- c++ 第五次作业(计算器第三步)
第五次作业 (计算器第三步) 项目源文件地址:calculator 本次作业改进情况 加入多种读入选择 正常输出答案 -a 选项,输出表达式以及值 -f 选项,从指定文件读入,并把答案输出到指定文件 ...
随机推荐
- 使用jquery插件uploadify上传文件的方法与疑问
我是学生一枚,专业也不是计算机,但又要用到很多相关技术,所以在技术基础不牢靠的情况下,硬着头皮在做.最近在做一个小项目需要上传图片,而且是需要用ajax的方式.但是利用jquery的ajax方法总会有 ...
- JSON数据的基础使用
之前一直把JSON想做一种数据类型,通过这几天的使用,发现其实JSON只是一种数据的格式,而与int string double等等数据类型是有本质的区别. JSON(JavaScript Objec ...
- 程序员都会的 35 个 jQuery 小技巧
收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发. 1. 禁止右键点击 $(document).ready(function(){ $(document).bind("cont ...
- Linux中的读函数与块高速缓存
为了提高Linux块设备读写的效率,Unix会在内存中建立块高速缓存,块高速缓存存储了系统最近读的数据块和刚刚写入的数据块,也就是说IO访问其实是和块高速缓存打交道的(直接IO除外),块高速缓存会适时 ...
- 反调试技术(Delphi版)
1.程序窗口句柄检测原理:用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到就说明有OD在运行//****************************************** ...
- EasyUI两种动态添加tab Iframe页面的方法
/** 动态添加tab-----方式一 **/ function addIframeTab(titleTxt,href,icon) { $('#mytabs').tabs('addIframeTab' ...
- https://pta.patest.cn/pta/test/15/exam/3/question/724
List Reverse( List L ){ if(L==NULL) return; List head=(List)malloc(sizeof(struct Node)); head->Ne ...
- [Leetcode][Python]41: First Missing Positive
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 41: First Missing Positivehttps://oj.le ...
- eclipse下的web开发问题总结[struts2文件上传]
最近需要做一个web方面的文件上传的Demo.开发工具是eclipse[具体名称:Eclipse IDE for Java EE Developers 版本:2.0.0.20130613-0530]. ...
- react-native 自己搭建热更新服务器
使用到的框架是 react-native-update react-native-update-cli 这个应该执行热更新的时候的终端命令. 通过这个,自己搭建一个热更新的服务器.