pythoncalculator

I keep getting this "unrecognized operation" whenever i need to use the "?"


I'm writing a program in Python for a calculator, and I'm trying to implement a history system. However, when I need to access the history, I use the symbol to access it, but it keeps telling me that it is unrecognized.

I used the ? symbol, which is what I set to access the history, and I expected it to accept it and perform the task it was meant to.

However, it just told me that the symbol was unrecognized.

from random import choice

def add(a,b):
  return a+b
  
def subtract(a,b):
  return a-b
  
def multiply (a,b):
  return a*b

def divide(a,b):
  try:
    return a/b
  except Exception as e:
    print(e)
def power(a,b):
  return a**b
  
def remainder(a,b):
  return a%b
  
  
def select_op(choice):
  if (choice == '#'):
    return -1
  elif (choice == '$'):
    return 0
  elif (choice in ('+','-','*','/','^','%')):
    while (True):
      num1s = str(input("Enter first number: "))
      print(num1s)
      if num1s.endswith('$'):
        return 0
      if num1s.endswith('#'):
        return -1
        
      try:
        num1 = float(num1s)
        break
      except:
        print("Not a valid number,please enter again")
        continue
    
    while (True):
      num2s = str(input("Enter second number: "))
      print(num2s)
      if num2s.endswith('$'):
        return 0
      if num2s.endswith('#'):
        return -1
      try:  
        num2 = float(num2s)
        break
      except:
        print("Not a valid number, please enter again")
        continue
    
    def history(num1s, choice, num2s, result):
        his_file = open("calc_his.txt", "a")
        his_file = his_file.write(str(num1) + " " + choice + " " + str(num2) + "=" + result + "\n")
    
    if choice == '?':
        his_file = open("calc_his.txt", "r")
        print(his_file.read())
    
    result = 0.0
    last_calculation = ""
    
    if choice == '+':
      result = add(num1, num2)
      history(num1, choice, num2, str(result))
    elif choice == '-':
      result = subtract(num1, num2)
      history(num1, choice, num2, str(result))
    elif choice == '*':
      result = multiply(num1, num2)
      history(num1, choice, num2, str(result))
    elif choice == '/':
      result =  divide(num1, num2)
      history(num1, choice, num2, str(result))
    elif choice == '^':
      result = power(num1, num2)
      history(num1, choice, num2, str(result))
    elif choice == '%':
      result = remainder(num1, num2)
      history(num1, choice, num2, str(result))
    
    else:
      print("Something Went Wrong")
    
    last_calculation =  "{0} {1} {2} = {3}".format(num1, choice, num2, result) 
    print(last_calculation)
      
    
    
  else:
    print("Unrecognized operation")
    
while True:
  print("Select operation.")
  print("1.Add      : + ")
  print("2.Subtract : - ")
  print("3.Multiply : * ")
  print("4.Divide   : / ")
  print("5.Power    : ^ ")
  print("6.Remainder: % ")
  print("7.Terminate: # ")
  print("8.Reset    : $ ")
  print("8.History  : ? ")
  
  # take input from the user
  choice = input("Enter choice(+,-,*,/,^,%,#,$,?): ")
  print(choice)
  if(select_op(choice) == -1):
    #program ends here
    print("Done. Terminating")
    exit()

Solution

  • The issue is you have placed an if conditional to match '?' character nested inside elif (choice in ('+','-','*','/','^','%')): condition.

    Since this elif conditional doesn't match '?' character, your if choice == '?': conditional is never being hit.

    Place this if choice == '?': conditional outside of elif (choice in ('+','-','*','/','^','%')): condition.

    Solution:

    from random import choice
    
    
    def add(a, b):
        return a + b
    
    
    def subtract(a, b):
        return a - b
    
    
    def multiply(a, b):
        return a * b
    
    
    def divide(a, b):
        try:
            return a / b
        except Exception as e:
            print(e)
    
    
    def power(a, b):
        return a**b
    
    
    def remainder(a, b):
        return a % b
    
    
    def select_op(choice):
        if choice == "#":
            return -1
        elif choice == "$":
            return 0
        elif choice == "?":
            his_file = open("calc_his.txt", "r")
            print("history: ")
            print(his_file.read())
        elif choice in ("+", "-", "*", "/", "^", "%"):
            while True:
                num1s = str(input("Enter first number: "))
                print(num1s)
                if num1s.endswith("$"):
                    return 0
                if num1s.endswith("#"):
                    return -1
    
                try:
                    num1 = float(num1s)
                    break
                except:
                    print("Not a valid number,please enter again")
                    continue
    
            while True:
                num2s = str(input("Enter second number: "))
                print(num2s)
                if num2s.endswith("$"):
                    return 0
                if num2s.endswith("#"):
                    return -1
                try:
                    num2 = float(num2s)
                    break
                except:
                    print("Not a valid number, please enter again")
                    continue
    
            def history(num1s, choice, num2s, result):
                his_file = open("calc_his.txt", "a")
                his_file = his_file.write(
                    str(num1) + " " + choice + " " + str(num2) + "=" + result + "\n"
                )
    
            
    
            result = 0.0
            last_calculation = ""
    
            if choice == "+":
                result = add(num1, num2)
                history(num1, choice, num2, str(result))
            elif choice == "-":
                result = subtract(num1, num2)
                history(num1, choice, num2, str(result))
            elif choice == "*":
                result = multiply(num1, num2)
                history(num1, choice, num2, str(result))
            elif choice == "/":
                result = divide(num1, num2)
                history(num1, choice, num2, str(result))
            elif choice == "^":
                result = power(num1, num2)
                history(num1, choice, num2, str(result))
            elif choice == "%":
                result = remainder(num1, num2)
                history(num1, choice, num2, str(result))
    
            else:
                print("Something Went Wrong")
    
            last_calculation = "{0} {1} {2} = {3}".format(num1, choice, num2, result)
            print(last_calculation)
    
        else:
            print("Unrecognized operation")
    
    
    while True:
        print("Select operation.")
        print("1.Add      : + ")
        print("2.Subtract : - ")
        print("3.Multiply : * ")
        print("4.Divide   : / ")
        print("5.Power    : ^ ")
        print("6.Remainder: % ")
        print("7.Terminate: # ")
        print("8.Reset    : $ ")
        print("8.History  : ? ")
    
        # take input from the user
        choice = input("Enter choice(+,-,*,/,^,%,#,$,?): ")
        print(choice)
        if select_op(choice) == -1:
            # program ends here
            print("Done. Terminating")
            exit()
    

    Result:

    enter image description here