简体   繁体   中英

Python Napier Calculator Issue

So, I've been working at this for hours and hours, this is a homework assignment and I just can't figure out why the code doesn't execute completely. I provided all the code to see if there was something I missed outside of the 'assign2' function. However, I know the issue is down there and want to figure out what's wrong.

I'm essentially trying to take the number that is generated last and turn it back into letters representative of Napier arithmetic (ie a = 0, b = 1, c = 2...z = 25) and putting them together in a list that I can print in the main function. Everything else works except for this last part and I'm trying to figure out why.

def main():
  again = "y" 
  while again == "y" or again == "Y":
    var = checkalpha()
    num = assign(var) 
    print("The first number is: {}".format(num)) 
    var2 = checkalpha()
    num2 = assign(var2) 
    print("The second number is: {}".format(num2)) 
    arithmetic = getsign()  
    value = equation(num, num2, arithmetic) 
    newvar = assign2(value)  
    print("The result is {} or {}".format(value, newvar))  
    again = input("Would you like to repeat the program? Enter y for yes, n for no: ") 

def checkalpha():  
  num = input("Enter Napier number: ") 
  while not num.isalpha(): 
    print("Something is wrong. Try again.") 
    num = input("Enter Napier number: ")        
  return num  

def assign(char):
    value = 0
    for ch in char:
        value += 2 ** (ord(ch) - ord("a"))
    return value

def getsign():
operand = input("Enter the desired arithmetic operation: ")
while operand not in "+-*/":
    operand = input("Something is wrong. Try again. ")
return operand

def equation(num, num2, arithmetic):
  if arithmetic == "+":
    answer = num + num2
  elif arithmetic == "-":
    answer = num - num2
  elif arithmetic == "*":
    answer = num * num2
  elif arithmetic == "/":
    answer = num / num2
  else:
    input("Something is wrong. Try again. ")
  return answer

def assign2(n):
  new = []
  while n != 0:
    value = n%2
    x = n//2
    ch = chr(value + ord("a"))
    new.append(ch)
    n = x
  return new

main()

Your function is fairly close. The problem is with ch = chr(value + ord("a")) . We need to encode the bit position into the letter with that position in the alphabet. A letter gets added to the list if the bit in that position is not zero. And at the end of the function we can join the list of letters into a string.

Here's a repaired version of your function, with some test code that verifies that it works on the examples in the Wikipedia article on Location_arithmetic

def assign2(n):
    new = []
    position = 0
    while n != 0:
        value = n % 2
        x = n // 2
        if value:
            ch = chr(position + ord("a"))
            new.append(ch)
        n = x
        position += 1
    return ''.join(new)

# test

data = [
    (87, 'abceg'),
    (3147, 'abdgkl'),
]

for n, napier_string in data:
    s = assign2(n)
    print(n, napier_string, s, napier_string == s)

output

87 abceg abceg True
3147 abdgkl abdgkl True

Here's a more Pythonic version of that function, with a more meaningful name.

def int_to_napier(n):
    new = []
    for position in range(26):
        if n == 0:
            break
        value, n = n % 2, n // 2
        if value:
            new.append(chr(position + ord("a")))
    return ''.join(new)

And here's another one that avoids the character calculation by looping over a string containing the lowercase letters.

from string import ascii_lowercase

def int_to_napier(n):
    new = []
    for ch in ascii_lowercase:
        if n == 0:
            break
        value, n = n % 2, n // 2
        if value:
            new.append(ch)
    return ''.join(new)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM