1

我正在尝试设置一个while循环,询问用户员工姓名、工作时间和小时工资,直到用户输入“完成”。最终,我将修改代码以计算每周工资并将其写入列表,但一次只做一件事。问题是一旦主while循环执行一次,它就会停止。不会出错,只是停止。我必须杀死程序才能让它停止。我希望它一次又一次地问这三个问题,直到用户完成。想法?

请注意,这只是一个练习,并不适用于任何现实世界的应用程序。

def getName(): 
    """Asks for the employee's full name"""
    firstName=raw_input("\nWhat is your first name? ")
    lastName=raw_input("\nWhat is your last name? ")
    fullName=firstName.title() + " " + lastName.title()
    return fullName

def getHours():
    """Asks for the number of hours the employee worked"""
    hoursWorked=0 
    while int(hoursWorked)<1 or int(hoursWorked) > 60: 
        hoursWorked=raw_input("\nHow many hours did the employee work: ")
        if int(hoursWorked)<1 or int(hoursWorked) > 60:
            print "Please enter an integer between 1 and 60."
        else:
            return hoursWorked

def getWage():
    """Asks for the employee's hourly wage"""
    wage=0 
    while float(wage)<6.00 or float(wage)>20.00: 
        wage=raw_input("\nWhat is the employee's hourly wage: ")
        if float(wage)<6.00 or float(wage)>20.00:
            print ("Please enter an hourly wage between $6.00 and $20.00")
        else:
            return wage


##sentry variables
employeeName=""
employeeHours=0
employeeWage=0
booleanDone=False

#Enter employee info
print "Please enter payroll information for an employee or enter 'DONE' to quit."

while booleanDone==False:
    while employeeName=="":
        employeeName=getName() 
        if employeeName.lower()=="done":
            booleanDone=True
            break
        print "The employee's name is", employeeName

    while employeeHours==0:
        employeeHours=getHours() 
        if employeeHours.lower()=="done":
            booleanDone=True
            break
        print employeeName, "worked", employeeHours, "this week."

    while employeeWage==0:
        employeeWage=getWage() 
        if employeeWage.lower()=="done":
            booleanDone=True
            break
        print employeeName + "'s hourly wage is $" + employeeWage
4

2 回答 2

3

问题是在第一个循环之后,employeeName其他变量已经有了值,所以你的内部 while 循环将被跳过。这会导致外循环无限重复而不做任何事情。

我只想删除内部的 while 循环:您并不真正需要它们,因为您已经在内部getHours和其他函数中进行了验证。另一种选择是在外部 while 循环开始时重置变量值。

还有一些需要改进的地方(与此错误无关):

  • getHoursandgetWage中,您可以只使用while True而不是现在的条件。如果条件为假,那么无论如何您都已经从函数中返回了。

  • 如果输入了非数字数据,您需要ValueError输入getHoursand 。getWage

  • 代替booleanDone==False, 使用not booleanDone. 尽管如果您按照我的建议删除内部循环,您甚至不需要这个布尔值:只需在需要时跳出循环即可。

于 2010-04-07T18:07:37.250 回答
1

getHoursgetWage假设输入分别为intfloat格式。所以...lower()=="done"永远不可能满足检查:如果用户done在提示符下输入了这些函数中的任何一个,程序就会因ValueError异常而死。但这是一个不同的错误。

在外循环的第一段结束时,我们知道三个字符串都不是空的(内循环保证这一点)。然后,这些字符串不会被重置——所以它们仍然不是空的——所以在外循环的每一个未来分支上,内循环都不会再次执行。这应该会导致无限快速空循环而不是干净退出(即不清楚为什么我刚刚描述的明显错误的症状与您的观察不同),因此可能还有更多错误 - 但是当有两个很容易发现时这段小代码中的杀手错误我认为停止挖掘更明智(发现另外几个有什么用?-)。

您应该重构结构,使函数的作用非常清晰和精确:这些函数究竟返回什么?如果是字符串,这些字符串的约束是什么?似乎他们粗略地返回“此条目的有效字符串”(如果用户在工资或小时数中有拼写错误,则可能会杀死所有程序,您可以使用try/来避免except) - 第一个,并且只有那个,可以返回done(但是它应该在提示中明确说明,如果用户done对第一个提示说,则避免第二个无用的提示)。一旦你这样记录它们,就会清楚内部的 while 循环是没有根据的。外循环可能只是

while True:
    employeeName=getName() 
    if employeeName.lower()=="done":
        break
    print "The employee's name is", employeeName

    employeeHours=getHours() 
    print employeeName, "worked", employeeHours, "this week."

    employeeWage=getWage() 
    print employeeName + "'s hourly wage is $" + employeeWage
于 2010-04-07T18:14:02.600 回答