2015-02-05 8 views
0

을 검증하는 것은 그래서, 내 작업은 입력 ISBN 10 자리의 각각에 대한 사용자의 입력을 확인하는 것입니다. 나는 1) 사용자 입력이 공백이 아니고, 2) 사용자 입력이 단지 정수인지 (3) 한 항목 만 입력했는지 확인해야한다.ISBN 검사기 - 사용자 입력

죄송합니다,이에 대한 몇 가지 비슷한 질문을 봐 왔지만, 나는 시도-을 제외하고 문을 계속하고 싶어 (가능한 경우) 그래서 비슷한 질문도 도움이되지 않았다.

가 어떻게 빈 입력에 대해 단 하나의 숫자가 입력되었는지 검증에 대해 갈 수 ? 당신은 자신과 사용자의 삶을 열심히하고 있습니다 - - 여기에 사용자가 일거에 ISBN을 입력 할 수있는 간단한 구현

print("You will be asked to enter an ISBN-10 Number. Please enter it digit by digit.") 
ISBN10NumberList = [] 
ISBN10NumberAdder = 0 
for count in range (10): 
    validInput1 = True 
    if (count <= 8): 
    while validInput1 != False: 
     try: 
     ISBN10NumberList.append(int(input("Please enter the ISBN digit: "))) 
     validInput1 = False 
     except ValueError: 
     print("That is not a valid input! Please enter a integer only.") 


    elif (count == 9): 
     CheckDigit10 = input("Please enter the ISBN digit: ") 
     print("") 
     if CheckDigit10 == "X" or CheckDigit10 == "x": 
      CheckDigit10 = 10 

for count in range (0, 9): 
    ISBN10NumberAdder += int(ISBN10NumberList[count]) * (10 - count) 

CheckDigit10 = int(CheckDigit10) 
CheckingCheckDigit = 11-(ISBN10NumberAdder % 11) 

if (CheckDigit10 == CheckingCheckDigit): 
    print("This is a valid ISBN!") 
else: 
    print("This is not a valid ISBN!") 
+3

숫자를 자릿수로 입력 하시겠습니까? 어떤 패턴 이죠, Sadism 프로그래밍? –

+0

하하하, 좋은 지적이야. – electricbl00

+0

Ignacio는 뛰어난 점을 가지고 있습니다. 왜 전체 입력을 (문자열로) 가져오고, char을 통해 char을 반복하여 온 전성 검사를하고, 마지막에 유효성 검사를 수행할까요? – MattDMo

답변

1

그래서 예는 다음과 같습니다

는 코드입니다. 나는 일을 조금 청소기 메인 루프에서

을 만드는 기능에 몇 가지를 고려 그들이 올바른 일

def verify_check(isbn_str): 
    last = isbn_str[-1] # Last character 
    if last == 'X': 
     check = 10 
    else: 
     check = int(last) 
    # This part was fine in your original: 
    adder = 0 
    for count in range(9): 
     adder += int(isbn_str[count]) * (10 - count) 
    if adder % 11 != check: 
     raise ValueError("Checksum failed") 

def verify_isbn10(isbn_str): 
    if len(isbn_str) != 10: 
     raise ValueError("ISBN must be 10 digits long") 

    # Check that the first nine chars are digits 
    for char in isbn_str[:-1]: 
     if not char.isdigit(): 
      raise ValueError("ISBN must contain digits or X") 

    # Special case for the last char 
    if not (isbn_str[-1].isdigit or isbn_str[-1] == "X"): 
     raise ValueError("ISBN must contain digits or X") 
    verify_check(isbn_str) 


# Main code: 
while 1: 
    try: 
     isbn_str = raw_input("Enter ISBN: ") 
     verify_isbn(isbn_str) 
     break 
    except ValueError as e: 
     print "Whoops:", e 
# At this point, isbn_str contains a valid ISBN 

사용하려는 경우가 케빈를 입력 할 때까지, 사용자는 반복적으로 ISBN를 입력하라는 메시지가 표시됩니다 제안과 regexes에서 손을보십시오, 당신은 다음과 같은 대체를 사용할 수 있습니다 verify_isbn10. 정확히 무엇이 잘못되었는지 사용자에게 설명하지는 않습니다.

import re 
isbn_re = re.compile(r""" 
    ^ #Start of string 
    [0-9]{9} # Match exactly 9 digits 
    [0-9X]  # Match a digit or X for the check digit 
    $   # Match end of string 
    """, re.VERBOSE) 

def verify_isbn10(isbn_str): 
    m = isbn_re.match(isbn_str) 
    if m is None: #User didn't enter a valid ISBN 
     raise ValueError("Not a valid ISBN") 
    verify_check(isbn_str)