Reputation: 55
Brief description of my program I am attempting to write. It is designed to calculate the trajectory of a cannon ball based off of user inputs for an initial velocity and an initial trajectory angle. The user has three attempts at entering valid inputs before the program quits. If successful, it will ask the user what they want to calculate (either time of flight, maximum height, or maximum horizontal range). The program will then display the calculated answer along with the time it takes to reach maximum height for any of the user's choices.
The two problems can be found in the comments in the code...
# Constant(s)
GRAV = 9.8
# Accumulator variable(s)
InvalEntry1 = 0
Success = 0
import math
# Defining functions to calculate max height (hMax), total travel time (tTime), and max range (rMax)
def hMax ():
height = ((iVelocity**2) * math.pow(math.sin(math.radians(iTrajectory)), 2)) / (2 * GRAV)
return height
def tTime ():
time = (2* iVelocity * (math.sin(math.radians(iTrajectory)))) / GRAV
return time
def rMax ():
rangeMax = ((iVelocity**2) * math.sin(math.radians(2 * iTrajectory))) / GRAV
return rangeMax
# Assigning user inputs for the initial velocity and initial trajectory to variables
iVelocity = float(input('Please Enter an Initial Velocity Between 20 to 800 m/s: ' ))
iTrajectory = float(input('Please Enter a Initial Trajectory Angle Between 5 to 80 Degrees: '))
print ('\n')
# FIRST PROBLEM... I am having trouble with this loop. If the user enters
# valid numbers on the third attempt, the program will shut down regardless.
# OR if they enter invalid numbers on the third attempt, it will display
# the warning message again, even though they are out of attempts when the
# program should shut down. Lastly, if valid numbers are entered on the
# second attempt, it will continue to the next input function, but will
# still display the warning message.
# Giving the user 3 attempts at providing valid inputs
while (InvalEntry1 < 3):
# Determining if user inputs are valid
if (iVelocity < 20) or (iVelocity > 800) or (iTrajectory < 5) or (iTrajectory > 80):
print ('INVALID ENTRY\n')
InvalEntry1 = InvalEntry1 + 1
iVelocity = float(input('Please Enter an Initial Velocity Between 20 to 800 m/s: ' ))
iTrajectory = float(input('Please Enter a Initial Trajectory Angle Between 5 to 80 Degrees: '))
print ('\n======================================================================')
print ('WARNING!!! You have ONE attempt left to input a correct number for')
print ('initial velocity and initial trajectory before the program will quit.')
print ('======================================================================\n')
else:
# Determining what the user wants to calculate
print ('What would you like the program to calculate?')
uCalculate = int(input('Enter 1 for Max Height, 2 for Time, or 3 for Max Horizontal Range: '))
print ('\n')
# SECOND PROBLEM... after the user successfully inputs the
# correct numbers and the program displays the answers using the
# functions, instead of ending the program, it loops back to
# the else statement above. I can't seem to figure out how to
# close the loop and end the program. I tried using
# while (Success < 1): to close the loop, but it continues to
# loop anyways.
# Determining which variable(s) the user wants the program to calculate
if (uCalculate == 1):
print ('Maximum Height = %.2f' %(hMax()))
print ('Total Time = %.2f' %(tTime()))
Success = Success + 1
elif (uCalculate == 2):
print ('Total Time = %.2f' %(tTime()))
Success = Success + 1
elif (uCalculate == 3):
print ('Maximum Horizontal Range = %.2f' %(rMax()))
print ('Total Flight Time = %.2f' %(tTime()))
Success = Success + 1
else:
print ('INVALID ENTRY')
Thank you in advance for any help or advice you can give.
Upvotes: 1
Views: 186
Reputation: 71
added 2 if statements to check if the last attempt left to display warning message
and if the run was Successful to exit program
please refer to ###
explanation comments
# Constant(s)
GRAV = 9.8
# Accumulator variable(s)
InvalEntry1 = 0
Success = 0
import math
# Defining functions to calculate max height (hMax), total travel time (tTime), and max range (rMax)
def hMax ():
height = ((iVelocity**2) * math.pow(math.sin(math.radians(iTrajectory)), 2)) / (2 * GRAV)
return height
def tTime ():
time = (2* iVelocity * (math.sin(math.radians(iTrajectory)))) / GRAV
return time
def rMax ():
rangeMax = ((iVelocity**2) * math.sin(math.radians(2 * iTrajectory))) / GRAV
return rangeMax
# Assigning user inputs for the initial velocity and initial trajectory to variables
iVelocity = float(input('Please Enter an Initial Velocity Between 20 to 800 m/s: ' ))
iTrajectory = float(input('Please Enter a Initial Trajectory Angle Between 5 to 80 Degrees: '))
print ('\n')
# FIRST PROBLEM... I am having trouble with this loop. If the user enters
# valid numbers on the third attempt, the program will shut down regardless.
# OR if they enter invalid numbers on the third attempt, it will display
# the warning message again, even though they are out of attempts when the
# program should shut down. Lastly, if valid numbers are entered on the
# second attempt, it will continue to the next input function, but will
# still display the warning message.
# Giving the user 3 attempts at providing valid inputs
while (InvalEntry1 < 3):
### adding if statement to check of the next attempt is last:
if InvalEntry1 == 2 :
print ('\n======================================================================')
print ('WARNING!!! You have ONE attempt left to input a correct number for')
print ('initial velocity and initial trajectory before the program will quit.')
print ('======================================================================\n')
# Determining if user inputs are valid
if (iVelocity < 20) or (iVelocity > 800) or (iTrajectory < 5) or (iTrajectory > 80):
print ('INVALID ENTRY\n')
InvalEntry1 = InvalEntry1 + 1
iVelocity = float(input('Please Enter an Initial Velocity Between 20 to 800 m/s: ' ))
iTrajectory = float(input('Please Enter a Initial Trajectory Angle Between 5 to 80 Degrees: '))
else:
# Determining what the user wants to calculate
print ('What would you like the program to calculate?')
uCalculate = int(input('Enter 1 for Max Height, 2 for Time, or 3 for Max Horizontal Range: '))
print ('\n')
# SECOND PROBLEM... after the user successfully inputs the
# correct numbers and the program displays the answers using the
# functions, instead of ending the program, it loops back to
# the else statement above. I can't seem to figure out how to
# close the loop and end the program. I tried using
# while (Success < 1): to close the loop, but it continues to
# loop anyways.
# Determining which variable(s) the user wants the program to calculate
if (uCalculate == 1):
print ('Maximum Height = %.2f' %(hMax()))
print ('Total Time = %.2f' %(tTime()))
Success = Success + 1
elif (uCalculate == 2):
print ('Total Time = %.2f' %(tTime()))
Success = Success + 1
elif (uCalculate == 3):
print ('Maximum Horizontal Range = %.2f' %(rMax()))
print ('Total Flight Time = %.2f' %(tTime()))
Success = Success + 1
else:
print ('INVALID ENTRY')
### i advice to add here InvalEntry1 += 1
#InvalEntry1 = InvalEntry1 + 1
### if success - exit while loop
if Success > 0 :
print ('Goodbye')
break
Upvotes: 0
Reputation: 2225
As the previous comment mentioned, your code sample is both too long and not reproducible as written. So I will give you a more generalized answer that you can then use to modify your code.
To restate your problem in more abstract, reusable terms. You have a function that requires user input. You want to validate using the following: If the input is valid you want the program to continue. If the input is invalid you want to warn the user and repeat. If the input is still invalid after x number of attempts, you want the program to exit. This is a common scenario and there are several programming idioms or patterns that can be used. Here is one simple one.
First, separate your input request, input validation, and program code into separate functions. This way let you more easily organize and implement your intent.
Second, use the loop and a half pattern anytime you need to check a condition, then continue lopping while the condition is false. In other languages you can implement this using a do...while
loop, but Python only has while
.
Here is the sample code.
def get_user_input():
in1 = input("Please enter height")
in2 = input("Please enter weight")
return in1, in2
def validate_user_input(x, y):
try:
# validation code for x
_ = int(x)
except:
return False
try:
# validation code for y
_ = int(y)
except:
return False
# if we get here than all inputs are good
return True
def ask_user():
# Loop and a half pattern
max_tries = 3
val1, val2 = get_user_input()
tries = 1
while validate_user_input(val1, val2) is False:
if tries >= max_tries:
quit("Max tries exceeded")
print("Invalid input. Please try again. You have {} attempts remaining".format(max_tries - tries))
tries += 1
val1, val2 = get_user_input()
# if we get here, input is validated and program can continue
print('Thank You')
if __name__ == '__main__':
ask_user()
def get_user_input():
Upvotes: 1