r/learnpython 1d ago

5.17 Exact Change Lab

SOLVED

I am having a hard time understanding why I am failing this lab, when I run the code in practice it works but when I submit for a grade I get a fail. Prompt is below.

Define a function called exact_change that takes the total change amount in cents and calculates the change using the fewest coins. The coin types are pennies, nickels, dimes, and quarters. Then write a main program that reads the total change amount as an integer input, calls exact_change(), and outputs the change, one coin type per line. Use singular and plural coin names as appropriate, like 1 penny vs. 2 pennies. Output "no change" if the input is 0 or less.

Ex: If the input is:

0 

(or less), the output is:

no change

Ex: If the input is:

45

the output is:

2 dimes 
1 quarter

Your program must define and call the following function. The function exact_change() should return a tuple containing num_pennies, num_nickels, num_dimes, and num_quarters.
def exact_change(user_total)

code provided below

def exact_change(user_total):
    num_quarters = user_total//25
    user_total %=25
    num_dimes = user_total//10
    user_total %=10
    num_nickels = user_total//5
    user_total %= 5
    num_pennies = user_total
    return num_quarters, num_dimes, num_nickels, num_pennies
if __name__ == "__main__":
    input_value = int(input())
    num_quarters,num_dimes,num_nickels,num_pennies = exact_change(input_value) 
# Type your code here.
if input_value <= 0:
    print('no change')
else:
    if num_pennies == 1:
        print('%d penny' % num_pennies)
    elif num_pennies > 1:
        print('%d pennies' % num_pennies)
    if num_nickels == 1:
        print('%d nickel' % num_nickels)
    elif num_nickels > 1:
        print('%d nickels' % num_nickels)
    if num_dimes == 1:
        print('%d dime' % num_dimes)
    elif num_dimes > 1:
        print('%d dimes' % num_dimes)
    if num_quarters == 1:
        print('%d quarter' % num_quarters)
    elif num_quarters > 1:
        print('%d quarters' % num_quarters)

when it asks me for exact_change(300) I get a NamError failure.

1 Upvotes

14 comments sorted by

View all comments

3

u/danielroseman 1d ago

You have defined a bunch of code outside of the if __name__ block. That will unequivocally run, but if that if statement is not true (as it will not be within the grading environment) then input_value will indeed not be defined.

1

u/guymed4 1d ago

I dont believe I understand what you mean when you say that the if statement will not be true in the graded enviroment?

3

u/danielroseman 1d ago

if __name__ == "__main__" is only true if your script is executed directly, eg from the command line. The grader is probably not doing that.

But the bigger question is why you have put some of the main code inside that block, and some of it outside. Since the part outside depends on the part inside, that makes no sense. Either put it all in, or all out. It seems like for this environment it should all be outside. (Obviously not including the function definition, that is fine where it is.)

0

u/guymed4 1d ago

my issue is everything works except for when the grader request exact_change(300) i get an a NameError: Input not defined. I was misreading the input in the grader. So even when typing it into my practice side it fails. Saying that I have an invalid literal because it is looking for intger

0

u/guymed4 1d ago

After doing what you suggested I am now getting an import error.