Ruby 入門指南 - 編碼與解碼





































Ruby 入門指南 - 編碼與解碼






編碼 (encoding) 需要用到轉換表格,我們利用陣列 (array) 儲存這個表格,簡單說,就是利用英文字母的排列順序,相對到表格的對應關係




上圖是用了如下的表格
"qzirajsbktcludmvenwfoxgpyh"



對以下的字串 (string) 而言
"There is no spoon.";



我們先來想一想程式應該如何完成這一項工作,首先, 'T' 不是英文小寫字母,因此跳過,然後 'h' 、 'e' 、 'r' 、 'e' 都是英文小寫字母,對照表格,需要轉換為 'b' 、 'a' 、 'n' 、 'a' ,接下來遇到一個空格字元 ' ' ,也跳過,然後 'i' 、 's' 也都是英文小寫字母,需要轉換為 'k' 、 'w' ,餘下類推。


所以需要利用一個迴圈 (loop) 進行上述編碼工作,逐一檢查字串中的每一個元素,若是該元素為英文小寫字母,就開始進行編碼轉換,這是利用另外一個迴圈,檢查該元素於 @alph 中的索引值,最後利用該索引值取出 @code 裡的元素。


這是說,第 0 個字元(索引值為 0 ) 'T' 不在英文小寫字母編碼的範圍,因此程式不會處理,然後到第 1 個字母 'h' ,這在 @alph 中索引值為 7 ,對照為 @code 的 'b' ,因此 'h' 會轉換為 'b' 。


因此,編碼方法 (method) 設計如下
def toEncode(s)
a = s.split("")
r = ""
for i in a do
if ('a'..'z') === i
j = @alph.index(i)
r.concat(@code.at(j))
else
r.concat(i)
end
end
return r
end



我們替 toEncode 加上一個 s ,同樣預期這會是個字串,進入底下第一行先用 split 方法轉換成陣列 ar 則是暫存編碼結果的空字串。


編碼過程很簡單,就在一個 for 迴圈中進行,逐一取得 a 中的元素,也就是單一字元的子字串,先判斷該子字串是否為英文小寫字母,如果是,就利用 index 方法找出在 @alph 中索引值,然後用 at 方法取得在 @code 的元素,最後用字串的 concat 方法將該元素加入 r 的最後。


當然,如果 a 的元素不是英文小寫字母,就直接將該元素直接加入 r 的最後。解碼 (decoding) 其實跟編碼很雷同,只需要把 @code@alph 的位置對調就可以了,如下
def toDecode(s)
a = s.split("")
r = ""
for i in a do
if ('a'..'z') === i
j = @code.index(i)
r.concat(@alph.at(j))
else
r.concat(i)
end
end
return r
end



修改後的 encrypt.rb 如下
class Encrypt
def initialize
@code = Array('a'..'z').shuffle
@alph = Array('a'..'z')
end

def setCode(data)
@code = data.split("")
end

def getCode
@code.join
end

def toEncode(s)
a = s.split("")
r = ""
for i in a do
if ('a'..'z') === i
j = @alph.index(i)
r.concat(@code.at(j))
else
r.concat(i)
end
end
return r
end

def toDecode(s)
a = s.split("")
r = ""
for i in a do
if ('a'..'z') === i
j = @code.index(i)
r.concat(@alph.at(j))
else
r.concat(i)
end
end
return r
end
end

=begin
《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:encrypt.rb
功能:示範 Ruby 程式
作者:張凱慶
時間:西元 2012 年 12 月
=end



測試程式 encryptdemo.rb 修改如下
require "./encrypt.rb"

e = Encrypt.new
s1 = "There is no spoon."
puts
puts e.getCode
s2 = e.toEncode(s1)
puts s2
s3 = e.toDecode(s2)
puts s3
puts

=begin
《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:encryptdemo.rb
功能:示範 Ruby 程式
作者:張凱慶
時間:西元 2012 年 12 月
=end



執行結果如下



It's work!


好了,在進入 GUI 的部份之前,先來認識標準程式庫及 Tk 吧!


























中英文術語對照
編碼encoding
陣列array
字串string
迴圈loop
解碼decoing



您可以繼續參考
軟體開發

  • 陣列

  • Encrypt 類別

  • require

  • initialize

  • 編碼與解碼

  • 認識標準程式庫及 Tk





相關目錄

回 Ruby 入門指南
回 Ruby 教材
回首頁



參考資料

http://www.rubyist.net/~slagell/ruby/methods.html
http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_methods.html







沒有留言:




















window.___gcfg = { 'lang': 'zh-TW' };





Popular posts from this blog

迅雷 Thunder 7.9.43.5054 免安裝版 (9.1.41.914 安裝版) - 支援BT下載的萬用 檔案下載工具

Nhiều đồn đoán cho rằng bộ đồ "phá vỡ quy tắc" của Meghan Markle được lấy cảm hứng từ trang phục của Công nương Diana

Cụ ông 92 tuổi gào khóc vì mất hết tiền tiết kiệm cả đời, càng cay đắng hơn khi kẻ trộm là đứa cháu trai 34 tuổi