setCode() 的工作就是建立密碼表餘數陣列 (array) ,我們需要的密碼表就是一個攪亂順序的英文字母表
先來溫習一下用來編碼的數學公式
y = a * x + b
m = y % n
a 與 b 預定是 0 到 9 之間的隨機整數,要取得隨機整數的話,程式庫 (library) 中有程式可用,倒是現在先不用急著一次到位,我們先把 a 設定成 3 , b 設定成 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) c , c 為起始字元 (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 ,測試程式碼的結果如下
結果如預期,產生 0 到 25 隨機排列的數字,這樣我們的公式就 ok 了嗎?嗯,因為我們希望 a 與 b 可以是 0 到 9 之間的任意整數,這樣就有 100 種組合說,所以我們接下來要繼續測試,看看是不是每一種組合都 ok 囉!
中英文術語對照
陣列 | array |
程式庫 | library |
迴圈 | loop |
變數 | variable |
字元 | character |
屬性 | property |
方法 | method |
建構子 | initializer |
沒有留言:
張貼留言