2016-09-24 3 views
1

Je dois obtenir le code Caesar Cipher en Smalltalk et créer une méthode et de l'utiliser, je peux faire le test suivant sur elleCréation d'une méthode Caesar Cipher

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

Je l'ai déjà fait la classe. Mais j'ai besoin d'en faire la méthode.

Je l'ai trouvé mais comment puis-je faire une méthode de ce que je peux tout le code ci-dessus dans le terrain de jeu.

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

Donc, pour rendre les choses claires, je dois faire une méthode utilisant le code Caesar Cipher et utiliser le code « aString » au début et à tester avec cela. J'ai ce code ci-dessus mais il contient déjà du texte et ne peut pas être mis dans la méthode.

Toute aide sera appréciée.

+0

Bien sûr, vous pouvez le mettre dans une méthode. Remplacez simplement 'strText' par un argument de méthode. Par exemple: la méthode peut s'appeler '#myCaesorCodeOf:' et prendre un argument appelé 'aString'. –

+0

@MaxLeske Je suis nouveau à l'utilisation du pharo et de la petite conversation, donc je ne sais pas vraiment comment faire ça. –

Répondre

2

Comme Max a dit dans son commentaire le code ci-dessus peut être mis dans une méthode. La partie manquante est seulement une première ligne avec le sélecteur et l'argument formel:

caesarCipherOf: strText 
    <insert the code here> 

Une autre bonne suggestion de Max est d'appeler l'argument aString plutôt que strText parce que ce qui est plus aligné avec la façon dont les choses nom Smalltalkiens.

Mais maintenant, nous allons jeter un coup d'oeil au code source lui-même:

  1. La comparaison c >= $A & (c <= $Z) signifie c isLetter.
  2. Le calcul conditionnel du caractère suivant signifie que nous voulons faire pivoter-tourner c en déplaçant 3 caractères vers la droite, en l'enroulant autour s'il dépasse $Z. Ceci peut être facilement exprimée en:

    (c codePoint - 64 + 3 \\ 26 + 64) asCharacter 
    

    64 = $A codePoint - 1, est le décalage entre $A et tout caractère majuscule donné c. Notez également que j'ai remplacé asciiValue par codePoint.

Avec ces deux observations, la méthode peut être réécrite comme

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

Ceci est non seulement plus court, il est plus efficace parce qu'elle évite de créer deux nouvelles instances de String à chaque caractère . En particulier, une expression de la forme

string := string , <character> asString 

crée deux Strings: une à la suite de l'envoi d'#asString, un autre à la suite de l'envoi du message de concaténation #,. Au lieu de cela, #collect: crée une seule instance, celle renvoyée par la méthode.

+0

Merci je l'ai eu au travail !! –