作业内容:计算器
 #!/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. Qt限制文本框输入的方法(使用QRegExpValidator,为QLineEdit所独有)

    在做界面编程的时候,对文本框的处理往往是个很头疼的事情,一是焦点进入文本框时,从人性化考虑,应选择文本框中文本,方便输入:二是,限制文本框的输入,只允许输入有效的文本,如果不这样做的话,那么就需要在程 ...

  2. 使用 PyQt 转换网页到 PDF(使用QtWebKit加载完毕后,打印整个窗口就行了,真简单!)

    import sys try: from PyQt4 import QtWebKit from PyQt4.QtCore import QUrl from PyQt4.QtGui import QAp ...

  3. smarty如何处理状态值的显示

    比如状态,有效或者无效.这个数据库中保存的是1或者2这样的字段. 显示在列表的时候不能是1或者2吧. 以前,我都是在后台foreach,处理的.感觉处理之后,前台就不灵活了.这个值就被替换成了文字. ...

  4. Asp.net MVC中关于@Html标签的使用

    @Html帮助器简单说明,记录些基本的跟HTML中对应的@html帮助器,@Html基本包含了html中的表单控件和常用Html 在@Html中,带有For的主要是针对强类型的Html类型. 用于说明 ...

  5. ANDROID自己定义视图——onLayout源代码 流程 思路具体解释

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 在自己定义view的时候.事实上非常easy.仅仅须要知道3步骤: 1.測量- ...

  6. CentOS下成功挂载xxxxxDVDx.iso并使用yum安装软件

    CentOS下成功挂载xxxxxDVDx.iso并使用yum安装软件 **不断尝试,终能到达彼岸** 测试环境为Win7 32位,VirtualBOx4.2.16+CentOS6.5,可分别到virt ...

  7. 【Java】 实现一个简单文件浏览器(1)

    学习Java的Swing的时候写的一个超简单文件浏览器 效果如图: 项目结构: 这里面主要用了两个控件,JTree和JTable 下面先说下左侧的文件树如何实现: 首先是FileTree类,继承于JT ...

  8. BZOJ 2724: [Violet 6]蒲公英( 分块 )

    虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...

  9. C++对象模型5--多继承下的对象模型

    C++对象模型中加入多继承 从单继承可以知道,派生类中只是扩充了基类的虚函数表.如果是多继承的话,又是如何扩充的? 1)        每个基类都有自己的虚表. 2)        子类的成员函数被放 ...

  10. Qt socket中怎么传结构体?

    直接发送和接收结构体,例如:struct A {...};struct A objectA; 发送的时候: tcpSocket->write((char *)&objectA, size ...