zoukankan      html  css  js  c++  java
  • 计算器程序编写_python

    一、计算一串字符串的最终值,相当于eval函数功能:

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    #Author:chenxz
    import re
    def check(s):  #检查字符串函数是否合法
        s=s.replace(' ','').strip() #去除空格
        if len(re.findall('(',s)) != len(re.findall(')',s)):#判断括号是否成对
            print("括号不匹配")
            exit()
        if re.search('(([*+/])|([*+-/]))',s): #判断是否含(*/+ 或+-*/) 这种不合法的
            print('格式不正确')
            exit()
        return s
    
    def count_last(sub_str):  #处理n[+-*/]mg格式计算值
        sub_str=re.sub('+-','-',sub_str)  #格式化
        sub_str=re.sub('--', '+', sub_str) #格式化
        if '*' in sub_str:  #计算乘
            sub_list=sub_str.split('*')
            res=str(float(sub_list[0])*float(sub_list[1]))
        elif '/' in sub_str: #计算除
            sub_list=sub_str.split('/')
            res=str(float(sub_list[0])/float(sub_list[1]))
        elif '+' in sub_str: #计算加
            sub_list=sub_str.split('+')
            res=str(float(sub_list[0])+float(sub_list[1]))
        elif '-' in sub_str: #计算减
            sub_list=sub_str.split('-')
            res=str(float(sub_list[0])-float(sub_list[1]))
        return res
    
    def count_mid(cal_str): #处理类似(1+3*5)的字符串中间函数
        cal_str = cal_str[1:-1]  #去除括号
        while re.search('d+.?d{0,}[*/]-?d+.?d{0,}',cal_str):  #循环匹配乘除
            sub_str=re.search('d+.?d{0,}[*/]-?d+.?d{0,}',cal_str).group()
            res=count_last(sub_str)#子函数计算n[*/]m返回对应值
            cal_str=cal_str.replace(sub_str,res)#对应值替代
        while re.search('d+.?d{0,}[+-]-?d+.?d{0,}',cal_str):#循环匹配加减
            sub_str=re.search('d+.?d{0,}[+-]-?d+.?d{0,}',cal_str).group()
            res=count_last(sub_str)#子函数计算n[+-]m返回对应值
            cal_str=cal_str.replace(sub_str,res) #对应值替代
        return cal_str
    
    s= '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    s=check(s) #检查输入的合法性
    while re.search('([^()]+)',s):  #循环将最里面的括号找出来
        cal_str=re.search('([^()]+)',s).group()
        res=count_mid(cal_str)  #最里面的括号和表达式,通过处理函数返回对应值
        s=s.replace(cal_str,res) #对应值替代
    s=count_mid('(%s)'%s)  #去除完括号之后的字符串,加上括号给count_mid函数能自动计算除结果
    print(s)  #2776677.4952380955
  • 相关阅读:
    hdu 思维风暴
    HDU 4183Pahom on Water(网络流之最大流)
    现在仍在工作的12名最“屌”的程序猿
    安卓ContentObserver模式获取短信用正则自己主动填充验证码
    Android插件实例——360 DroidPlugin具体解释
    mysql---union的使用方法
    SICP 习题 (2.11)解题总结:区间乘法的优化
    jQuery中的ajax
    Ajax的简单总结
    jQuery插件开发
  • 原文地址:https://www.cnblogs.com/chenxiaozan/p/12324003.html
Copyright © 2011-2022 走看看