简体   繁体   English

在Python 3.x中结束循环

[英]Ending A Loop in Python 3.x

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. 预先感谢您提供的任何帮助或建议。

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. 如果在x次尝试后输入仍然无效,则您希望程序退出。 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 . 在其他语言中,您可以使用do...while循环实现此功能,但Python仅具有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(): def get_user_input():

added 2 if statements to check if the last attempt left to display warning message and if the run was Successful to exit program 添加了2条if语句,以检查if the last attempt left to display warning message以及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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM