修复范围内嵌套循环

时间:2012-05-16 06:35:15

标签: python variables loops range nested

我在运行这个程序时遇到了问题,这是凌晨2点左右,所以我真的只想把它解决掉。无论如何,我需要创建一个程序,其中计算并显示数周(由用户输入)的捐赠总额和平均值。该程序使用嵌套循环来收集数据并计算平均值。

它的工作方式是:

  • 该程序要求提供周数
  • 外部循环每周迭代一次
  • 内循环每周迭代5次
  • 内循环的每次迭代都会询问用户捐赠金额
  • 在所有迭代之后,显示捐赠总额和每周捐赠的平均值

我在创建此程序时遇到三个主要问题。首先是我的循环嵌套不能按照我想要的方式工作。

weeks = input("How many weeks available for collection? ")

for donation_week in range(0, weeks):
    for donation_day in range(0, donation_week*5):
        amount = input("How much money was donated today? ")
        break

week_total = amount * 5
collection_total = week_total * weeks
average = collection_total / weeks

print "In", weeks, "weeks, a sum of", collection_total, "was collected and an average"\
                   " of", average, "was donated each week"

例如,如果用户输入3周,我希望该计划每周获得5次,所以15次。但它没有,而只是要求两次金额。

第二个问题是当用户输入1周或0周时,会出现错误状态 “NameError:名称'金额'未定义”

最后一个问题是我在编码中还没有涉及的问题,如果用户每天输入不同的金额,我将如何计算周的总数(week_total)。我实际上只将量作为一个变量,一周5天有5个量变量。

同样,我对python很新,我的指导指南实际上并没有触及这些细节。我一直在尝试重新安排和改变这个程序两个小时左右,我现在仍然很困难。希望有人在这里分享他们的知识。非常感谢。

2 个答案:

答案 0 :(得分:2)

首先,break语句导致内循环提前终止。

其次,您必须计算循环内的运行总计(或至少将值保留在某处)。目前,您每次迭代都会覆盖amount

最后,week_totalcollection_total逻辑看起来很可疑。只需保留每日金额的运行总和,最后除以每周平均值的周数。

答案 1 :(得分:0)

一次回答一个问题:

  

例如,如果用户输入3周,我希望该计划每周获得5次,所以15次。但它没有,而只是要求两次金额。

如上所述,因为你的休息,只需摆脱它,它会不止一次。

  

第二个问题是,当用户输入1周或0周时,会发生错误,其中指出" NameError:name' amount'未定义"

好吧,让我们用一周的时间来追踪它:

for donation_week in range(0,1): #range(0,1) == [0]
    for donation_day in range(0, 0*5): #during the first (and only) loop, donation_day is 0, so do no loops

因此,当它越过循环时,设置amount的行永远不会执行,因此未定义数量。尝试在程序顶部将其定义为0,以避免出现此问题。

另外,第二个声明没有理由in range(0, donation_week*5),如果你想让它每周要求5个话,那就完全错了。如果你想要它,它应该只是in range(5)(如果没有明确设置开始,也假设0)所以它将每周做5次循环。你拥有它的方式,第一周会问0次,第二周会问5次,第3次等等。

  

最后一个问题是我实际上还没有在编码中触及过这个问题,如果用户每天输入不同的金额,我将如何计算周的总数(week_total)。我实际上只将量作为一个变量,一周5天有5个量变量。

如果你这样做,以便在程序顶部定义金额为0,你可以在每次获得时将输入添加到金额。它不会记录每天捐赠的金额,但如果您只想要总计和平均值,它就能完美运行。

因此,如果您在程序顶部发起金额,并将amount = input行更改为amount += input以跟踪运行总计(也可能会删除week_total和collection_total,我不会#39;看到它已经用完了)并像我提到的那样在你的for循环中修复逻辑,你应该是金色的。