2016-09-24 5 views
1
만들기

그래서 스몰 토크에서 카이사르 암호 코드를 얻을 방법을 만들고 그래서 그것을 이미 클래스가 만든는 카이사르 암호 방법

|aString| 
aString:=Caesar new encrypt: 'CAESAR'. 
Transcript show: aString. 

에 다음과 같은 시험을 수행 할 수 있습니다를 사용해야합니다. 그러나 나는 그것의 방법을 만들 필요가있다.

나는 이것을 발견했다. 그러나 나는 놀이터에서 위의 모든 코드를 할 수 있도록이 방법을 어떻게 만들 수 있을까?

| i c strCipherText strText iShiftValue iShift | 

strText := 'the quick brown fox jumps over the lazy dog'. 
iShiftValue := 3. 

strCipherText := ''. 
iShift := iShiftValue \\ 26. 

i := 1. 
[ i <= (strText size) ] 
whileTrue: [ 
    c := (strText at: i) asUppercase. 

    ((c >= $A) & (c <= $Z)) 
    ifTrue: [ 

    ((c asciiValue) + iShift > $Z asciiValue) 
    ifTrue: [ 
     strCipherText := strCipherText, (((c asciiValue) + iShift - 26) 
         asCharacter asString). 
    ] 
    ifFalse: [ 
     strCipherText := strCipherText, (((c asciiValue) + iShift) 
         asCharacter asString). 
    ]. 

    ] 
    ifFalse: [ 
    strCipherText := strCipherText, ' '. 
    ]. 

    i := i + 1. 
]. 

Transcript show: strCipherText. 
Transcript cr. 

그래서 일을 명확하게하기 위해, 나는 카이사르 암호 코드를 사용하는 방법을하고 시작 부분에 "aString"코드를 사용하고 그것을 테스트해야합니다. 위의 코드가 있지만 이미 텍스트가 들어있어 메서드에 넣을 수 없습니다.

도움이 될 것입니다.

+0

물론 메서드에 넣을 수 있습니다. 'strText'를 메소드 인자로 바꾸기 만하면됩니다. 예를 들어,이 메소드는'#myCaesorCodeOf :'라고 불릴 수 있으며 'aString'이라는 하나의 인수를 취합니다. –

+0

@MaxLeske 저는 pharo와 작은 대화를 처음 사용하기 때문에 그렇게하는 법을 모릅니다. –

답변

2

Max는 자신의 의견에서 위의 코드를 메서드에 넣을 수 있다고 말했습니다.

caesarCipherOf: strText 
    <insert the code here> 

최대로 또 다른 좋은 제안이 더 어떻게 스몰 토크 이름 것들로 정렬 있기 때문에 인수 aString보다는 strText를 호출하는 것입니다 : 유일한없는 부분은 선택과 형식 인수와 첫 번째 줄입니다. c >= $A & (c <= $Z)c isLetter 의미

  1. 비교 :

    하지만 지금은의 소스 코드 자체를 살펴 보자.

  2. 다음 문자의 조건부 계산은 3 문자를 오른쪽으로 이동하여 $Z을 초과하면 줄 바꿈하고 싶다는 의미입니다.

    64 = $A codePoint - 1
    (c codePoint - 64 + 3 \\ 26 + 64) asCharacter 
    

    에서,이 $A 및 주어진 대문자 c 간의 오프셋이다 : 이것은 쉽게 표현할 수있다. 또한 asciiValuecodePoint으로 바꿨습니다. 이 모든 문자에 String 새로운 인스턴스를 생성 피한다 때문에 방법은

    caesarCipherOf: aString 
         ^aString collect: [:c | 
         c isLetter 
          ifTrue: [(c asUppercase codePoint - 64 + 3 \\ 26 + 64) asCharacter] 
          ifFalse: [$ ]] 
    

    이 짧을뿐 아니라 같이 다시 쓸 수있는 두 관측과

, 그것은 더 효율적입니다 . 구체적 형태

string := string , <character> asString 

식 중 두 Strings를 작성 병합 #, 메시지를 전송 한 결과로 #asString, 다른 전송의 결과로서 하나. 대신 #collect:은 메서드가 반환하는 인스턴스를 하나만 만듭니다.

+0

감사합니다! –