編碼 (encoding) 需要用到轉換表格,我們利用陣列 (array) 儲存這個表格,簡單說,就是利用 Unicode 排列順序,相對到表格的對應關係
上圖是用了如下的表格
code = {'q', 'z', 'i', 'r', 'a', |
'j', 's', 'b', 'k', 't', |
'c', 'l', 'u', 'd', 'm', |
'v', 'e', 'n', 'w', 'f', |
'o', 'x', 'g', 'p', 'y', |
'h'} |
實際上我們的表格是餘數陣列,這裡轉換成字元的方式講解。
我們先來想一想程式如何完成編碼工作,假設是對以下的字串 (string) 進行編碼
"There is no spoon." |
首先, 'T' 不是英文小寫字母,因此跳過,然後 'h' 、 'e' 、 'r' 、 'e' 都是英文小寫字母,對照表格,需要轉換為 'b' 、 'a' 、 'n' 、 'a' ,接下來遇到一個空格字元 ' ' ,也跳過,然後 'i' 、 's' 也都是英文小寫字母,需要轉換為 'k' 、 'w' ,餘下類推。
所以需要利用一個迴圈 (loop) 進行上述編碼工作,逐一檢查字串中的每一個字元 (character) 是否為英文小寫字母,我們將用以下 isLowercase() 方法 (method) 判斷該字元是否為英文小寫字母
// 判斷是否為英文小寫字母的字元 |
func isLowercase(chr: Character) -> Bool { |
for i in alphabet { |
if (chr == i) { |
return true |
} |
} |
return false |
} |
完整程式請參考「範例程式篇」的 Encrypt.swift 。
簡單講, isLowercase() 判斷參數字元是否為 alphabet 中的元素,如果該字元存在於 alphabet ,那就是英文小寫字母。
如果是英文小寫字母就開始進行編碼,第一件工作就是找到該字元在英文小寫字母表的順序,我們用以下的 findAlphabetIndex() 進行這件工作
// 由字元從字母表中找到索引值 |
func findAlphabetIndex(chr: Character) -> Int { |
var i = 0 |
for c in alphabet { |
if chr == c { |
return i |
} |
i++ |
} |
return 0 |
} |
這個順序就是 code 中的索引值,由索引值取出 code 中的元素,也就是先前利用 setCode() 計算出的餘數,再藉由此餘數從 alphabet 找到相對應的字元,以上工作由 findCode() 來完成
// 由索引值找到密碼表中對應的字元 |
func findCode(number: Int) -> Character { |
let index = code[number] |
var i = 0 |
for s in alphabet { |
if i == index { |
return s |
} |
i++ |
} |
return Character("") |
} |
因此, toEncode() 藉由呼叫 isLowercase() 、 findAlphabetIndex() 、 findCode() 完成細部工作
// 進行編碼的方法 |
func toEncode(str: String) -> String { |
var newStr = "" |
for chr in str { |
if isLowercase(chr) { |
newStr.append(findCode(findAlphabetIndex(chr))) |
} |
else { |
newStr.append(chr) |
} |
} |
return newStr |
} |
toEncode() 中的 newStr 為暫存變數,初值設定為空字串 (empty string) ,然後利用字串的 append() 方法附加每個處理過字元,如果是英文小寫字母就進行編碼轉換,然後加入轉換後的密碼,反倒不是英文小寫字母就直接附加進去。
測試部分用 "There is no spoon" 來編碼看看,在 Playground 的結果如下
結果 OK ,下一個單元繼續實作解碼功能。
中英文術語對照
編碼 | encoding |
陣列 | array |
字串 | string |
迴圈 | loop |
字元 | character |
方法 | method |
空字串 | empty string |
沒有留言:
張貼留言