所謂的解碼也就是將編碼 (encoding) 過的小寫英文字母回覆成原來的英文小寫字母,由上圖可以看出,我們儲存表格所用的 string ,依索引值 (index) 可推回原來的英文小寫字母,這是說,索引值 0 為 'q' ,所以是將原本的 'a' 變成 'q' ,因此,解碼就是依索引值重新加上位移值即可。
實際上我們需要用到巢狀迴圈 (nested loop) ,也就是在迴圈 (loop) 中有其他的迴圈,對單一英文句子而言,我們需要一個迴圈判斷每個字元是否為英文小寫字母,若是英文小寫字母,我們就需要另一個迴圈找出對應的索引值。由這樣的概念設計的解碼成員函數 (member function) toDecode() ,如下
string Encrypt::toDecode(string s) { int i, j; string r; for (i = 0; i < s.size(); i++) { if (s.at(i) >= 97 && s.at(i) <= 122) { for (j = 0; j < N; j++) { if (s.at(i) == getcArray().at(j)) { r += (char) j + DIFF; break; } } } else { r += s.at(i); } } return r; }
巢狀迴圈是迴圈中包含另一個迴圈,由於我們利用縮排的方式編輯程式碼,看起來內層迴圈像是凹陷進去的巢,故稱之為巢狀迴圈。
toDecode() 與 toEncode() 相似,同樣需要一個字串 (string) 當參數 (parameter) ,結果也回傳一個字串。
解碼轉換由巢狀迴圈的部份來進行
for (i = 0; i < s.size(); i++) { if (s.at(i) >= 97 && s.at(i) <= 122) { for (j = 0; j < N; j++) { if (s.at(i) == getcArray().at(j)) { r += (char) j + DIFF; break; } } } else { r += s.at(i); } }
外層迴圈會依序取得英文句子的每個字元,然後判斷是否為英文小寫字母,如果該字元是英文小寫字母,就會啟動另一個迴圈找出表格中對應的索引值出來,相反地,如果該字元不是英文小寫字母,控制變數 i 就會自動遞增,然後判斷下一個字元。
注意,這個巢狀迴圈用了兩個 for 、兩個 if ,依順序 for 、 if 、 for 、 if ,這是我們打算讓程式執行的順序,若是沒有依照這樣的順序,程式可能會跑出無法預期的結果。
Encrypt.cpp 需要加進 toDecode() ,然後我們用下面的 EncryptDemo.cpp 進行測試
#include <iostream> using std::cout; using std::endl; #include "Encrypt.h" int main() { cout << endl; Encrypt encryptor; cout << encryptor.getcArray() << endl << endl ; string demo = "There is no spoon."; cout << demo << endl; string result1 = encryptor.toEncode(demo); cout << result1 << endl << endl; string result2 = encryptor.toDecode(result1); cout << result2 << endl << endl; return 0; } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:EncryptDemo.cpp 功能:示範 C++ 程式 作者:張凱慶 時間:西元 2012 年 10 月 */
編譯後執行 ,結果如下
我們先對 "There is no spoon." 進行編碼,然後解碼,結果無誤。接下來我們替 Encrypt 類別 (class) 設計圖形使用者介面 (graphical user interface) ,在此之前,先來認識標準程式庫 (standard library) 吧!
中英文術語對照 | |
---|---|
解碼 | decoding |
編碼 | encoding |
索引值 | index |
巢狀迴圈 | nested loop |
迴圈 | loop |
成員函數 | member function |
字串 | string |
參數 | parameter |
類別 | class |
圖形使用者介面 | graphical user interface |
認識標準程式庫 | standard library |
您可以繼續參考
軟體開發
相關目錄
回 C++ 入門指南
回 C++ 教材目錄
回首頁
參考資料
http://www.cplusplus.com/doc/tutorial/classes/
http://www.cplusplus.com/doc/tutorial/classes2/
沒有留言:
張貼留言