如何使用列表

时间:2015-10-28 17:50:50

标签: list while-loop

我以前从未编程,我正在尝试做作业。

我必须构建一个更改计算机,在给定输入的情况下将更改为1欧元,例如input = 70change = 30。机器想要在硬币中给出尽可能少的硬币,价值分别为50,20,10,5,2和1美分。因此,如果输入为65,机器将给出:20 10 5。

计算在while循环中运行,该循环运行直到需要的剩余变化为0.在每个循环体中,我必须确定仍然适合所需剩余变化的最大硬币。所有硬币都应添加到列表中。最后,该列表的内容应该显示给用户。

所以,我创建了按钮来开始计算,代码应该看起来像我调用输入money

to compute-change
    Create empty list 
    while [ remaining change > 0] [
        Determine largest coin c, such that remaining change - c >= 0 
        Update the list with the chosen coin 
        Update the remaining change to be determined
    ] 
end

所以,我知道如何创建一个空列表,即[],我知道将会发生什么变化:100-money;我也认为我明白了while的意思,然而,即使遵循报告的框架,我也不知道如何继续。

你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

编辑:如何在NetLogo中执行此操作?

我下载并安装了Netlogo并查看了该语言的工作原理。我创建了一个可以作为开发基础的解决方案(不用担心,我会解释一下):

globals [
 remaining_change
 biggest_coin 
 possible_coins
 returned_coins
]

to compute_change
  set remaining_change 57
  set returned_coins []
  set possible_coins [1 2 5 10 20 50]

  while [ remaining_change > 0 ] [

    foreach possible_coins
    [
      if( remaining_change - ? >= 0 )
      [
        set biggest_coin ?
      ]
    ]

    ;Print next result
    print "Return a coin of value: "
    print biggest_coin
    print "Remaining change: "
    print remaining_change

    ;Append coins to list
    set remaining_change remaining_change - biggest_coin
    set returned_coins lput biggest_coin returned_coins

  ]

  print returned_coins
end

它是如何工作的?

让我们从第一个块开始:

globals [
 remaining_change
 biggest_coin 
 possible_coins
 returned_coins
]

此时,我创建了一些用于数据存储的变量:
remaining_change是需要返回的更改量 biggest_coin是接下来要返回的硬币的值(最大可能值)
possible_coins是所有可用硬币大小的列表 returned_coins是所有退回硬币的列表。

所以,通过这些变量,我们现在可以开始初始化它们了:

set remaining_change 57我们使用57美分的金额作为例子返回 set returned_coins []使用空列表初始化returned_coins(尚未返回任何内容)
set possible_coins [1 2 5 10 20 50]这是我们的硬币类型列表。升序很重要,我们稍后会看到。

让我们做点什么! 我们开始围绕计算进行一次循环,这将继续返回硬币,直到没有更多的变化留下来返回。     而[remaining_change> 0] [     ]

之后,我们需要确定下一个硬币将返回给用户。我们通过用foreach循环检查每个可能的硬币来做到这一点。 基本上,我们接下来要做的是:

  

“让我们看看这个硬币。它是否比我们需要的更少或更平等   返回?是?那么这是目前最大的回报。但   那下一个最大的硬币呢?

在代码中说,看起来像这样:

    foreach possible_coins
    [
      if( remaining_change - ? >= 0 )
      [
        set biggest_coin ?
      ]
    ]

不要让自己被?弄糊涂。这只是Netlogos的说法“这是你的foreach循环中当前检查的项目” - 所以它是你当前的硬币值。

让我们告诉用户发生了什么! 这对于您的计算来说不是必需的,但是对于了解最新情况很有帮助。它只是我们为用户计算的一些输出结果。

;Print next result
print "Return a coin of value: "
print biggest_coin
print "Remaining change: "
print remaining_change

最后,退还硬币! 现在是时候退还下一枚硬币了:

set remaining_change remaining_change - biggest_coin首先,将我们的左侧变化量减去我们最大硬币的价值 之后set returned_coins lput biggest_coin returned_coins,将我们的值附加到结果列表中。

你去了!

您已经成功计算了一个硬币列表,您只需print returned_coins

我绝不是NetLogo的专家,但我尝试了这个代码,它运行得很好。还有其他方法可以做到这一点,有些可能更简单,但这段代码将为您提供一个良好的起点。

基本答案:

您基本上需要了解以下概念:

<强>条件

伪代码中的示例:

if( remainingChange >= 50 )
{
    output.append(new FiftyCentCoin());
    remainingChange -= 50;
}
else
{
    ...
}

这里发生了什么? if语句(或略有变化,取决于您的语言) - 也称为条件 - 评估boolean expression。根据结果​​(truefalse),它可以执行一个语句块,基本上使用这个算法:

if (*this is true*)
    *do this*
else
    *do that*

该示例将要返回的更改量与值50(您的最大硬币)进行比较。如果您需要返还这笔金额或更多金额,将从剩余的变更中扣除50美分,并在您的输出中附加新的FiftyCentCoin。

<强>循环

伪代码中的示例:

while ( remainingChange > 0 )
{
     returnACoin();
}

这里发生了什么? while语句是条件的变体,它将评估表达式,并重复一段代码,只要表达式为真 - 使用此算法:

while(*this is true*)
    *do this*

给定示例一次又一次地执行操作returnACoin,直到remainingChange的数量为0。

使用这些基本块可以创建算法: 请注意,我只给了您一个简短的介绍,您仍然应该阅读多个教程以了解您的语言及其语法。 在下文中,您可以找到一些伪代码(因为您没有告诉您使用的语言),您可以将其用作开发的粗略准则:

price = 1.33 //1.33€ as example
sumPaid = 2 //amount of money the user paid 
changeToReturn = sumPaid - price
changeCoins = []

while( changeToReturn > 0 )
{
    if( changeToReturn >= 50 )
    {
        changeCoins[] = 50
        changeToReturn -= 50
    }
    else if( changeToReturn >= 20 )
    {
        changeCoins[] = 20
        changeToReturn -= 20
    }
    ...
}