2017-11-16 11 views
1

원하는 내용은 다음과 같습니다. 정수 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

내 현재 수준, 나는 아무 생각이 없습니다.

질문 : 왜 오류 메시지가 나타 납니까?

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

답변

3

것은, 당신은 당신이 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 수 있습니다 디버거에 액세스합니다.

표시중인 창의 목록은 실행 스택입니다. 실행하려는 스 니펫은 UndefinedObject>>DoIt으로 표시됩니다. 그것을 클릭하고 코드가 중지 된 위치를 알 수 있습니다 - 실행하는 동안 : 당신이에서 myArray을 검사하는 경우 디버거에서

myArray at: n 

는 사찰이있다, 당신은 다음, 당신이 N에 n = 8 클릭하면 볼 수 있습니다, 당신을 그것은 단지 7 개의 요소를 가지고있는 것을 볼 수 있습니다. 따라서 오류 메시지에서 알 수 있듯이 배열 범위를 벗어난 인덱스 (subscript)를 사용하여 myArray에 액세스하려고합니다 ...

디버거에서 메소드를 다시 시작하고 단계별로 실행할 수 있습니다 . 그러나 루프 123에서 실패 할 것이기 때문에 지루할 수도 있습니다 ... 디버거에서 코드를 수정할 수도 있습니다 (예 : myArray := #(2 4 5). acceopt). 알고리즘이 실패한 이유를 이해할 수 있는지 확인하기 위해 단계별 실행을 다시 시작하십시오.

제 제안은 다르게 생각하려고하는 것입니다. 이미 인쇄 할 값 (myArray)을 포함하는 배열이 있습니다. 당신은 아마 1 130 정수에서 myArray do: [:element | ...]

3

같은 것을 작성하여 당신이 더 직접적으로 원하는 일을 할 수 myArray에게 관리하는 경우, 이미 배열에서 주어진 일부 특정 정수를 인쇄 할 수 있도록

1 to: 130 do: [ :i | 
    (array includes: i) ifTrue: [ Transcript show: i; cr. ] ] 
+0

나는 배열에 다음을 포함한다고 생각한다 : 나는 좋다.그러나 나는 내 방식이 더 빠를 것 같아요. 맞습니까? –

+0

예, Uko는 O (m * n) 해결책을 보여 주지만, 당신은 O (m) 이었지만 먼저 그것을 만들어야합니다. 그것을 일하게하십시오> 그것을 빨리 만드십시오. 'Transcript cr;과 같은 다른 많은 방법이 있습니다. 보여주기 : (myArray select : [: e | e between : 1 and : 130])' –