我想要的是: 从整数1到130,我想打印一些已经在数组中给出的特定整数。 它们是:2 32 44 67 89 111 123,按小到大的顺序存储。
这是我的代码:
|a n myArray|
myArray := #(2 32 44 67 89 111 123).
n := 1.
a := myArray at: n.
1 to: 130 do: [:i|
i = a
ifTrue: [
Transcript show: i; cr.
n := n + 1.
a := myArray at: n.
].
].
除错误消息外,输出非常好。
根据我目前的级别,我不知道为什么出现错误消息。
Q1:为什么会出现错误消息?
Q2:我该如何改进?
更新
我找到了解决此问题的另一种方法:
|myArray|
myArray := #(2 32 44 67 89 111 123).
n := 1.
a := myArray at: n.
1 to: 130 do: [:i|
i = a
ifTrue: [
Transcript show: i; cr.
n := n +1.
n = 8
ifTrue: [n := n - 1].
a := myArray at: n.
].
].
看起来很丑陋。
再次更新:
|a n myArray|
myArray := #(2 32 44 67 89 111 123).
n := 1.
a := myArray at: n.
1 to: 130 do: [:i|
i = a
ifTrue: [
Transcript show: i; cr.
n := n + 1.
(n = 8) ifTrue: [^'Found it!'].
a := myArray at: n.
].
].
答案 0 :(得分:3)
如果单击调试按钮,您将获得可以帮助您了解正在发生的事情的调试器。
您要显示的窗口中的列表是执行堆栈。您尝试执行的代码段标记为UndefinedObject>>DoIt
。单击它,您将看到代码停止的位置 - 执行时:
myArray at: n
在调试器中有检查员,如果你点击n,你会看到n = 8
,然后如果你检查myArray,你会发现它只有7个元素。因此,您正试图使用超出数组边界的下标(索引)来访问myArray,因为错误消息告诉...
从调试器中,您可以重新启动方法并逐步执行它。但是因为它会在循环123中失败,所以它可能很无聊...您也可以在调试器中修改代码,例如使用myArray := #(2 4 5).
acceopt,并逐步重新开始执行以查看是否可以理解为什么算法失败。
我的建议是尝试以不同的方式思考。您已经有一个包含要打印的值的数组(myArray
)。因此,如果您设法告诉myArray
更直接地执行您想要的操作,可以写一些类似myArray do: [:element | ...]
答案 1 :(得分:3)
从整数1到130,我想打印已经在数组中给出的一些特定整数
1 to: 130 do: [ :i |
(array includes: i) ifTrue: [ Transcript show: i; cr. ] ]