A Weingartner
A Weingartner

Reputation: 23

Limiting number of loops in a statement?

I have an assignment for my programming fundamentals class. In this, I have to accept invalid inputs a certain number of times (in this case, five) before the program terminates. The book doesn't seem to explain limiting number of loop runs in this context, so I've included my code for guidance. As written, it continues to loop and doesn't stop.

max = 5
#Input miles to be converted
miles = float(input('Enter the number of miles to convert to kilometers: '))
milesToKms = miles*1.6 #miles to kilometers formula
for counter in range(max):
    if miles >= 0:
        print ('Miles converted: ', miles)
        print ('Kilometers: ', milesToKms) #display kilometers result
        break
    elif miles <0:
        while miles < 0:
            print ('Invalid value entered.')
            miles = float(input('Enter a valid number of miles to convert: '))
else:
    print ('Too many invalid entries submitted.')
    exit ()              

Upvotes: 1

Views: 76

Answers (3)

Patrick Artner
Patrick Artner

Reputation: 51643

Solution to keep calculating until 5 wrong inputs are given:

import sys

invalids = 0
maxWrongInputs = 5

# loop until too many wrongs were done
while invalids < maxWrongInputs:
    miles = float(input('Enter the number of miles to convert to kilometers:'))
    if miles >= 0:
        milesToKms = miles * 1.6 
        print('Miles converted:', miles)
        print('Kilometers:', milesToKms) 
    else:  
        # add another to your counter of invalid attempts
        invalids += 1
        print('Invalid value entered.')
else:
    sys.exit('Exited after {} invalid entries.'.format(invalids))

Input: 3. 4. 5. 6. 7. 8. -1. -1. -1. 4. -1. -1.

Output:

Enter the number of miles to convert to kilometers:3
Miles converted: 3.0
Kilometers: 4.800000000000001
Enter the number of miles to convert to kilometers:4
Miles converted: 4.0
Kilometers: 6.4
Enter the number of miles to convert to kilometers:5
Miles converted: 5.0
Kilometers: 8.0
Enter the number of miles to convert to kilometers:6
Miles converted: 6.0
Kilometers: 9.600000000000001
Enter the number of miles to convert to kilometers:7
Miles converted: 7.0
Kilometers: 11.200000000000001
Enter the number of miles to convert to kilometers:8
Miles converted: 8.0
Kilometers: 12.8
Enter the number of miles to convert to kilometers:-1    # 1.
Invalid value entered.
Enter the number of miles to convert to kilometers:-1    # 2.
Invalid value entered.
Enter the number of miles to convert to kilometers:-1    # 3.
Invalid value entered.
Enter the number of miles to convert to kilometers:4
Miles converted: 4.0
Kilometers: 6.4
Enter the number of miles to convert to kilometers:-1    # 4.
Invalid value entered.
Enter the number of miles to convert to kilometers:-1    # 5.
Invalid value entered.
Exited after 5 invalid entries.

Upvotes: 0

ShadowRanger
ShadowRanger

Reputation: 155403

You don't need or want the while loop here. Your outer for loop limits the number of attempts on its own, and rechecks the condition on each loop, so it does the job all by itself.

I've cleaned it up a bit to remove redundant input code, which also provides the side-benefit of avoiding prompting for input after the final attempt failed, when the loop would stop anyway:

import sys

max = 5
for counter in range(max):
    # Input miles to be converted
    miles = float(input('Enter the number of miles to convert to kilometers:'))
    if miles >= 0:
        # May as well defer calculation of milesToKms until we know
        # the miles value is valid
        milesToKms = miles * 1.6 # miles to kilometers formula
        print('Miles converted:', miles)
        print('Kilometers:', milesToKms) #display kilometers result
        break
    else:  # No need for elif miles < 0; anything not valid is invalid
        print('Invalid value entered.')
else:
    # sys.exit is correct way to exit program, and it can output error for you
    sys.exit('Too many invalid entries submitted.')

Upvotes: 2

user3713719
user3713719

Reputation: 325

your inner while loop is causing the issue:

max = 5
#Input miles to be converted
for counter in range(max):
    miles = float(input('Enter the number of miles to convert to kilometers: '))
    milesToKms = miles*1.6 #miles to kilometers formula
    if miles >= 0:
        print ('Miles converted: ', miles)
        print ('Kilometers: ', milesToKms) #display kilometers result
        break
    elif miles <0:
        print ('Invalid value entered.')

if counter == (max - 1):
    print ('Too many invalid entries submitted.')
    exit ()

Valid output:

Enter the number of miles to convert to kilometers: 10
('Miles converted: ', 10.0)
('Kilometers: ', 16.0)

Invalid output:

Enter the number of miles to convert to kilometers: -1
Invalid value entered.
Enter the number of miles to convert to kilometers: -2
Invalid value entered.
Enter the number of miles to convert to kilometers: -3
Invalid value entered.
Enter the number of miles to convert to kilometers: -4
Invalid value entered.
Enter the number of miles to convert to kilometers: -5
Invalid value entered.
Too many invalid entries submitted.

Upvotes: -1

Related Questions