计算器思路


1、要求输入公式

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

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

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


流程图


python 简单编写的计算器程序_python 计算器


具体代码如下:

#!/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 / b


def 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