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

四則運算題目生成器設計思路:參數化、去重、多格式輸出

     編輯:關於C語言

小學數學出題器核心設計文檔:從需求到算法

為小學生自動生成四則運算練習題,看似簡單,實則涉及隨機數種子控制、題目去重、參數化配置、輸出格式化等工程問題。本文梳理版本 2 的設計思路,作為後續實現的藍圖。

核心需求

  1. 題目不重複: 同一運行內不生成相同算式(如 `3+5` 與 `5+3` 視為不同或相同可配置)。
  2. 參數可定制: 題目數量、數值範圍、運算符集合、是否允許負數、輸出格式(縱向/網格)。
  3. 邏輯分層: 主函數處理用戶交互與參數收集,核心函數專注生成與格式化,便於單元測試與複用。

算法設計

隨機數控制

srand(time(NULL)); // 程序啟動一次,保證每次運行序列不同

若需可復現(如教師發放固定試卷),可添加種子參數 `srand(seed)`。

去重策略

  • 集合法: 用哈希集合存儲已生成算式鍵(如 `"a+op+b"`),生成前查重。題目量小時(<1000)極其高效。
  • 全排列洗牌: 預先生成所有合法算式列表,Fisher-Yates 洗牌後取前 N 道。題目空間小(如 100 以內加減乘除約 4萬條)可行。

運算符與數值約束

// 運算符隨機選擇
int op = rand() % op_count; // 0:+, 1:-, 2:*, 3:/

// 減法:被減數 >= 減數(不產生負數)
if (op == 1) { if (a < b) swap(a,b); }

// 除法:被除數 % 除數 == 0(整除)且除數 != 0
if (op == 3) {
    do { a = rand()%range; b = rand()%range+1; }
    while (a % b != 0);
}

輸出格式化

  • 縱向列表: 每行一道 `a + b =`,適合打印裁切。
  • 網格矩陣: 指定列數 `cols`,每行輸出 `cols` 道,用 `\t` 或固定寬度對齊。
    例:`rows=5, cols=4` → 20 道題,5 行 4 列。

模塊劃分

// 主程序
int main() {
    Config cfg = parse_user_input(); // 交互收集參數
    Question *qs = generate_questions(cfg); // 核心生成
    format_output(qs, cfg);           // 格式化輸出
    free_questions(qs);
}

// 核心結構
typedef struct { int a, b; char op; } Question;
typedef struct {
    int count; int min_val, max_val;
    bool allow_negative; bool unique;
    char ops[4]; int op_count;
    int format; // 0:列表, 1:網格
    int rows, cols;
} Config;

擴展思考

  • 難度分級:按數值範圍、運算符複雜度、是否進位/借位分級。
  • 導出格式:支持 PDF/Word/圖片/LaTeX,便於打印與電子分發。
  • 錯題本模式:記錄作答錯誤題目,智能推薦薄弱知識點練習。
  • Web/App 端:前端 React/Vue + 後端 API,實現隨時隨地練習。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved