C++ 入門指南 - Encrypt 類別

類別 (class) 為 C++ 開發軟體的要角,我們接下來進入實際開發軟體的階段,最後會發展出 GUI 程式




我們打算先發展一個 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) 與 settergetter 外, 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/

沒有留言: