Squeak Smalltalk - "打印特定的整数"错误信息,如何改进以及为什么?

时间:2017-11-16 08:21:53

标签: 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 show: i; cr. 
                n := n + 1. 
                a := myArray at: n. 
                ].  
        ]. 

除错误消息外,输出非常好。

enter image description here

根据我目前的级别,我不知道为什么出现错误消息。

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. 
                ].  
        ].

2 个答案:

答案 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. ] ]