Swift 入門指南 V1.00 - 單元 15 - 實作 setCode()




setCode() 的工作就是建立密碼表餘數陣列 (array) ,我們需要的密碼表就是一個攪亂順序的英文字母表



先來溫習一下用來編碼的數學公式


y = a * x + b

m = y % n


ab 預定是 09 之間的隨機整數,要取得隨機整數的話,程式庫 (library) 中有程式可用,倒是現在先不用急著一次到位,我們先把 a 設定成 3b 設定成 5 好了, setCode() 的實作如下


// 設定密碼表
func setCode() {
   var a = 3
   var b = 5
 
   var c = 97
   var i, x, y, m: Int
   // 以迴圈取得每一個餘數
   for i = 0; i < 26; i++ {
      x = c
      y = x * a + b
      m = y % 26
      code.append(m)
      c++
   }
 
   // 移除第一個預設值
   code.removeAtIndex(0)
}

因為英文字母表的小寫字母共有 26 個,因此公式用迴圈 (loop) 跑了 26


// 以迴圈取得每一個餘數
for i = 0; i < 26; i++ {
   x = c
   y = x * a + b
   m = y % 26
   code.append(m)
   c++
}

我們多用了除了公式外的變數 (variable) cc 為起始字元 (character) ,初值設定成英文字母表的第一個字母 'a' 的數字,這裡並沒有直接拿變數 c 進行計算,而是把變數 c 的值指派給 x


x = c

會這樣做的原因很簡單,因為需要一個變數表示目前處理的字元,因此迴圈最後利用遞增將變數 c 轉移到下一個字元,例如迴圈從 'a' 開始,也就是數字 97 ,第二個處理的字元為 'b' ,也就是數字 98 ,第三個為 'c' ,也就是數字 99 ,以此類推


c++

setCode() 的最後, code 屬性 (property) 呼叫陣列的 removeAtIndex() 方法 (method) 移除第一個,也就是索引值為 0 的元素


// 移除第一個預設值
code.removeAtIndex(0)

請自行將上述程式碼加入到 Encrypt 中,再加入以下的測試程式碼


var demo = Encrypt()
demo.code

記得建構子 (initializer) 中的 // setCode() 要拿掉 // ,取消註解化才能順利執行。

輸入到 Playground ,測試程式碼的結果如下



結果如預期,產生 025 隨機排列的數字,這樣我們的公式就 ok 了嗎?嗯,因為我們希望 ab 可以是 09 之間的任意整數,這樣就有 100 種組合說,所以我們接下來要繼續測試,看看是不是每一種組合都 ok 囉!


中英文術語對照


陣列array
程式庫library
迴圈loop
變數variable
字元character
屬性property
方法method
建構子initializer

沒有留言: