计算器思路


1、要求输入公式

2、检测公式是否包含字母

3、如果包含字母则需要重新输入,否则进行下一步运算

4、检测是否存在括号,如果存在括号,把括号里面的值进行优先级运算,然后赋值到原位,没有则按照优先级运算,取出最后运算结果


流程图


具体代码如下:#!/usr/bin/env python# -*- coding: utf-8 -*-__author__ = 'weibinf'import re   #导入模块def kuohao(self):   #判断是否存在括号    self = list(self)    if self.count(')') != 0 :        for k,v in enumerate(self):            if v == ")":                x = k                a = self[0:k]                q = a.count("(")                qq = 0                for k,v in enumerate(a):                    if v == "(":                        z = k                        qq +=1                        if q == qq :                            b = self[z+1:x]                            c = str(fushu(b))                            del self[z:x+1]                            self.insert(z,c)                            return kuohao(self)    else:        return fushu(self)def fushu(self):#取出所有运算符和相应运算数字    temp = ''    expp = []    self = list(self)    i = 0    for k,v in enumerate(self):        if v == '+' or v == '-' or v == '*' or v == '/':            if k == 0 or self[k-1] == "+" or self[k-1] == "-" or self[k-1] == "*"  or self[k-1] == "/" :                temp += v            else:                expp.append(int(temp))                expp.append(v)                temp = ''        else:            temp += v        if i == len(self) -1 :            expp.append(int(temp))        i +=1    return zhengshu(expp)def get_aob(a, o, b):#运算方式    if o == '+':        return a + b    elif o == '-':        return a - b    elif o == '*':        return a * b    elif o == '/':        return a / bdef zhengshu(exp_list):#运算公式    if len(exp_list) == 1:        return exp_list[0]    else:        q = exp_list.count("*")        w = exp_list.count("/")        if q != 0 or w != 0:            for k,v in enumerate(exp_list):                if v == "*" or v == "/":                    a = exp_list[k - 1]                    o = exp_list[k]                    b = exp_list[k+1]                    del exp_list[k]                    del exp_list[k]                    exp_list[k-1] = get_aob(a, o, b)                    return zhengshu(exp_list)        else:            for k,v in enumerate(exp_list):                if v == "+" or v == "-":                    a = exp_list[k - 1]                    o = exp_list[k]                    b = exp_list[k+1]                    del exp_list[k]                    del exp_list[k]                    exp_list[k-1] = get_aob(a, o, b)                    return zhengshu(exp_list)  #  return zhengshu(exp_list)while True:    calc = raw_input("\033[31m请输入需要计算的公式: \033[0m").replace(' ','').strip()   #获取用户输入    a = re.findall('[a-zA-Z]+',calc) #正则匹配是否存在字母    if not len(calc) == 0 : #判断用户输入是否为空        if len(a) == 0: #判断用户输入字符串是否存在字母            print "\033[31m程序运算结果: \033[0m",kuohao(calc)            print '\033[43;1mpython计算器运算结果:\033[0m',eval(calc)        else:            print "\033[31m没有正确输入,运算字符串包含字母。\033[0m"    else:        print "\033[31m没有正确输入,请重新输入。。。\033[0m"        print "\033[31m-\033[0m" * 50