// 引入標準程式庫中的 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 類別的標頭檔
作者:張凱慶 */