我以前从未编程,我正在尝试做作业。
我必须构建一个更改计算机,在给定输入的情况下将更改为1欧元,例如input = 70
,change = 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
的意思,然而,即使遵循报告的框架,我也不知道如何继续。
你能帮助我吗?
答案 0 :(得分:0)
我下载并安装了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。根据结果(true
或false
),它可以执行一个语句块,基本上使用这个算法:
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
}
...
}