思路:

用循环提取最里面的括号,再进行运算

运算时利用正则表达式寻找相应的运算符

先进行乘除,再进行加减

(参考武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计算器的更多相关文章

  1. python作业模拟计算器开发(第五周)

    作业需求: 模拟计算器开发: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...

  2. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  3. 程序设计第三次作业--C++计算器初始部分

    面向对象程序设计作业3--C++计算器初始部分 Github 链接:https://github.com/luojingzhao/object-oriented/tree/master/calcula ...

  4. Python作业第一课

    零基础开始学习,最近周边的同学们都在学习,我也来试试,嘿嘿,都写下来,下次不记得了还能来看看~~ Python作业第一课1)登陆,三次输入锁定,下次不允许登陆2)设计一个三级菜单,菜单内容可自行定义, ...

  5. Python作业-选课系统

    目录 Python作业-选课系统 days6作业-选课系统: 1. 程序说明 2. 思路和程序限制 3. 选课系统程序目录结构 4. 测试帐户说明 5. 程序测试过程 title: Python作业- ...

  6. 第五次程序设计作业 C++计算器雏形 调用文件输入输出

    一.C++计算器作业系列链接 第三次作业:C++计算器雏形 第三次作业附加:代码规范 第四次作业:命令行的调用及计算 MyGithub 二.本次作业相关 要求:第五次程序设计作业 根据这一次的作业要求 ...

  7. python作业ATM(第五周)

    作业需求: 额度 15000或自定义. 实现购物商城,买东西加入 购物车,调用信用卡接口结账. 可以提现,手续费5%. 支持多账户登录. 支持账户间转账. 记录每月日常消费流水. 提供还款接口. AT ...

  8. day4 计算器

    作业:计算器开发 (1)实现加减乘除及拓号优先级解析: (2)用户输入 1 - 2 * ( (60-30 +(-40/5) * (-9-2*5/-3 + 7 /3*99/4*2998 +10 * 56 ...

  9. c++ 第五次作业(计算器第三步)

    第五次作业 (计算器第三步) 项目源文件地址:calculator 本次作业改进情况 加入多种读入选择 正常输出答案 -a 选项,输出表达式以及值 -f 选项,从指定文件读入,并把答案输出到指定文件 ...

随机推荐

  1. Spring:启动项目时加载数据库数据(总结)

    在项目中需要启动程序时,要将数据库的用户信息表加载到内存中,找到一下几种方式. 1.实现ApplicationListener接口,重写onApplicationEvent方法,可以在项目启动的时候执 ...

  2. XAMPP下重置mysql密码

    安装XAMPP后,mysql默认是没有密码的,安全起见一般我们都会修改密码. 密码太多,经常会忘记密码,那么,我们可以通过通过以下步骤可以重置mysql密码. 步骤如下: 1. 停止mysql 2.  ...

  3. 当each遇上list 的一些困惑

    在看手册函数的时候,看到each,如下: array each ( array &$array ) 返回数组中当前的键/值对并将数组指针向前移动一步 在执行 each() 之后,数组指针将停留 ...

  4. python GUI学习——Tkinter

    支持python的常见GUI工具包: Tkinter 使用Tk平台 很容易得到 半标准 wxpython 基于wxWindows.跨平台越来越流行 Python Win 只能在Windows上使用 使 ...

  5. Max Num---hdu2071

    Max Num Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  6. zabbix 组信息

    mysql> select * from groups; +---------+------------------+----------+-------+ | groupid | name | ...

  7. MFC子窗口和父窗口(SetParent,SetOwner)

    一.概念和区别 在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表.系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口.这个数据结构中有四个数据用来构建list, ...

  8. hdu2574 Hdu Girls' Day (分解质因数)

    Hdu Girls' Day Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. Java替代C语言的可能性

        前不久CSDN刊登了一篇<C语言已经死了>的文章,引起了一些争论.事实上那篇文章是从Ed Burnette的博客上转载来的,原文题目是“Die, C, die!”,直译过来应该是& ...

  10. 安装Discuz!论坛时提示“mysqli_connect() 不支持 advice_mysqli_connect”

    安装Discuz!论坛时提示“不支持Mysql数据库,无法安装论坛”的解决方法1,在系统的 system32(C:\windows\system32)目录下缺少libmysql.dll文件,解决方法是 ...