C++ 入門指南 V2.00 - 範例程式碼 encrypt.cpp




001 // 引入標準程式庫中的 cstdlib 及 ctime
002 #include <cstdlib> // srand(), rand()
003 #include <ctime>   // time()
004
005 // 引入 Encrypt 類別的標頭檔
006 #include "encrypt.h"
007
008 // Encrypt 的建構函數
009 Encrypt::Encrypt() {
010    // 呼叫 setter 設定 code_array
011    set_code_array();    
012 }
013
014 // 設定 code_array 的 setter 成員函數
015 void Encrypt::set_code_array() {
016    // 設定擬隨機數的種子
017    srand(time(0));
018
019    // 取得 a 、 b 值
020    int a = 0;
021    int b = 0;
022    while (a % 2 == 0) {
023       a = rand() % 10;
024       b = rand() % 10;
025    }
026
027    // 利用公式建立密碼表字串
028    int x, y, m;
029    char r;
030    char c = 'a';
031    string s;
032    int i;
033    for (i = 0; i < N; i++) {
034       x = c;
035       y = x * a + b;
036       m = y % N;
037       s += (char) m + DIFF; 
038       c++; 
039    }
040
041    // 將建立好的密碼表直接設定給成員變數
042    code_array = s;
043 }
044
045 // 由參數字串設定密碼表
046 void Encrypt::set_code_array(string s) {
047    code_array = s;
048 }
049
050 // 回傳密碼表字串的 getter 成員函數
051 string Encrypt::get_code_array() {
052    return code_array;
053 }
054
055 // 進行編碼工作的成員函數
056 string Encrypt::ToEncode(string s) {
057    // 由參數字串取得字元的暫存變數
058    char c;
059    // 暫存編碼結果的字串
060    string r;
061    int i, m;
062    // 利用迴圈走完參數字串的所有字元
063    for (i = 0; i < s.size(); i++) {
064       // 判斷該字元是否為英文小寫字母
065       // 若是英文小寫字母就進行編碼轉換
066       if (s.at(i) >= DIFF && s.at(i) < DIFF + N) {
067          c = s.at(i);
068          m = c - 97;
069          r += get_code_array().at(m);
070       }
071       else {
072          r += s.at(i);
073       }
074    }
075
076    // 結束回傳編碼過的字串
077    return r;
078 }
079
080 // 進行解碼工作的成員函數
081 string Encrypt::ToDecode(string s) {
082    // 暫存解碼結果的字串
083    string r;
084    int i, j;
085    // 第一層迴圈逐一取得每一個字元
086    for (i = 0; i < s.size(); i++) {
087       // 判斷該字元是否為英文小寫字母
088       // 若是英文小寫字母就進行解碼轉換
089       if (s.at(i) >= DIFF && s.at(i) < DIFF + N) {
090          // 第二層迴圈尋找該字元在密碼表中的索引值
091          // 該索引值加上 DIFF 就可轉換回原本的字元
092          for (j = 0; j < N; j++) {
093             if (s.at(i) == get_code_array().at(j)) {
094                r += (char) j + DIFF;
095                break;
096             }
097          }
098       }
099       else {
100          r += s.at(i);
101       }
102    }
103
104    // 結束回傳解碼過的字串
105    return r;
106 }
107
108 /* encrypt.cpp 
109    Kaiching Chang 
110    2014-5 */

the end

沒有留言: