C++ 入門指南 - 解碼

解碼 (decoding) 需要用到與編碼相同的轉換表格




所謂的解碼也就是將編碼 (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 ,依順序 forifforif ,這是我們打算讓程式執行的順序,若是沒有依照這樣的順序,程式可能會跑出無法預期的結果。


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/

沒有留言: