尝试制作计算器,但代码不起作用

时间:2020-09-24 05:40:30

标签: python

计算器通过以下算法工作: 您可以在数字和运算之间加一个空格,然后计算出结果。 当我输入此代码时,python表示calset[1]索引超出范围,这没有任何意义。 我该怎么办?

这是我得到的错误:

Traceback (most recent call last):
  File `"D:/pycharm projects/helloworld/calc 2.py"`, line 5, in <module>
    while 

    calset[1] != '**' or '*' or '+' or '-' or '/':
    IndexError: list index out of range"

代码:

cal = input("Calculation Required: ")
calset = cal.split(' ')
y = 0
while calset[1] != '**' or '*' or '+' or '-' or '/':

    if '**' in calset:

        for i in calset:
            if (i == "**"):
                x = calset.index("**")

                y = float(calset[x - 1]) ** float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    elif '/' in calset:

        for i in calset:
            if (i == "/"):
                x = calset.index("/")

                y = float(calset[x - 1]) / float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    elif '*' in calset:

        for i in calset:
            if (i == "*"):
                x = calset.index("*")

                y = float(calset[x - 1]) * float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    elif '+' in calset:

        for i in calset:
            if (i == "+"):
                x = calset.index("+")

                y = float(calset[x - 1]) + float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    elif '-' in calset:

        for i in calset:
            if (i == "-"):
                x = calset.index("-")

                y = float(calset[x - 1]) - float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    else:
        calset.clear()
        cal = input("Calculation Required: ")
        calset = cal.split(' ')
print(calset[0])

3 个答案:

答案 0 :(得分:1)

这是一个简洁的版本,效果很好。它不处理运算符优先级,并且假定输入的格式正确,但是它将计算形式为“ v1 [ v2] ...”的方程式的值:

cal = input("Calculation Required: ")
calset = cal.split(' ')

ops = {
    '**': lambda v1, v2: v1 ** v2,
    '+': lambda v1, v2: v1 + v2,
    '-': lambda v1, v2: v1 - v2,
    '*': lambda v1, v2: v1 * v2,
    '/': lambda v1, v2: v1 / v2,
}

while len(calset) > 2:

    v1 = float(calset[0])
    op = calset[1]
    v2 = float(calset[2])

    if op not in ops:
        raise Exception("Bad Op: " + op)

    calset[0:3] = [ops[op](v1, v2)]

print(calset[0])

样品运行:

Calculation Required: 2 ** 3 + 2 * 5
50.0

答案 1 :(得分:0)

没有涵盖全部情况,例如用户输入两个空格或两个运算符,则需要编写所有可能发生的逻辑检查。 如我所做的很少的更改,以便您可以获取输出并建立更多的高级校准。 在您的溶胶中,删除列表后,删除列表的索引为1 因为您从列表中删除+,/ etc并将新列表分配给只有一个索引0的结果,所以它给您error。尝试使用'in'(not =='**'或'*'或'+'或'-'或'/')

这是更新的代码...

cal = input("Calculation Required: ")

calset = cal.split(' ')
print(calset)
y = 0
lng=len(calset)
index=1
while calset[index] == '**' or '*' or '+' or '-' or '/':

    if '**' in calset:

        for i in calset:
            if (i == "**"):
                x = calset.index("**")

                y = float(calset[x - 1]) ** float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    elif '/' in calset:

        for i in calset:
            if (i == "/"):
                x = calset.index("/")

                y = float(calset[x - 1]) / float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    elif '*' in calset:

        for i in calset:
            if (i == "*"):
                x = calset.index("*")

                y = float(calset[x - 1]) * float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    elif '+' in calset:

        for i in calset:
            if (i == "+"):
                x = calset.index("+")

                y = float(calset[x - 1]) + float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    elif '-' in calset:

        for i in calset:
            if (i == "-"):
                x = calset.index("-")

                y = float(calset[x - 1]) - float(calset[x + 1])
                del calset[x - 1]
                del calset[x - 1]
                del calset[x - 1]
                calset.insert(x - 1, y)

    else:
        calset.clear()
        cal = input("Calculation Required: ")
        calset = cal.split(' ')
    lng=len(calset)
    if lng == 1 :
          index=0
    print(calset)
    print(lng)
print(calset[0])

答案 2 :(得分:0)

我还制作了另一个更简单的计算器


z = float(input('Number: '))

while True:
    operation = input('Operation: ')
    if operation == "clear":
        print(0)
        z = float(input('Number: '))

    elif operation == "p":
       n = float(input('Number: '))
       z = z + n
       print(z)

    elif operation == "m":
        n = float(input('Number: '))
        z = z * n
        print(z)

    elif operation == "d":
        n = float(input('Number: '))
        z = z / n
        print(z)

    elif operation == "s":
        n = float(input('Number: '))
        z = z - n
        print(z)

    elif operation == "e":
        n = float(input('Number: '))
        z = z ** n
        print(z)


    else:
        print('Error: Incorrect Operation')
        z = float(input('Number: '))