我們打算先發展一個 Encrypt 類別,它的主要功能是建立一個英文小寫字母的對換表格,藉由這個表格,我們可以對英文句子中的小寫英文字母進行對換,例如 "There is no spoon." 可能變成以下任一個
Tfqdq ki jo itooj.
Tcnan hf gl fqllg.
Tczmz dn ij nkjji.
Tgfsf pb ir barri.
Tdcpc my fo yxoof.
其中, EncryptDemo 類別為我們在命令列 (command line) 對 Encrypt 進行測試的類別,然後,最重要的是我們還要發展使用者介面 (user interface) 的類別,給使用者輕鬆操作的圖形使用者介面 (graphical user interface, GUI) ,也就是 GUIDemo 類別。
這是說, Encrypt 與 GUIDemo 都不會有 main() 函數 (function) ,我們把建立對換表格的工作交給 Encrypt ,使用者的 GUI 介面的設計交給 GUIDemo 。 EncryptDemo 具有 main() 函數, EncryptDemo 中建立 Encrypt 物件,並且列命令列印出測試結果, GUIDemo 中同樣建立 Encrypt 物件,但有更多功能,外觀如下圖
我們的 GUI 設計會採用第三方程式庫 (third party library) Qt ,然後利用 Xcode 於 Mac 系統中編譯成執行檔,若是使用 MS-Windows 系統,可參考 Qt 官方的教學
http://qt-project.org/wiki/Support_for_Windows
有兩個可供輸入的文字欄位 (textfield) ,其中一個我們作為輸出的顯示訊息之用,另有三個標籤 (label) ,顯示文字的提示訊息,七個按鈕 (button) ,提供「新建」、「開啟」、「儲存」 Encrypt 物件,與「編碼」、「解碼」所輸入的英文句子,「清除」所有輸入欄位,以及「拷貝」輸出結果等的功能。
現在我們先來看看所有功能的核心,也就是 Encrypt 類別,我們的目的是,建立一個小寫英文字母的轉換表格,然後編碼、解碼都可直接依據這個表格。首先,我們先來看看建立表格的數學公式
y = a * x + b
m = y % n
r = m + diff
我們的概念很簡單,假設 x 為字元的原始編碼, ASCII 編碼中 'a' 為 97 ,其後依次遞增 1 ,然後我們將 x 乘上變數 (variable) a , 再加上變數 b ,兩者均是 0 到 9 的隨機整數,這樣便得到 y 的值。
然後將 y 除以 n 取得餘數 m , n 為所要轉換的字元數量,英文小寫字母共有 26 個,所以這裡 n 等於 26 ,因此 m 等於 0 到 25 之間的整數值。最後將 m 加上 diff , diff 也就是編碼系統的差值,由於 ASCII 中 'a' 為 97 ,所以這裡 diff 要以 97 代入。
因此,餘數 0 的字元會替換成 'a' ,餘數 1 的字元會被替換成 'b' ,餘數 2 的字元會被替換成 'c' ,餘下 23 個字元類推。這樣的計算需要進行 n 次,也就是 26 次,我們最後得到一組餘數與相對應字元的表格,這就是我們需要的表格了。
重複 n 次,我們需要一個迴圈 (loop) ,由於重複次數確定,因此 for 迴圈 (for loop) 很適合,那我們要用什麼東西來儲存這個表格呢?嗯,標準程式庫 (standard library) 中有許多的資料結構 (data structure) ,可以依資料特性有效率的處理資料,這裡,我們利用字串 (string) 就可以了。
字串為字元陣列 (character array) 的物件 (object) ,因此字串裡是由字元 (character) 當成元素 (element) ,也保有陣列 (array) 的特性,例如利用從 0 開始的索引值存取每個字元,這也完全符合我們計算餘數從 0 開始的需求。
因此, Encrypt 需要以下的成員變數 (member variable) , cArray 為二十六個英文小寫字母的密碼對照表格, oArray 則是二十六個英文小寫字母的順序表格
string cArray; string oArray;
我們先寫出 Encrypt.h ,如下
#include <string> using std::string; #define DIFF 97 #define N 26 class Encrypt { public: Encrypt(); void setoArray(); void setcArray(); string getoArray(); string getcArray(); string toEncode(string); string toDecode(string); private: string oArray; string cArray; }; /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:Encrypt.h 功能:示範 C++ 程式 作者:張凱慶 時間:西元 2012 年 10 月 */
這裡我們需要遇到標準程式庫的 string 名稱,因此一開始引進 string 外,也要用 using 標示使用 std 中的 string 名稱
#include <string> using std::string;
然後用 #define 定義兩個常數,分別是位移量 DIFF 與小寫英文字母總數 N
#define DIFF 97 #define N 26
接著宣告幾個 public 的成員函數 (member function)
public: Encrypt(); void setoArray(); void setcArray(); string getoArray(); string getcArray(); string toEncode(string); string toDecode(string);
除了建構子 (constructor) 與 setter 、 getter 外, toEncode() 為編碼函數,將參數 (parameter) 編碼回傳編碼結果,相對 toDecode() 則是按照編碼表將參數解碼回傳解碼結果。
好了,接下來我們要開始實作與測試了。
中英文術語對照 | |
---|---|
類別 | class |
命令列 | command line |
使用者介面 | user interface |
圖形使用者介面 | graphical user interface, GUI |
函數 | function |
第三方程式庫 | third party library |
文字欄位 | textfield |
標籤 | label |
按鈕 | button |
變數 | variable |
迴圈 | loop |
for 迴圈 | for loop |
標準程式庫 | standard library |
資料結構 | data structure |
字串 | string |
字元陣列 | character array |
物件 | object |
字元 | character |
元素 | element |
陣列 | array |
成員變數 | member variable |
成員函數 | member function |
建構子 | constructor |
參數 | parameter |
您可以繼續參考
軟體開發
相關目錄
回 C++ 入門指南
回 C++ 教材目錄
回首頁
參考資料
http://www.cplusplus.com/doc/tutorial/classes/
http://www.cplusplus.com/doc/tutorial/classes2/
沒有留言:
張貼留言