C++ 入門指南 - 繼續測試

如果要讓 ab 隨機出現,我們可以借助 cstdlib 中的 rand() 函數 (function) ,並且先以 srand() 設定種子,而 ctime 的 time() 當作參數 (parameter) ,所以 Encrypt.cpp 要先引入
#include <cstdlib>
#include <ctime>



cstdlib 與 ctime 都以 c 開頭,代表這兩個是由 C 語言而來的程式庫 (library) ,引入後就可值皆使用裡頭的函數。


setcArray() 也要修改
void Encrypt::setcArray() {
    srand(time(0));
    
    int a = 0;
    int b = 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++; 
    }
    
    cArray = s;
}


接著來編譯測試看看囉



嗯,結果看起來有些奇怪,居然有都是 j 的密碼表,最後一次執行也發生錯誤情況,這會是什麼問題呢?經過後續測試,我們發現問題主要發生在 a 為偶數的時候,因此 setcArray() 需要再一次修改
void Encrypt::setcArray() {
    srand(time(0));
    
    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++; 
    }
    
    cArray = s;
}


這個後續測試是印出 ab 的值,然後找出發生問題的情況。


這樣一來, a 就不會是偶數了



密碼表沒問題了,接下來我們開始實作 toEncode() ,也就是編碼功能的函數。


中英文術語對照
函數function
參數parameter
程式庫library


您可以繼續參考
軟體開發


相關目錄
回 C++ 入門指南
回 C++ 教材目錄
回首頁


參考資料
http://www.cplusplus.com/doc/tutorial/classes/
http://www.cplusplus.com/doc/tutorial/classes2/

2 則留言:

sjgau 提到...

rand() 的嚴重缺點:他所產生的亂數範圍太小,
只有 0 - 32767,

time() 的缺點:他的傳回資料是 秒,
他只能精確到 秒。

Kaiching Chang 提到...

rand() 與 time() 為標準程式庫中符合需求的兩個函數,兩者不是完美的,達到程式的實用目的才是最重要的。

開發軟體最重要的是達到符合需求的目的,自然無法優先考量所用程式庫,或任何自行開發的程式是否達到完美的境界。