Integer Squeak Smalltalk——”;“打印特定整数”;错误消息、如何改进以及原因?
我想要的是: 从整数1到130,我想打印数组中已经给定的一些特定整数。 它们是:2 32 44 67 89 111 123,按从小到大的顺序存储 这是我的密码:Integer Squeak Smalltalk——”;“打印特定整数”;错误消息、如何改进以及原因?,integer,smalltalk,squeak,Integer,Smalltalk,Squeak,我想要的是: 从整数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 sh
|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.
].
].
如果单击“调试”按钮,您将获得对调试器的访问权限,该调试器可以帮助您了解正在发生的事情 窗口中显示的列表是执行堆栈。您试图执行的代码段被标记为
UndefinedObject>>DoIt
。单击它,您将看到代码在执行时停止的位置:
myArray at: n
在调试器中有检查器,如果单击n,您将看到n=8
,然后如果您检查myArray,您将看到它只有7个元素。因此,您试图使用超出数组边界的下标(索引)访问myArray,错误消息告诉您
从调试器中,您可以重新启动该方法并逐步执行它。但由于它将在循环123失败,这可能会很无聊。。。您还可以在调试器中修改代码,例如使用myArray:=#(2 4 5)。
acceopt,然后逐步重新启动执行,以了解算法失败的原因
我的建议是尝试用不同的方式思考。您已经有一个包含要打印的值的数组(
myArray
)。因此,如果您设法让myArray
更直接地执行您想要执行的操作,可以编写类似于myArray do:[:element |…]
的内容。如果您单击“调试”按钮,您将获得一个调试器的访问权限,该调试器可以帮助您了解正在发生的事情
窗口中显示的列表是执行堆栈。您试图执行的代码段被标记为UndefinedObject>>DoIt
。单击它,您将看到代码在执行时停止的位置:
myArray at: n
在调试器中有检查器,如果单击n,您将看到n=8
,然后如果您检查myArray,您将看到它只有7个元素。因此,您试图使用超出数组边界的下标(索引)访问myArray,错误消息告诉您
从调试器中,您可以重新启动该方法并逐步执行它。但由于它将在循环123失败,这可能会很无聊。。。您还可以在调试器中修改代码,例如使用myArray:=#(2 4 5)。
acceopt,然后逐步重新启动执行,以了解算法失败的原因
我的建议是尝试用不同的方式思考。您已经有一个包含要打印的值的数组(myArray
)。因此,如果您设法让myArray
更直接地做您想做的事情,可以编写类似myArray do:[:element |……]的内容
从整数1到130,我想打印数组中已经给定的一些特定整数
从整数1到130,我想打印数组中已经给定的一些特定整数
我认为数组包括:我很好。但我想我的方式更快。对吗?是的,Uko展示了O(m*n)解决方案,你的是O(m),但你必须先让它工作。让它工作>让它快。还有很多其他的方法,比如Transcript-cr;show:(myArray选择:[:e | e介于:1和:130之间]
我认为数组包括:I很好。但我想我的方式更快。对吗?是的,Uko展示了O(m*n)解决方案,你的是O(m),但你必须先让它工作。让它工作>让它快。还有很多其他的方法,比如Transcript-cr;显示:(myArray选择:[:e | e介于:1和:130之间]