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

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 |
訂閱:
張貼留言 (Atom)
window.___gcfg = { 'lang': 'zh-TW' };
沒有留言:
張貼留言