作业内容:计算器
 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import re,time
#加减字符处理函数
def handle_symbol(cal_str):
# if cal_str.__contains__("+-") or cal_str.__contains__("--") or cal_str.__contains__("-+") or cal_str.__contains__("++"):
if "+-" in cal_str or "++" in cal_str or "-+" in cal_str or "--" in cal_str:
cal_str = cal_str.replace("+-","-")
cal_str = cal_str.replace("--","+")
cal_str = cal_str.replace("++","+")
cal_str = cal_str.replace("-+","-")
return handle_symbol(cal_str) #递归替换符号
else:
return cal_str
#递归加减函数
def plus_minus(cal_str):
if cal_str[0] == "+":
cal_str = cal_str[1:]
m = re.search("[\-]?\d+[\.]?\d*[\+\-]\d+[\.]?\d*",cal_str)
if m:
m_str = m.group()
str_list = cal_str.split(m_str)
if len(m_str.split("+")) == 2: #如果长度为2,说明是加法,如果不是,就是减法
num1,num2 = m_str.split("+")
num = float(num1) + float(num2)
elif m_str[0] == '-': #减法中,如果匹配到的字符串第一个字符是-,需要特殊处理
m_str = m_str[1:]
num1,num2 = m_str.split("-")
num = -(float(num1) + float(num2))
else:
num1,num2 = m_str.split("-")
num = float(num1) - float(num2)
cal_str = "%s%s%s"%(str_list[0],num,str_list[1])
return plus_minus(cal_str)
else:
return cal_str
#递归乘除函数
def mul_div(cal_str):
m = re.search("\d+\.*\d*[\*\/][\-]?\d+\.*\d*",cal_str)
if m:
m_str = m.group()
str_list = cal_str.split(m_str)
if len(m_str.split("*")) == 2:
num1,num2 = m_str.split("*")
num = float(num1) * float(num2)
else:
num1,num2 = m_str.split("/")
num = float(num1) / float(num2)
cal_str = "%s%s%s"%(str_list[0],num,str_list[1])
return mul_div(cal_str)
else:
return cal_str
#递归计算函数
def calculate(cal_str):
if "(" in cal_str:
m = re.search("\([^\(\)]+\)",cal_str).group() #取出最里层括号
m2 = m[1:-1] #去括号
m_result = mul_div(m2) #做乘除运算
m_result = plus_minus(m_result) #做加减运算
cal_list = cal_str.split(m)
cal_str = cal_list[0] + str(m_result) + cal_list[1] #把运算结果放回原来字符串中
cal_str = handle_symbol(cal_str)
return calculate(cal_str)
else:
cal_str = mul_div(cal_str)
cal_str = handle_symbol(cal_str)
cal_str = plus_minus(cal_str)
return cal_str def main():
welcome = "欢迎进入简便计算器"
print("%s"%welcome.center(40,"*"))
print("计算器说明:"
"\n1.术式只能包括加减乘除、数字、点和小括号;"
"\n2.请严格按照示例格式输入术式;"
"\n3.示例:(1-2)*(60-30+(-40/5)*(9-2*5/3+12-3))+(5*8/9+(1/2+3))/(1+3)+(5-2/2);"
"\n4.输入q可以退出。")
while True:
cal_str = re.sub(" ",'',input("请输入计算术式:"))
cal_str = handle_symbol(cal_str)
if cal_str == "q":
exit("欢迎下次光临")
# 以下if都是判断格式有没有错误的,还有一些bug暂时没法解决
if re.search("[^0-9\+\-\*\/\(\)\.]",cal_str) or re.match("[\.\*\/]",cal_str) or re.search("\([\+\-\*\/]?\)",cal_str):
print("输入有误,请重新输入")
time.sleep(1)
continue
if "." in cal_str:
if len(re.findall("[0-9]+\.[0-9]+",cal_str)) != cal_str.count("."):
print("输入有误,请重新输入")
time.sleep(1)
continue
if "(" in cal_str or ")" in cal_str:
left = cal_str.count("(")
right = cal_str.count(")")
if left != right:
print("输入有误,请重新输入")
time.sleep(1)
continue
result = calculate(cal_str) #调用计算函数算出结果
print("我的计算结果是:%s"%result)
print("eval正确结果是:%s"%eval(cal_str)) if __name__ == "__main__":
main()

