C++ 入門指南 - 編碼

編碼 (encoding) 需要用到轉換表格,我們利用 string 儲存這個表格,簡單說,就是利用 ASCII 排列順序,相對到表格的對應關係




上圖是用了如下的表格
"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 則留言:

hyde 提到...

請問 #include "Encrypt.h"

Encrypt.h的檔案在哪呢