2017-03-08 18 views
0

저는 몇 시간 동안이 작업을 해왔습니다. 숙제 임으로 코드가 완전히 실행되지 않는 이유를 알 수 없습니다. 나는 'assign2'함수 밖에서 놓친 것이 있는지 확인하기 위해 모든 코드를 제공했습니다. 그러나 문제가 저 아래에 있으며 무엇이 잘못되었는지를 알고 싶습니다.Python Napier Calculator 문제

나는 마지막으로 생성 된 숫자를 가지고 Napier arithmetic (즉, a = 0, b = 1, c = 2 ... z = 25) 대표 문자로 바꾸고 그들을 모으려고 노력하고있다. 주 기능에서 인쇄 할 수있는 목록에 있습니다. 이 나머지 부분을 제외하고는 다른 모든 기능이 작동하며 이유를 파악하려고합니다.

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() 
+0

[네이피어 산술] (https://en.wikipedia.org/wiki/Location_arithmetic)입니까? –

+0

예, 정확히 그 것 –

+0

우리는 당신의 전체 프로그램을 볼 필요가 없습니다. 질문 코드는 문제에 초점을 맞춘 [mcve] 여야합니다. 그래서이 경우 우리는'assign2'를위한 코드를 볼 필요가 있습니다. 몇 가지 샘플 입력, 예상 출력, 실제 출력이 있습니다. –

답변

0

귀하의 기능은 매우 비슷합니다. 문제는 ch = chr(value + ord("a"))입니다. 알파벳 위치 비트를 해당 위치의 문자로 인코딩해야합니다. 해당 위치의 비트가 0이 아닌 경우 문자가 목록에 추가됩니다. 그리고 함수가 끝나면 문자 목록을 문자열로 결합 할 수 있습니다. 여기

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) 

출력

87 abceg abceg True 
3147 abdgkl abdgkl True 

에 위키 백과 문서의 예제에서 작동하는지 확인 몇 가지 테스트 코드, 함수의 수정 된 버전입니다 더 의미있는 이름으로 그 함수의 파이썬 버전이 있습니다.

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) 

다음은 소문자가 포함 된 문자열을 반복하여 문자 계산을 피할 수있는 또 다른 방법입니다.

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)