calculate.py

测试环境:windows7下Python3.5.1

程序说明:
1、启动程序会提示欢迎信息并提示计算器用法
2、输入计算术式按回车进行运算,输入q退出程序,如果术式不对会提示错误并返回重新输入
3、术式正确会进行运算并显示计算结果
程序设计思维想法:
1.先检测有没有小括号,如果有小括号就把最里层小括号拿出来进行运算,把运算结果替代原来的小括号位置,然后递归运算直到没有小括号为止
2.如果没有小括号,直接调用乘除函数和加减函数计算得出结果

day4作业的更多相关文章

  1. day4作业模拟实现一个ATM + 购物商城程序

    作业需求: 模拟实现一个ATM + 购物商城程序 1.额度 15000或自定义: 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账: 3.可以提现,手续费5%: 4.每月22号出账单,每月10 ...

  2. day4 作业计算器

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

  3. 老男孩Day4作业:员工信息查询系统

    1.作业需求: (1).工信息表程序,实现增删改查操作: (2).可进行模糊查询,语法至少支持下面3种:          select name,age from staff_table where ...

  4. python基础: day4作业计算器

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

  5. Day4作业:蛋疼CRM系统

    先上流程图,还得27寸4K显示器,画图各种爽: ReadMe: 运行程序前的提示: 1.抱歉,你得装prettytable模块...... 2.还得抱歉,如果shell中运行,最好把字体调得小点,表格 ...

  6. Python3.5 day4作业:对员工信息文件,实现增删改查操作。

    需求: 1.可进行模糊查询,语法至少支持下面3种: 1.select name,age from staff_table where age > 22 2.select  * from staf ...

  7. day4作业之信息表

    实在是太low了,终究是自己写的,记录下 #!/usr/bin/env python # coding=utf8 import os, re #这里我把查询这块分为3个函数了,纠结了很久是放一起还是分 ...

  8. day4作业小代码练习

    登录模块: 我们无论上那个网站,经常遇到这样的情况,让我们登录这个网站,流程图如下: 思路: 1.当我们登录网站的时候,我们首先会输入用户名,这个时候,有些网站会提醒我们用户名是否存在,如果我们输入的 ...

  9. Day4作业及默写

    1,写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&q ...

随机推荐

  1. BASE64URL解析

    BASE64URL是一种在BASE64的基础上编码形成新的加密方式,为了编码能在网络中安全顺畅传输,需要对BASE64进行的编码,特别是互联网中. BASE64URL编码的流程: .明文使用BASE6 ...

  2. D3.js学习记录 - 数据类型【转】【新】

    1.变量 JAVASCRIPT的变量是一种类型宽松的语言.定义变量不用指定数据类型.而且还是动态可变的. var value = 100;value = 99.9999;value = false;v ...

  3. openStack icehouse for centos6.4 production Env 实战

    production Env brief Overview: Management Node:  controller.cc 10.114.100.115 Neutron Network Node:  ...

  4. Oh, my goddess(bfs)

    Oh, my goddess 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Shining Knight is the embodiment of justice ...

  5. linux系统的安装

    安装linux系统须要选择一个linux操作系统,有redhat,ubuntu,centos,这里选择centos进行linux系统的安装 首先在centos的官方站点下载镜像文件CentOS-6.5 ...

  6. js中if的简写方法

    http://transitions1020.com/# 太帅! <script type="text/javascript"> 如果你想写 if (!false) { ...

  7. Android四大组件之Activity详解

    一.Activity的概要说明 我看过Activity的源码,Activity类注释大概是这样解释的:几乎所有的Activity都是与用户交互用的,我想用了一个几乎的意思应该是排除一些纯展示界面吧,因 ...

  8. Robolectric 探索之路

    layout: post title: Roboletric探索之路,从抗拒到依赖 description: Roboletric Android Unit Testing category: blo ...

  9. iOS解析数据判断nil NULL Null的方法

    + (BOOL)isNil:(NSObject*)obj { if (obj == nil || obj == NULL) { return YES; } if ([obj isKindOfClass ...

  10. ZOJ 3430 Detect the Virus(AC自动机)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3430 题意:给你n个编码后的模式串,和m个编码后的主串,求原来主 ...