【问题标题】:Python error calculating programPython错误计算程序
【发布时间】:2011-05-05 04:35:24
【问题描述】:

要求用户输入公司的工资单信息。设置一个循环,继续询问信息,直到他们输入“完成”。为每位员工提出三个问题:

姓名(名字和姓氏) 本周工作时间(仅允许 1 到 60) 小时工资(只允许 6.00 到 20.00) 验证工作时间和小时工资,并确保输入了姓名。

计算每个员工的工资,并将其写入顺序文件。确保包含文件 I/O 错误处理逻辑。

仅包括周薪 每周工资计算: 对于(1-40 小时),它是小时费率 * 工作小时数 对于(41-60 小时),它是(工作小时数 - 40)*(小时费率 * 1.5) + 每小时费率 * 40

在输入所有员工后,将顺序文件读入一个名为 PAY 的列表中,用于每个员工的每周工资。对列表进行排序。现在打印一周的最低、最高和平均每周工资。

我对这段代码有明显的问题

while len(eName)>0:
     eName=raw_input("\nPlease enter the employees' first and last name. ")
     hWork=raw_input("How many hours did they work this week? ")
     hoursWork=int(hWork)
     if hoursWork < 1 or hoursWork > 60:
         print "Employees' can't work less than 1 hour or more than 60 hours!"

     else:
         pRate=raw_input("What is their hourly rate? ")
         payRate=int(pRate)
         if payRate < 6 or payRate > 20:
              print "Employees' wages can't be lower than $6.00 or greater than $20.00!"
         if hoursWork <=40:
              grossPay=hoursWork*payRate
         else:
              grossPay=((hoursWork-40)*(payRate*1.5))+(40*payRate)
         lsthours.append(grossPay)
     print grossPay
     print lsthours



     ePass=raw_input("Type DONE when finished with employees' information. ")
     ePass.upper() == "DONE"
     if ePass == "DONE":
          break
     else:
          continue

【问题讨论】:

  • 这个缩进看起来完全错误。这可能是一个剪切粘贴问题——如果是这样,您需要进行编辑,以使其看起来是您真正编写的方式。否则 Python 不会做你认为它会做的事,
  • 我猜你需要先纠正缩进。当前的缩进表明“ePass = raw_input..”不在 while 循环中。
  • 这是作业吗?这种 UI 在 1980 年很常见,但今天对于已部署的应用程序来说是不可接受的。
  • 是的,这是作业,我被困了大约一个星期,所以我希望能找到一些帮助。自从我们一周前刚开始做以来,我还不太习惯使用函数。我愿意接受任何建议和帮助。我只是对术语不太熟悉,所以请为我简化一下。

标签: python loops


【解决方案1】:

你可以这样做:

grossPay = 0.0
lsthours = []

eName=raw_input("\nPlease enter the employees' first and last name (type 'PASS' to  exit): ") 

while eName.upper() != "PASS":      
   hWork=raw_input("How many hours did they work this week? ") 
   hoursWork=int(hWork)

   if hoursWork < 1 or hoursWork > 60: 
      print "Employees' can't work less than 1 hour or more than 60 hours!" 
   else: 
      pRate=raw_input("What is their hourly rate? ") 
      payRate=int(pRate) 

      if payRate < 6 or payRate > 20: 
         print "Employees' wages can't be lower than $6.00 or greater than $20.00!" 

      if hoursWork <=40: 
         grossPay=hoursWork*payRate 
      else: 
         grossPay=((hoursWork-40)*(payRate*1.5))+(40*payRate) 

      lsthours.append(grossPay) 

      print grossPay 
      print lsthours 

  eName=raw_input("\nPlease enter the employees' first and last name. (type 'PASS' to exit): ")

