encrypt.h
// 從標準程式庫中引入 string #include <string> // 使用 std 中的 string 名稱 using std::string; // 定義兩個巨集常數 #define DIFF 97 #define N 26 // 宣告 Encrypt 類別 class Encrypt { public: // 宣告建構函數 Encrypt(); // 宣告 setter 與 getter 成員函數 void set_code_array(); void set_code_array(string); string get_code_array(); // 宣告編碼、解碼的成員函數 string ToEncode(string); string ToDecode(string); private: // 密碼表字串 string code_array; }; /* encrypt.h Kaiching Chang 2014-4 */
encrypt.cpp
// 引入標準程式庫中的 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; } /* encrypt.cpp Kaiching Chang 2014-5 */
exercise2101.h
// 宣告 GuessGame 類別 class GuessGame { public: // 宣告建構函數 GuessGame(int); // 存取函數與修改函數 int get_answer(); int get_times(); void set_game(); // 工具函數 bool FindNumber(int[], int, int); void ArrayNumber(int[], int); void ABCounter(int[], int[], int[]); // 命令列遊戲版本 void Run(); private: // 資料成員區 int answer; int answer_array[6]; int length; int guess; int guess_array[6]; int ab_array[2]; int times; }; /* 檔名: exercise2101.h 作者: Kaiching Chang 時間: 2014-5 */
exercise2101.cpp
#include <iostream> #include <cmath> #include <cstdlib> #include <ctime> #include "exercise2101.h" using namespace std; GuessGame::GuessGame(int digit) { if (digit < 3 || digit > 6) { length = 4; } else { length = digit; } set_game(); } int GuessGame::get_answer() { return answer; } int GuessGame::get_times() { return times; } void GuessGame::set_game() { srand(time(0)); int m; int i = 0; int base = pow(10, length - 1); int result = 0; // 建立不重複的四位數 while (i < length) { m = rand() % 10; // 若第一位數為 0 則重來 if (i == 0 && m == 0) { continue; } // 將答案儲存在陣列 answer_array[i] = m; // 有重複,這一輪重來 if (FindNumber(answer_array, i, m)) { continue; } // 沒重複,將該數字加進四位數之中 else { result += m * base; base /= 10; i++; } } answer = result; times = 0; } bool GuessGame::FindNumber(int array[], int index, int number) { for (int i = 0; i < length; i++) { if (i == index) { continue; } if (array[i] == number) { return true; } } return false; } void GuessGame::ArrayNumber(int array[], int number) { int i; int j = pow(10, length - 1); int temp = number; for (i = 0; i < length; i++) { array[i] = temp / j; temp %= j; j /= 10; } } void GuessGame::ABCounter(int array1[], int array2[], int array3[]) { int a = 0; int b = 0; for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { if (array1[i] == array2[j]) { if (i == j) { a++; } else { b++; } } } } array3[0] = a; array3[1] = b; } void GuessGame::Run() { while (true) { // 計算次數 times++; // 接受猜測 cin >> guess; ArrayNumber(guess_array, guess); // 檢查使用者是否輸入四個不同數字 bool state = false; for (int i = 0; i < 4; i++) { if (FindNumber(guess_array, i, guess_array[i])) { state = true; } } if (state) { cout << "Please guess 4 different numbers!!" << endl; continue; } // 檢查使用者是否輸入過少或過多的數字 if (guess <= 999 || guess >= 10000) { cout << "Please input 4 numbers!!" << endl; continue; } // 計算 A 、 B 值 ABCounter(answer_array, guess_array, ab_array); // 判斷使用者是否猜對 if (answer == guess) { cout << "Right!! You guess " << times << " times!!" << endl; break; } else { cout << "Wrong!! " << ab_array[0] << "A" << ab_array[1] << "B!!" << endl; } } } /* 檔名: exercise2101.cpp 作者: Kaiching Chang 時間: 2014-5 */
exercise2102.cpp
#include "exercise2101.h" int main(void) { GuessGame g(4); g.Run(); } /* 檔名: exercise2102.cpp 作者: Kaiching Chang 時間: 2014-5 */
the end
沒有留言:
張貼留言