C++ 入門指南

encrypt.cpp

本書已有新版,請參考 C++ 入門指南 4.01 - 範例程式篇 - encrypt.cxx

// 引入標準程式庫中的 cstdlib 及 ctime
#include <cstdlib> // srand(), rand()
#include <ctime>   // time()

// 引入 Encrypt 類別的標頭檔
#include "encrypt.h"

// Encrypt 的建構函數
Encrypt::Encrypt() {
    // 呼叫 setter 設定 code_array
    set_code_array();
}

// 設定 code_array 的 setter 成員函數
void Encrypt::set_code_array() {
    // 設定擬隨機數的種子
    srand(time(0));
    
    // 取得 a 、 b 值
    int a = 0;
    int b = 0;
    while (a % 2 == 0) {
        a = rand() % 10;
        b = rand() % 10;
    }
    
    // 利用公式建立密碼表字串
    int x, y, m;
    char r;
    char c = 'a';
    string s;
    int i;
    for (i = 0; i < N; i++) {
        x = c;
        y = x * a + b;
        m = y % N;
        s += (char) m + DIFF;
        c++;
    }
    
    // 將建立好的密碼表直接設定給成員變數
    code_array = s;
}

// 由參數字串設定密碼表
void Encrypt::set_code_array(string s) {
    code_array = s;
}

// 回傳密碼表字串的 getter 成員函數
string Encrypt::get_code_array() {
    return code_array;
}

// 進行編碼工作的成員函數
string Encrypt::ToEncode(string s) {
    // 由參數字串取得字元的暫存變數
    char c;
    // 暫存編碼結果的字串
    string r;
    int i, m;
    // 利用迴圈走完參數字串的所有字元
    for (i = 0; i < s.size(); i++) {
        // 判斷該字元是否為英文小寫字母,若是英文小寫字母就進行編碼轉換
        if (s.at(i) >= DIFF && s.at(i) < DIFF + N) {
            c = s.at(i);
            m = c - 97;
            r += get_code_array().at(m);
        }
        else {
            r += s.at(i);
        }
    }
    
    // 結束回傳編碼過的字串
    return r;
}

// 進行解碼工作的成員函數
string Encrypt::ToDecode(string s) {
    // 暫存解碼結果的字串
    string r;
    int i, j;
    // 第一層迴圈逐一取得每一個字元
    for (i = 0; i < s.size(); i++) {
        // 判斷該字元是否為英文小寫字母,若是英文小寫字母就進行解碼轉換
        if (s.at(i) >= DIFF && s.at(i) < DIFF + N) {
            // 第二層迴圈尋找該字元在密碼表中的索引值
            // 該索引值加上 DIFF 就可轉換回原本的字元
            for (j = 0; j < N; j++) {
                if (s.at(i) == get_code_array().at(j)) {
                    r += (char) j + DIFF;
                    break;
                }
            }
        }
        else {
            r += s.at(i);
        }
    }
    
    // 結束回傳解碼過的字串
    return r;
}

/* 《程式語言教學誌》的範例程式
   http://kaiching.org/
   檔名:encrypt.cpp
   功能:Encrypt 類別的標頭檔
   作者:張凱慶 */

回 C++ 入門指南目錄
回 C++ 教材
回程式語言教材首頁