Python学习笔记(三)

/*

结合面向对象实现一个基本的计算器,可以计算一个表达式

*/

class Object():
    pass

def CreateSymbol(char):
    c = Object()
    c.type = 'syb'
    c.content = char
    return c

def CreateNumber(number):
    n = Object()
    n.type = 'num'
    n.content = float(number)
    return n

def Loop():
    while True :

        expression = input("请输入一套表达式   ")
        expression = CheckExpression(expression) #整理一下,似乎没必要

        re = Calculator(expression)
        print("结果是 :"+str(re))

        print('')
    return

def CheckExpression(expression):
    expression = expression.replace("(","(")
    expression = expression.replace(")",")")
    return expression


def Calculator(expression):
    #scan and simplify it
    list = []

    stackBalance =0
    countNumber = False
    newExpression = ''
    #add data to list
    for s in expression:
        if s == '(' :                           #如果是左括号
            if stackBalance >0 :
                newExpression +=s
            stackBalance += 1
        elif s== ')':                           #如果右括号,判断是否和最左边一层匹配完毕,匹配后提取括号内容,然后计算表达式,并压入当前计算表达式中
            stackBalance -= 1
            if stackBalance == 0 :
                num = CreateNumber(Calculator(newExpression))
                list.append(num)
                newExpression = ''
            else:
                newExpression +=s
        elif s == '+' or s=='-' or s=='*' or s=='/' :  #如果是计算符号,则压入表达式中
            if stackBalance > 0 :
                 newExpression +=s
            else :
                if countNumber == True :
                    countNumber = False
                    num = CreateNumber(newExpression)       
                    list.append(num)
                    newExpression=''
                syb = CreateSymbol(s)
                list.append(syb)
        else :                                         #如果是数字,则将接下来的数字记录,直到遇到其他计算符号(没有考虑表达式错误的情况)
            if stackBalance >0 :
                newExpression +=s
            else:
                countNumber = True
                newExpression += s

    if countNumber == True :
        num = CreateNumber(newExpression)  
        list.append(num)
    result = CalculateList(list)
    return result

#1+2*3/4-5
def CalculateList(list):
    if len(list) == 1 :
        return list[0].content
    result = 0.0
    index=-1
    for i in range(len(list)) :
        #如果表达式中有*或者/
        if (list[i].type == 'syb' and list[i].content == '*') or (list[i].type == 'syb' and list[i].content == '/') :
            index=i
            break
    
    #有乘除符号
    if index >-1 :
        number1 = list[index-1].content
        number2 = list[index+1].content
        if list[index].content == '*' :
            number1 = number1 * number2
        else:
            number1 = number1 / number2
        
        list[index-1].content = number1

        del(list[index])
        del(list[index])

        if(len(list) == 1 ):
            result = number1
        else:
            result = CalculateList(list)
    #只有加减
    else:
        number1 = list[0].content
        number2 = list[2].content

        if list[1].content == '+' :
            number1 = number1+number2
        else:
            number1 = number1-number2

        list[0].content = number1

        del(list[1])
        del(list[1])

        if(len(list) ==1 ):
            result = number1
        else:
            result = CalculateList(list)
    
    return result

Loop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值