代码:

 #!/usr/local/env python3
'''
Author:@南非波波
Blog:http://www.cnblogs.com/songqingbo/
E-mail:qingbo.song@gmail.com
''' import time,sys
import module if __name__ == "__main__":
while True:
count = 0
if count < 3:
print('''
请输入一个计算公式,类似下面格式:
=========================================================================================
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
=========================================================================================
系统默认匹配所有的数字、(、)、+、-、/、*、.
计算器程序研发@南非波波
''')
expression = input("请输入:").strip() #或取用户输入的表达式字符串,并去除左右的空格
# expression = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
expression = expression.replace(' ','') #去除字符串中间的空格,使用replace进行空字符串替换空格
if module.num_operator(expression): #成功匹配正确表达式
# print(expression)
result = module.recursion_bracket(expression) #将处理后没有括号的表达式赋值给expression
print(result)
break
else:
count += 1
print("你输入的表达式格式不正确!")
time.sleep(1)
continue
else:
print("你的输入错误次数已达三次,计算器将自动退出!感谢你的使用!")
time.sleep(1)
sys.exit(3)

index.py

 #!/usr/local/env python3
'''
Author:@南非波波
Blog:http://www.cnblogs.com/songqingbo/
E-mail:qingbo.song@gmail.com
''' import re #匹配一个表达式中的数字和运算符,如果匹配,返回expression,否则返回None
def num_operator(expression):
match_list = re.findall("[0-9]|\(|\)|\+|\-|\*|\/|.",expression)
if len(expression) == len(match_list):
return True #特殊字符处理
def charmap(expression):
flag = True
while flag:
if expression.__contains__("++") or expression.__contains__("+-") or expression.__contains__("-+") or expression.__contains__("--"):
# match_str = re.search("\d+\.*\d*(\+\-){1}\d+\.*\d*",expression).group()
expression = expression.replace('+-','-')
expression = expression.replace('++','+')
expression = expression.replace('-+','-')
expression = expression.replace('--','+')
else:
flag = False
return expression
#操作加减
def compute_add_sub(expression):
'''
expression表达式传进来的形式是(5+1-4),左右成一对括号。所以这里需要将括号去掉
'''
expression = expression.lstrip('(').rstrip(')') #去除表达式左右的括号
match_test = re.search("\d+\.*\d*[\+\-]{1}\d+\.*\d*",expression)
if not match_test:
return expression
else:
match_str = match_test.group()
if len(match_str.split('+')) > 1:
num1,num2 = match_str.split("+")
result = float(num1) + float(num2)
else:
num1,num2 = match_str.split("-")
result = float(num1) - float(num2)
exp_join = expression.split(match_str)
expression = "%s%s%s" % (exp_join[0],result,exp_join[1])
return compute_add_sub(expression) #操作乘除
def compute_mul_div(expression):
'''
expression表达式传进来的形式是(9-2*5/3+7/3*99/4*2998+10*568/14),左右成一对的括号。所以这里就需要将括号去掉然后递归处理乘除
'''
expression = expression.lstrip('(').rstrip(')') #去除表达式左右的括号
match_test = re.search("\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*",expression)
if not match_test: #判断是否能够匹配到* 或者 /。
return expression
else:
match_str = match_test.group() #获取到匹配的运算式,比如5/3,2*5
if len(match_str.split("/")) > 1: #计算除法
num1,num2 = match_str.split("/")
result = float(num1) / float(num2)
else: #计算乘法 len(match_str.split("*")) > 1
num1,num2 = match_str.split("*")
result = float(num1) * float(num2)
exp_join = expression.split(match_str)
expression = "%s%s%s" % (exp_join[0],result,exp_join[1])
compute_mul_div(expression) #递归处理
return compute_mul_div(expression) #处理优先级的执行
def compute_pri(expression):
expression = compute_mul_div(expression) #处理乘除
expression = charmap(expression) #处理特殊字符
expression = compute_add_sub(expression) #处理加减
return expression #返回一个值 #递归处理括号
def recursion_bracket(expression):
match_list = re.findall("\(|\)",expression) #匹配括号,如果存在递归处理
if not match_list:
# print(expression)
return compute_pri(expression)
else:
match_str = re.search("\([^()]*\)",expression) #匹配第一次出现的括号对
if match_str:
match_str = match_str.group()
# print("match_str:",match_str)
tmp = compute_pri(match_str)
expression = "%s%s%s" % (expression.split(match_str)[0],tmp,expression.split(match_str)[1]) #字符串拼接
# print("expression:",expression)
return recursion_bracket(expression) #递归处理括号 # expression = "(9-2*5/3+7/3*99/4*2998+10*568/14)"
# res = compute_pri(expression)
# print(res)
#递归处理括号
# def recursion_bracket(expression):
# match_list = re.findall("\(|\)",expression) #匹配括号,如果存在递归处理
# if match_list:
# tmp_list = [] #定义一个列表,存储左括号(
# res = ''
# for i in range(0, len(expression)):
# if expression[i] == "(":
# tmp_list.append(i) #获取括号出现的索引值列表
# print("tmp_list:",tmp_list)
# continue
# if expression[i] == ")" and tmp_list:
# ts = expression[tmp_list[-1]: i+1]
# if len(ts) > len(res):
# # ts = compute_mul_div(ts)
# # print(ts)
# # ts = charmap(ts)
# # ts = compute_add_sub(ts)
# res = ts
# print('i:%s,ts:%s' % (i,ts))
# tmp_list.pop()
# print(tmp_list)
# print("res:",res)
# # return recursion_bracket(res)
#
# else: #匹配括号失败,返回表达式,做后续处理
# expression = compute_mul_div(expression)
# expression = charmap(expression)
# expression = compute_add_sub(expression)

