Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

I’m getting stuck at other steps, can someone help me

Your code so far

def validate_isbn(isbn, length):
    if len(isbn) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return
    main_digits = isbn[0:length]
    given_check_digit = isbn[length]
    main_digits_list = [int(digit) for digit in main_digits]
    
    # Calculate the check digit from other digits
    if length == 10:
        expected_check_digit = calculate_check_digit_10(main_digits_list)
    else:
        expected_check_digit = calculate_check_digit_13(main_digits_list)
    # Check if the given check digit matches with the calculated check digit
    if given_check_digit == expected_check_digit:
        print('Valid ISBN Code.')
    else:
        print('Invalid ISBN Code.')
def calculate_check_digit_10(main_digits_list):
    # Note: You don't have to fully understand the logic in this function.
    digits_sum = 0
    # Multiply each of the first 9 digits by its corresponding weight (10 to 2) and sum up the results
    for index, digit in enumerate(main_digits_list):
        digits_sum += digit * (10 - index)
    # Find the remainder of dividing the sum by 11, then subtract it from 11
    result = 11 - digits_sum % 11
    # The calculation result can range from 1 to 11.
    # If the result is 11, use 0.
    # If the result is 10, use upper case X.
    # Use the value as it is for other numbers.
    if result == 11:
        expected_check_digit = '0'
    elif result == 10:
        expected_check_digit = 'X'
    else:
        expected_check_digit = str(result)
    return expected_check_digit
def calculate_check_digit_13(main_digits_list):
    # Note: You don't have to fully understand the logic in this function.
    digits_sum = 0
    # Multiply each of the first 12 digits by 1 and 3 alternately (starting with 1), and sum up the results
    for index, digit in enumerate(main_digits_list):
        if index % 2 == 0:
            digits_sum += digit * 1
        else:
            digits_sum += digit * 3
    # Find the remainder of dividing the sum by 10, then subtract it from 10
    result = 10 - digits_sum % 10
    # The calculation result can range from 1 to 10.
    # If the result is 10, use 0.
    # Use the value as it is for other numbers.
    if result == 10:
        expected_check_digit = '0'
    else:
        expected_check_digit = str(result)
    return expected_check_digit
def main():
    try:
        user_input = input('Enter ISBN and length: ')
        values = user_input.split(',')
        isbn = values[0]
        length = int(values[1])
        if length == 10 or length == 13:
            validate_isbn(isbn, length)
        else:
            print('Length should be 10 or 13.')
    except IndexError:
        print('Enter comma-separated values.')
    except ValueError:
        print('Length must be a number.')
    
main()

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

you may benefit from seeing how the code runs Python Tutor code visualizer: Visualize code in Python, JavaScript, C, C++, and Java

remember to comment out main() when you run the tests

which tests are failing now?

1 Like

I failed at 8. When the user enters an incorrect ISBN code with characters other than numbers, you should see the message Invalid character was found. in the console.

  • Failed:9. When the user enters 1530051126,10, you should see the message Valid ISBN Code. in the console.

  • Failed:10. When the user enters 9781530051120,13, you should see the message Valid ISBN Code..

  • Failed:11. When the user enters 1530051125,10, you should see the message Invalid ISBN Code..

  • Failed:12. When the user enters 9781530051120,10, you should see the message ISBN-10 code should be 10 digits long..

  • Failed:13. When the user enters 1530051126,13, you should see the message ISBN-13 code should be 13 digits long..

  • Failed:14. When the user enters 15-0051126,10, you should see the message Invalid character was found. and 18. When the user enters 9971502100,10, you should see the message Valid ISBN Code..

  • Failed:19. When the user enters 080442957X,10, you should see the message Valid ISBN Code..

  • Failed:20. When the user enters 9781947172104,13, you should see the message Valid ISBN Code..

try to use the pythontutor site, it can help see where the issue is

I just tried the Python Tutor code visualizer out for the first time. What a great tool! Thanks for sharing this.

can you explain for me what is the given_check_digit

  1. When the user enters an incorrect ISBN code with characters other than numbers, you should see the message Invalid character was found. in the console.

What happens when you test this input?

