Swift 入門指南 V1.00 - 單元 15 - 實作 setCode()
- Get link
 - X
 - Other Apps
 
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' };
- Get link
 - X
 - Other Apps
 

沒有留言:
張貼留言