计算器程序编写_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