繁体   English   中英

在Python 3.x中结束循环

[英]Ending A Loop in Python 3.x

我正在尝试编写的程序的简要说明。 它旨在根据用户输入的初始速度和初始轨迹角来计算炮弹的轨迹。 在程序退出之前,用户有三次尝试输入有效的输入。 如果成功,它将询问用户他们想要计算什么(飞行时间,最大高度或最大水平范围)。 然后,程序将显示计算出的答案以及达到用户任何选择的最大身高所需的时间。

这两个问题可以在代码的注释中找到...

# 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')

预先感谢您提供的任何帮助或建议。

正如前面的评论所提到的,您的代码示例既太长,又无法按编写的方式进行再现。 因此,我将为您提供更笼统的答案,您可以将其用于修改代码。

用更抽象,可重用的术语重述您的问题。 您具有需要用户输入的功能。 您想使用以下方法进行验证:如果输入有效,则希望程序继续。 如果输入无效,则要警告用户并重复。 如果在x次尝试后输入仍然无效,则您希望程序退出。 这是一个常见的场景,可以使用几种编程习惯或模式。 这是一个简单的例子。

首先,将输入请求,输入验证和程序代码分离为单独的功能。 这样,您可以更轻松地组织和实现您的意图。

其次,在需要检查条件的任何时候使用循环和半码模式 ,然后在条件为假时继续循环。 在其他语言中,您可以使用do...while循环实现此功能,但Python仅具有while

这是示例代码。

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():

添加了2条if语句,以检查if the last attempt left to display warning message以及if the run was Successful to exit program

请参阅###说明注释

# 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