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
  • 相关阅读:
    autocomplete
    ORM组件 ELinq (一)首航之旅
    ORM组件 ELinq 系列
    Jet 驱动对CRUD的支持
    ORM组件 ELinq 更新日志
    年度开源力作ORM组件 ELinq诞生了
    Excel 连接字符串详解
    国内开源ORM组件 ELinq正式版发布
    Firebird 问题总结
    ORM组件 ELinq (二) 映射配置之Table
  • 原文地址:https://www.cnblogs.com/chenxiaozan/p/12324003.html
Copyright © 2011-2022 走看看