【讨论】:

  • 我需要在大的里面有 3 个循环。名称循环、小时循环和工资循环,所有这些都需要进入另一个循环,当你输入完成时询问你退出循环并进入下一步。
  • 这没有多大意义,和你发布的代码完全不一样。也许您应该编辑您的问题,以便更准确地告诉我们作业是什么?
  • 我已更新代码以反映您的程序。随意根据您的逻辑编辑代码。
  • 你会使用函数来做同样的事情吗?我对他们不是很熟悉。我还需要写出一个文件并读回一个排序最低、最高和平均的列表。
【解决方案2】:

这段代码有几个问题:

  • 压痕无处不在。例如,while 循环在第一个 if 语句处结束
  • while 循环的测试几乎肯定是假的(因为 eName 没有初始化),所以循环永远不会进入
  • ePass.upper() == "DONE" 处的代码正在尝试设置 ePass 变量,这意味着测试将不起作用。你需要:

    如果 ePass.upper() == “完成”: 打破

【讨论】:

    【解决方案3】:

    已经指出的一些错误:

    在python中,缩进决定代码块

    while 循环:

    while logic_test:
        # this is inside while loop
        ....
    # this is outside while loop
    

    字符串上的某些函数不会替换原字符串,它们通过返回值返回另一个字符串

    上:

    >>> a = "done"
    >>> a.upper()
    'DONE'
    >>> a
    'done'
    >>> 
    

    始终初始化您的变量。

    如果您使用的是序列方法,则该变量应该早先定义为序列。

    >>> t.append('ll')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 't' is not defined
    >>> t = []
    >>> t.append('ll')
    >>> 
    

    明确你的范围

    lsthours = []
    while len(eName)>0:
        ........
        lsthours.append(grossPay)
    

    【讨论】:

      【解决方案4】:

      试试这个:

      lsthours = list()
      eName = "start" # initialize to something to start the loop
      while eName:
          eName = raw_input("\nPlease enter the employees' first and last name. ")
          if not eName:
              break #loop will exit also when blank name is inserted
          hWork = raw_input("How many hours did they work this week? ")
          hoursWork = int(hWork)
          if hoursWork < 1 or hoursWork > 60:
              print "Employees' can't work less than 1 hour or more than 60 hours!"
              continue #skip
      
          pRate = raw_input("What is their hourly rate? ")
          payRate = int(pRate)
          if payRate < 6 or payRate > 20:
              print "Employees' wages can't be lower than $6.00 or greater than $20.00!"
              continue #skip
          if hoursWork <= 40:
              grossPay = hoursWork * payRate
          else:
              grossPay = ((hoursWork - 40) * (payRate * 1.5)) + (40 * payRate)
          lsthours.append(grossPay)
          print grossPay
          print lsthours
          ePass = raw_input("Type DONE when finished with employees' information. ")
          if ePass.upper() == "DONE":
              break
      

      它仍然缺少异常检查,但应该可以工作。

      “数据错误”检查应该只是短路主循环,它更简单,但您可以拥有更多涉及的代码并将它们放入自己的循环中。

      【讨论】:

      • 谢谢你让我非常感激它
      • 如果我想从这里继续读取和写入一个文件会中断它还是会继续我的代码的那部分
      • 如何添加这个:在输入所有员工后,将顺序文件读入一个名为 PAY 的列表中,用于每个员工的每周工资。对列表进行排序。现在打印一周的最低、最高和平均每周工资。
      • break 仅停止 while 循环。在python中,缩进就是一切,所以你可以依靠它来理解工作流程。在这种情况下,break 和 continue 关键字适用于您所处的最内部循环,while eName
      • 对于排序和输出,在写入文件之前进行。对于文件输出,您应该考虑使用csv 包。如果您还需要将员工姓名写入文件,那么您应该将员工姓名也存储在列表lsthours 中,例如lsthours.append([eName, grossPay])。可以通过智能使用列表理解来获得最大值、最小值、总和、平均值等,例如max_wage = max([item[1] for item in lsthours])
      猜你喜欢
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多