day4作业
作业内容:计算器
#!/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作业的更多相关文章
- day4作业模拟实现一个ATM + 购物商城程序
作业需求: 模拟实现一个ATM + 购物商城程序 1.额度 15000或自定义: 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账: 3.可以提现,手续费5%: 4.每月22号出账单,每月10 ...
- day4 作业计算器
作业:计算器开发 (1)实现加减乘除及拓号优先级解析: (2)用户输入 1 - 2 * ( (60-30 +(-40/5) * (-9-2*5/-3 + 7 /3*99/4*2998 +10 * 56 ...
- 老男孩Day4作业:员工信息查询系统
1.作业需求: (1).工信息表程序,实现增删改查操作: (2).可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where ...
- python基础: day4作业计算器
作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - ...
- Day4作业:蛋疼CRM系统
先上流程图,还得27寸4K显示器,画图各种爽: ReadMe: 运行程序前的提示: 1.抱歉,你得装prettytable模块...... 2.还得抱歉,如果shell中运行,最好把字体调得小点,表格 ...
- Python3.5 day4作业:对员工信息文件,实现增删改查操作。
需求: 1.可进行模糊查询,语法至少支持下面3种: 1.select name,age from staff_table where age > 22 2.select * from staf ...
- day4作业之信息表
实在是太low了,终究是自己写的,记录下 #!/usr/bin/env python # coding=utf8 import os, re #这里我把查询这块分为3个函数了,纠结了很久是放一起还是分 ...
- day4作业小代码练习
登录模块: 我们无论上那个网站,经常遇到这样的情况,让我们登录这个网站,流程图如下: 思路: 1.当我们登录网站的时候,我们首先会输入用户名,这个时候,有些网站会提醒我们用户名是否存在,如果我们输入的 ...
- Day4作业及默写
1,写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&q ...
随机推荐
- Qt程序打包成exe可执行文件图文教程(图文并茂,且用到了filepack)
很多Qt爱好者想发布自己的Qt软件,但却发现在其他没有安装Qt SDK的机器上无法运行,这就是本文想要说明的问题.现在网上大部分软件都要发布自己开发的应用程序,都会打包到exe文件中,待安装完exe文 ...
- 《Java4Android视频教程》学习笔记(三)
一:抽象类 接口 1.使用abstract修饰抽象类 抽象函数 2.一个类中有一个或者多个抽象函数,必须定义为抽象类 3.抽象类可以不含有抽象函数 4.抽象类不可以生成对象 tip:如果一个代码在语意 ...
- WebKit的历史项管理
标准定义 关于历史的管理,和HTML页面载入一样,都有其相应的标准.地址例如以下: WhatWG: https://html.spec.whatwg.org/multipage/browsers.ht ...
- log4net日志的配置及简单应用
在程序运行中,往往会出现各种出乎开发人员意料的异常或者错误,所以,记录详细的程序运行日志信息,有利于开发人员和运维人员排查异常信息,提高工作效率.而本菜鸟在大神推荐和指导下使用log4net这一插件工 ...
- 深入解读JavaScript面向对象编程实践
面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式,主要包括模块化.多态.和封装几种技术.对JavaScript而言,其核心是支持面向对象的,同时它也提供了强大灵活的基于原型的面向对象编程能力 ...
- UVa340 Master-Mind Hints
#include <stdio.h>#include <string.h> #define MIN(a,b) (((a) < (b)) ? (a) : (b)) int ...
- BZOJ 2424: [HAOI2010]订货(最小费用最大流)
最小费用最大流..乱搞即可 ------------------------------------------------------------------------------ #includ ...
- C/C++ 结构体成员在内存中的对齐规则
这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因 ...
- java 去除数组重复数据,并输出重复数据值
/** * 去除重复数据 * @author Sunqinbo */ public class RemoveDuplicateData { public static void main(String ...
- PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?
首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...