module.py

github代码更新地址:https://github.com/swht/projects/tree/master/day04/计算器

s12-day04-work01 简单计算器功能实现的更多相关文章

  1. java实现简单计算器功能

    童鞋们,是不是有使用计算器的时候,还要进入运行,输入calc,太麻烦了,有时候甚至还忘记单词怎么拼写,呵呵程序员自己写代码实现,又简单,又方便啊 以下为代码(想要生成可执行工具可参考:http://w ...

  2. Android-Kotlin简单计算器功能

    上一篇博客 Android-Kotlin-配置/入门 配置好了 AndroidStudio Kotlin 的环境: 选择包名,然后右键: 选择Class类型,会有class: 创建CounterCla ...

  3. Python之实现简单计算器功能

    一,需求分析 要求计算一串包含数字+-*/()的类似于3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)表达式的数值 二,知识点 正 ...

  4. 简单计算器 安卓 Android 作业

    Android老师布置的课程作业——简单计算器 功能要求实现四则运算,参考界面见下图: 首先给各位老铁提供apk安装包以及项目压缩包,略表诚意~ github地址:https://github.com ...

  5. 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

    #!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...

  6. JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。

    编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...

  7. 【IOS开发笔记03-视图相关】简单计算器的实现

    UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

  8. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  9. javaWeb 使用 jsp 和 javaBean 实现计算器功能

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

随机推荐

  1. tableau学习

    一.维度 度量 1. 连接到新数据源时,Tableau 会将该数据源中的每个字段分配给“数据”窗格的“维度”区域或“度量”区域,具体情况视字段包含的数据类型而定. 例如: 2. tableau中的字段 ...

  2. powerdesigner中物理模型与sql脚本的以及与数据库的连接设置

    使用JDBC连接失败的解决方案: http://blog.csdn.net/t37240/article/details/51595097 使用powerdesigner工具我们可以方便的根据需求分析 ...

  3. (转)javap 指令集

    栈和局部变量操作将常量压入栈的指令aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常量0压入栈iconst_1 将int类型 ...

  4. NOIP模拟赛9

    T1U3348 A2-回文数 https://www.luogu.org/problem/show?pid=U3348 考场上钻了牛角尖了,然后0分 #include<cstdio> #i ...

  5. 「LibreOJ β Round #4」游戏

    https://loj.ac/problem/524 题目描述 qmqmqm和sublinekelzrip要进行一场游戏,其规则是这样的: 首先有一个序列,其中每个位置是一个整数或是X.双方轮流将X的 ...

  6. Bayesian optimisation for smart hyperparameter search

    Bayesian optimisation for smart hyperparameter search Fitting a single classifier does not take long ...

  7. 安装HDP时的报错信息

    1,安装ambari时报错:Bootstrap process timed out. It will be destroyed. 报错原因:/etc/sudoers文件中未设置免密权限 解决办法:ha ...

  8. 【leetcode 简单】 第五十一题 有效电话号码

    给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码. 你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxx ...

  9. flex实例(阮一峰)

    Flex 布局教程:实例篇   作者: 阮一峰 日期: 2015年7月14日 上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法. 你会看到,不管是什么布局,Flex往往都可以几行命令 ...

  10. JavaScript 使用闭包保护变量 防止污染

    使用JavaScript编写插件或团队协作时,可使用闭包来解决此类以下两个问题: 1.定义过多全局变量,可能会造成全局变量命名冲突: 2.在插件内定义变量,需要保护该变量不被轻易修改: 优点:可以把局 ...