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

Mới 2 tập phim, "Ngày Ấy Mình Đã Yêu" đã khiến khán giả muốn “té xỉu” vì 4 hạt sạn này

偽蝦米 Dev 0914 (2008.09.14) - 嘸蝦米輸入法免安裝版

BitComet 比特彗星 1.49 免安裝中文版 (1.50 安裝版) - 免費BT下載軟體