I was good with that the issue now is printing out 'Valid ISBN Code‘ to the console as when I test with 1530051126,10 it prints the opposite. So Im getting stuck at 9. 19. and 20.

Just focus on one test at a time, so test 9.

What lines of code and generating that output?

Here are some debugging steps you can follow. Focus on one test at a time:

  1. Are there any errors or messages in the console?
  2. What is the requirement of the failing test?
  3. Check the related User Story and ensure it’s followed precisely.
  4. What line of code implements this?
  5. What is the result of the code and does it match the requirement? (Write the value of a variable to the console at that point in the code if needed.)

If this does not help you solve the problem, please reply with answers to these questions.

I know it lies at the given_check_digit variable as when print out the message to the console, it will check if the given_check_digit is equal to the expected_check_digit

I don’t know how to fix that, do you think the given_check_digit is the issue? I also don’t know what does that variable mean

here ‘s my code so far

def validate_isbn(isbn, length):

    if len(isbn) != length:

        print(f'ISBN-{length} code should be {length} digits long.')

        return

    main_digits = isbn\[0:length\]

    given_check_digit = isbn\[length - 1\]#ISSUE HERE

    try:

        main_digits_list = \[int(digit) for digit in main_digits\]

    

    \# Calculate the check digit from other digits

        if length == 10:

            expected_check_digit = calculate_check_digit_10(main_digits_list)

        else:

            expected_check_digit = calculate_check_digit_13(main_digits_list)

        \# Check if the given check digit matches with the calculated check digit

        if given_check_digit == expected_check_digit:

            print('Valid ISBN Code.')

        else:

            print('Invalid ISBN Code.')

    except ValueError:

        print('Invalid character was found.')

def calculate_check_digit_10(main_digits_list):

    \# Note: You don't have to fully understand the logic in this function.

    digits_sum = 0

    \# Multiply each of the first 9 digits by its corresponding weight (10 to 2) and sum up the results

    for index, digit in enumerate(main_digits_list):

        digits_sum += digit \* (10 - index)

    \# Find the remainder of dividing the sum by 11, then subtract it from 11

    result = 11 - digits_sum % 11

    \# The calculation result can range from 1 to 11.

    \# If the result is 11, use 0.

    \# If the result is 10, use upper case X.

    \# Use the value as it is for other numbers.

    if result == 11:

        expected_check_digit = '0'

    elif result == 10:

        expected_check_digit = 'X'

    else:

        expected_check_digit = str(result)

    return expected_check_digit

def calculate_check_digit_13(main_digits_list):

    \# Note: You don't have to fully understand the logic in this function.

    digits_sum = 0

    \# Multiply each of the first 12 digits by 1 and 3 alternately (starting with 1), and sum up the results

    for index, digit in enumerate(main_digits_list):

        if index % 2 == 0:

            digits_sum += digit \* 1

        else:

            digits_sum += digit \* 3

    \# Find the remainder of dividing the sum by 10, then subtract it from 10

    result = 10 - digits_sum % 10

    \# The calculation result can range from 1 to 10.

    \# If the result is 10, use 0.

    \# Use the value as it is for other numbers.

    if result == 10:

        expected_check_digit = '0'

    else:

        expected_check_digit = str(result)

    return expected_check_digit

def main():

    try:

        user_input = input('Enter ISBN and length: ')

        values = user_input.split(',')

        isbn = values\[0\]

        length = int(values\[1\])

        if length == 10 or length == 13:

            validate_isbn(isbn, length)

        else:

            print('Length should be 10 or 13.')

    except IndexError:

        print('Enter comma-separated values.')

    except ValueError:

        print('Length must be a number.')

    except TypeError:

        print('Invalid character was found')

#main()

I’ve edited your post to improve the readability of the code. When you enter a code block into a forum post, please precede it with three backticks to make it easier to read.

You can also use the “preformatted text” tool in the editor (</>) to add the backticks.

See this post to find the backtick on your keyboard.
Note: Backticks (`) are not single quotes (').

I guess you are talking about this line?

        if given_check_digit == expected_check_digit:

Use print() before the if statement to print out those variables and see what they are

Read about the check digit in the instructions.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.