首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 考場隨機排座系統開發:Excel 匯入、常態分布亂數與列印預覽

     編輯:VC 教學

系統需求

  • 匯入 Excel/Word 學生名單 (實際採 Excel → TXT 轉換)。
  • 產生符合數學統計特性的隨機座號 (避免偽隨機規律)。
  • 列印座次表供監考宣讀,支援預覽。

關鍵模組實作

1. Excel 資料匯入 (呼叫外部轉換工具)


CString cmdLine = exePath + _T("XLSConverter.exe ") +
    _T("C:\\temp\\XLS\\temp.xls") + _T(" txt C:\\temp\\XLS");

STARTUPINFO si = { sizeof(STARTUPINFO) };
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;

if (!CreateProcess(NULL, cmdLine.GetBuffer(), NULL, NULL, TRUE,
    0, NULL, NULL, &si, &pi))
{
    AfxMessageBox(_T("轉換引擎啟動失敗"));
    return;
}
WaitForSingleObject(pi.hProcess, INFINITE); // 等待轉換完成
CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
// 後續讀取產生的 temp.txt 解析學生資料

2. 常態分布隨機數產生 (拒絕採樣法)


class CRandomGen
{
    static const double PI;
public:
    // 產生 [min, max] 區間均勻隨機數 (4 位小數精度)
    double AverageRandom(double min, double max)
    {
        int minI = (int)(min * 10000);
        int maxI = (int)(max * 10000);
        int r = (rand() * rand()) % (maxI - minI) + minI;
        return r / 10000.0;
    }

    // 常態分布機率密度函數
    double Normal(double x, double miu, double sigma)
    {
        return 1.0 / (sqrt(2*PI)*sigma) * exp(-(x-miu)*(x-miu)/(2*sigma*sigma));
    }

    // 拒絕採樣:只接受落在常態曲線下的隨機數
    double NormalRandom(double miu, double sigma, double min, double max)
    {
        double x, y, scope;
        do {
            x = AverageRandom(min, max);
            y = Normal(x, miu, sigma);
            scope = AverageRandom(0, Normal(miu, miu, sigma)); // 最大密度值
        } while (scope > y);
        return x;
    }
};

為每位學生指派一個 NormalRandom 值,依此值排序即得隨機座次,統計分布符合常態分布。

3. 列印架構 (Dialog-based 專案無 Document/View)

  • 建立臨時 CFrameWnd + CView 物件。
  • 呼叫 OnFilePrintPreview() 進入預覽模式。
  • 列印內容在 View 的 OnDraw 繪製表格、學生姓名、座號。

介面展示

主對話框:CListCtrl 顯示匯入名單、隨機結果。工具列提供「匯入」、「隨機排序」、「列印預覽」、「列印」按鈕。

實際效益

  • 減少教務人工排座工時 90% 以上。
  • 隨機演算法通過統計檢定,杜絕人為操作嫌疑。
  • 列印輸出標準化,便於考場張貼與封存。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved