0

I'm trying to get this simple code to only accept integers and numbers from (0,100). I dont want to use a loop to validate my inputs and want them to exit with only "invalid input". I'm stuck with this part because I cant seem to exit without the ("Letter grade: ") part when I dont have a valid input... and the message wont appear when I enter letters.

Here's what I have so far... I'm a beginner so it'll be great if someone could help me:)

def convert_grade_to_letter(number_grade):
    letter_grade = ''


    if number_grade >= 90 and number_grade <= 100:
        letter_grade = 'A'
    elif number_grade >= 80:
        letter_grade = 'B'
    elif number_grade >= 70:
        letter_grade = 'C'
    elif number_grade >= 60:
        letter_grade = 'D'
    elif number_grade < 60 and number_grade >= 0:
        letter_grade = 'F'
    else:
        print("invalid input")
    return letter_grade

def main():
    number_grade = int(input("Input number grade: "))
    letter_grade = convert_grade_to_letter(number_grade)
    print("Letter grade: " + letter_grade)

main()
martineau
  • 119,623
  • 25
  • 170
  • 301
Lilian
  • 3
  • 1

2 Answers2

0

Consider catching the ValueError exception to validate your grades, both for the integer validation and the 0-100 range validation:

try:
    number_grade = int(input("Input number grade: "))
    is_valid = 0 <= number_grade <= 100
    if not is_valid:
        raise ValueError("Number grade is not in the 0-100 range.")

    letter_grade = convert_grade_to_letter(number_grade)
    print("Letter grade: " + letter_grade)

except ValueError:
    print("Could not parse grade")
Pierre
  • 1,068
  • 1
  • 9
  • 13
0

Sanitizing the input in a loop is the way to go. That way you only provide correct data to your functions (always sanitize user input - they are too creative):

def convert_grade_to_letter(number_grade):
    letter_grade = '' 

    if number_grade >= 90:  # not needed: and number_grade <= 100:
        letter_grade = 'A'
    elif number_grade >= 80:
        letter_grade = 'B'
    elif number_grade >= 70:
        letter_grade = 'C'
    elif number_grade >= 60:
        letter_grade = 'D'
    else:  # not needed: - if number_grade < 60 and number_grade >= 0:
        letter_grade = 'F'

    return letter_grade

def main():
    while True:  # loop until the value is between 0 and 100 and a valid int
        try:
            number_grade = int(input("Input number grade: "))
            if 0 < number_grade <= 100:
                 break
        except ValueError:
            print("Invalid Input - 1 to 100 allowed")

    letter_grade = convert_grade_to_letter(number_grade)
    print("Letter grade: " + letter_grade)

main()

If not using a loop is some arbritary restriction, return an indicator that allows your program to check if parsing was successfull:

def convert_grade_to_letter(number_grade):
    letter_grade = ''

    if number_grade >= 90 and number_grade <= 100:
        letter_grade = 'A'
    elif number_grade >= 80:
        letter_grade = 'B'
    elif number_grade >= 70:
        letter_grade = 'C'
    elif number_grade >= 60:
        letter_grade = 'D'
    elif number_grade < 60 and number_grade >= 0:
        letter_grade = 'F'
    else:
        print("invalid input")
        return None  # check for None, only print if not None

    return letter_grade

def main():
    number_grade = int(input("Input number grade: "))
    letter_grade = convert_grade_to_letter(number_grade)

    if letter_grade is not None:
        print("Letter grade: " + letter_grade)

main()
Patrick Artner
  • 50,409
  • 9
  • 43
  • 69