上圖是用了如下的表格
"qzirajsbktcludmvenwfoxgpyh"
對以下的字串 (string) 而言
"There is no spoon.";
我們先來想一想程式應該如何完成這一項工作,首先, 'T' 不是英文小寫字母,因此跳過,然後 'h' 、 'e' 、 'r' 、 'e' 都是英文小寫字母,對照表格,需要轉換為 'b' 、 'a' 、 'n' 、 'a' ,接下來遇到一個空格字元 ' ' ,也跳過,然後 'i' 、 's' 也都是英文小寫字母,需要轉換為 'k' 、 'w' ,餘下類推。
所以需要利用一個迴圈 (loop) 進行上述編碼工作,逐一檢查字串中的每一個元素,並將該元素轉換成字元 (character) ,若是屬於英文小寫字母的編碼範圍,在 ASCII 就是 97 到 122 之間,先將該字元轉換為整數,然後減掉 97 就會是表格中的對應字母。
這是說,第 0 個字元(索引值為 0 ) 'T' 不在英文小寫字母編碼的範圍,因此程式不會處理,然後到第 1 個字母 h ,這是英文小寫字母編碼為 84 ,減去 97 之後為 7 ,對應到上面的表格會是 'b' ,因此得到的新字串第 1 個新字母就是 'b' ,餘下會一直進行重複的工作到字串結束為止。
因此,我們對編碼成員函數 (member function) 設計如下
string Encrypt::toEncode(string s) { char c; string r; int i, m; for (i = 0; i < s.size(); i++) { if (s.at(i) >= 97 && s.at(i) <= 122) { c = s.at(i); m = c - 97; r += getcArray().at(m); } else { r += s.at(i); } } return r; }
toEncode() 接收一個 string 當參數,也回傳一個新 string 字串。進行編碼轉換的迴圈
for (i = 0; i < s.size(); i++) { if (s.at(i) >= 97 && s.at(i) <= 122) { c = s.at(i); m = c - 97; r += getcArray().at(m); } else { r += s.at(i); } }
size() 回傳字串物件 (object) 的長度,因此這個迴圈只會檢查 s 中的每一個元素。留意這一行
if (s.at(i) >= 97 && s.at(i) <= 122) {
at() 取得字串索引值的字元,如果該索引值的字元值在 97 到 122 之間,也就是英文小寫字母的範圍,就會進行編碼動作
c = s.at(i); m = c - 97; r += getcArray().at(m);
反之不屬於英文小寫字母的範圍,就將該字元接到結果字串之後
r += s.at(i);
簡不簡單呢?記得將上面的 toEncode() 加到 Encrypt.cpp 裡面,然後我們用以下的 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; return 0; } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:EncryptDemo.cpp 功能:示範 C++ 程式 作者:張凱慶 時間:西元 2012 年 10 月 */
編譯執行,結果如下
我們對 "There is no spoon." 進行編碼,結果符合預期,接下來,我們繼續加入解碼的功能吧!
中英文術語對照 | |
---|---|
編碼 | encoding |
字串 | string |
迴圈 | loop |
字元 | character |
成員函數 | member function |
物件 | object |
您可以繼續參考
軟體開發
相關目錄
回 C++ 入門指南
回 C++ 教材目錄
回首頁
參考資料
http://www.cplusplus.com/doc/tutorial/classes/
http://www.cplusplus.com/doc/tutorial/classes2/
1 則留言:
請問 #include "Encrypt.h"
Encrypt.h的檔案在哪呢
張貼留言