巨推学院

用devc++编写的一个题库系统

编译器选项设置功能说明:试题管理模块内置10道单选题题库,涵盖人工智能发展史等知识点采用Fisher-Yates洗牌算法随机抽取全部题目(ShuffleQuestions)每个题目包含题干、4个选项和正确答案(Question结构体)考试 ...

用devc++编写的一个题库系统


用devc++编写的一个题库系统

编译器选项设置

功能说明:
试题管理模块

  • 内置10道单选题题库,涵盖人工智能发展史等知识点
  • 采用Fisher-Yates洗牌算法随机抽取全部题目(ShuffleQuestions)
  • 每个题目包含题干、4个选项和正确答案(Question结构体)
  • 考试界面功能
  • 分页显示系统:支持"上一题/下一题"导航(ID_PREV/ID_NEXT)
  • 实时答题保存:选项选择后立即记录(WM_COMMAND处理)
  • 答题进度提示:显示"第X题/共10题"的题号标识
  • 界面美化:使用Segoe UI字体,浅灰色背景(RGB 245,245,245)
  • 考试计时系统
  • 20分钟倒计时功能(1200秒初始值)
  • 动态时间显示格式(MM:SS)
  • 最后5分钟红色警示(SetTextColor颜色变更)
  • 超时自动交卷(WM_TIMER处理)
  • 智能评分系统
  • 每题10分制,满分100分
  • 自动比对正确答案(correctAnswer字段)
  • 错题记录功能:保存错误题目及正误对比
  • 数据持久化
  • 成绩存档:写入kscj.txt文件(SaveScore函数)
  • 记录内容包含:得分与剩余时间详细错题分析历史记录分隔符("-------------------------")
  • 界面空间布局

  • 用devc++编写的一个题库系统

  • 异常处理机制未作答题目标记为"未作答"窗口关闭时自动终止定时器(WM_DESTROY)文件写入异常处理(is_open检查)
  • 本系统通过Windows消息循环机制(WinMain)驱动,适用于教学场景下的单元知识检测,具备完整的考试流程管理和学习数据分析功能。

    #include <windows.h>#include <vector>#include <string>#include <fstream>#include <ctime>#include <cstdlib>#include <algorithm>#include <random>#define ID_TIMER 1#define ID_NEXT 2#define ID_PREV 3#define ID_SUBMIT 4#define ID_QUESTION 5#define ID_OPTION1 6#define ID_OPTION2 7#define ID_OPTION3 8#define ID_OPTION4 9struct Question {    std::string question;    std::vector<std::string> options;    char correctAnswer;};std::vector<Question> questions = {    {"人工智能元年是哪一年?", {"A. 1945年", "B. 1956年", "C. 1978年", "D. 2010年"}, 'B'},    {"图灵测试的提出者是谁?", {"A. 马文·明斯基", "B. 阿兰·图灵", "C. 杰弗里·辛顿", "D. 詹姆士·莱特希尔"}, 'B'},    {"达特茅斯会议的主要贡献是?", {"A. 发明了第一台计算机", "B. 提出了“人工智能”一词", "C. 开发了深度学习算法", "D. 设计了专家系统"}, 'B'},    {"莱特希尔报告导致人工智能进入了哪个阶段?", {"A. 第一次低谷", "B. 第二次低谷", "C. 第三次高潮", "D. 全面爆发期"}, 'A'},    {"20世纪90年代人工智能的核心观念是?", {"A. 神经网络", "B. 知识", "C. 深度学习", "D. 大数据"}, 'B'},    {"日本第五代计算机计划失败的主要原因是?", {"A. 资金不足", "B. 未突破关键技术", "C. 缺乏政策支持", "D. 市场需求低"}, 'B'},    {"21世纪初人工智能爆发的主要技术推动力是?", {"A. 符号推理", "B. 专家系统", "C. 深度学习", "D. 图灵测试"}, 'C'},    {"我国将人工智能纳入“互联网+”战略的年份是?", {"A. 1978年", "B. 2000年", "C. 2015年", "D. 2020年"}, 'C'},    {"以下哪项是我国人工智能的领先领域?", {"A. 量子计算", "B. 人脸识别", "C. 太空探索", "D. 核能技术"}, 'B'},    {"专家系统的局限性不包括?", {"A. 知识获取困难", "B. 推理能力不足", "C. 开发成本低", "D. 无法形式化所有知识"}, 'C'}};std::vector<Question> selectedQuestions;std::vector<char> userAnswers;int currentQuestionIndex = 0;int score = 0;int timeLeft = 1200; // 20分钟HWND hwndQuestion, hwndOption1, hwndOption2, hwndOption3, hwndOption4;HWND hwndNext, hwndPrev, hwndSubmit, hwndTimer;// 获取当前选择的选项char GetSelectedOption() {    if (SendMessage(hwndOption1, BM_GETCHECK, 0, 0) == BST_CHECKED) return 'A';    if (SendMessage(hwndOption2, BM_GETCHECK, 0, 0) == BST_CHECKED) return 'B';    if (SendMessage(hwndOption3, BM_GETCHECK, 0, 0) == BST_CHECKED) return 'C';    if (SendMessage(hwndOption4, BM_GETCHECK, 0, 0) == BST_CHECKED) return 'D';    return ' '; // 未选择}void ShuffleQuestions() {    std::random_device rd;    std::mt19937 g(rd());    std::shuffle(questions.begin(), questions.end(), g);    selectedQuestions.assign(questions.begin(), questions.begin() + 10);}// 显示当前题目void DisplayQuestion() {    // 获取当前题目    Question& q = selectedQuestions[currentQuestionIndex];        // 动态生成题目标签内容,包含当前题号和总题数    char questionText[256];    sprintf(questionText, "第 %d 题 / 共 %d 题\n%s",         currentQuestionIndex + 1, selectedQuestions.size(), q.question.c_str());    SetWindowText(hwndQuestion, questionText);    // 设置选项内容    SetWindowText(hwndOption1, q.options[0].c_str());    SetWindowText(hwndOption2, q.options[1].c_str());    SetWindowText(hwndOption3, q.options[2].c_str());    SetWindowText(hwndOption4, q.options[3].c_str());    // 恢复用户之前的选择    char savedAnswer = userAnswers[currentQuestionIndex];    SendMessage(hwndOption1, BM_SETCHECK, (savedAnswer == 'A') ? BST_CHECKED : BST_UNCHECKED, 0);    SendMessage(hwndOption2, BM_SETCHECK, (savedAnswer == 'B') ? BST_CHECKED : BST_UNCHECKED, 0);    SendMessage(hwndOption3, BM_SETCHECK, (savedAnswer == 'C') ? BST_CHECKED : BST_UNCHECKED, 0);    SendMessage(hwndOption4, BM_SETCHECK, (savedAnswer == 'D') ? BST_CHECKED : BST_UNCHECKED, 0);}void SaveScore() {    std::ofstream file("kscj.txt", std::ios::app);    if (file.is_open()) {        file << "得分: " << score << "/100\n";        file << "剩余时间: " << timeLeft / 60 << "分" << timeLeft % 60 << "秒\n";        file << "错题记录:\n";        for (size_t i = 0; i < selectedQuestions.size(); ++i) {            if (userAnswers[i] != selectedQuestions[i].correctAnswer) {                file << "问题: " << selectedQuestions[i].question << "\n";                file << "你的答案: " << (userAnswers[i] == ' ' ? "未作答" : std::string(1, userAnswers[i])) << "\n";                file << "正确答案: " << selectedQuestions[i].correctAnswer << "\n\n";            }        }        file << "-------------------------\n";        file.close();    }}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {    switch (msg) {    case WM_CREATE: {        // 设置窗口背景颜色        HBRUSH hBrush = CreateSolidBrush(RGB(245, 245, 245));        SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)hBrush);        // 创建控件        hwndQuestion = CreateWindow("STATIC", "", WS_VISIBLE | WS_CHILD | SS_CENTER,             50, 50, 700, 60, hwnd, (HMENU)ID_QUESTION, NULL, NULL);                // 设置字体        HFONT hFont = CreateFont(20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,             OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, "Segoe UI");        SendMessage(hwndQuestion, WM_SETFONT, (WPARAM)hFont, TRUE);        // 单选按钮分组        hwndOption1 = CreateWindow("BUTTON", "",             WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | WS_GROUP,            50, 150, 700, 30, hwnd, (HMENU)ID_OPTION1, NULL, NULL);        hwndOption2 = CreateWindow("BUTTON", "",             WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,            50, 200, 700, 30, hwnd, (HMENU)ID_OPTION2, NULL, NULL);        hwndOption3 = CreateWindow("BUTTON", "",             WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,            50, 250, 700, 30, hwnd, (HMENU)ID_OPTION3, NULL, NULL);        hwndOption4 = CreateWindow("BUTTON", "",             WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,            50, 300, 700, 30, hwnd, (HMENU)ID_OPTION4, NULL, NULL);        // 设置单选按钮字体        SendMessage(hwndOption1, WM_SETFONT, (WPARAM)hFont, TRUE);        SendMessage(hwndOption2, WM_SETFONT, (WPARAM)hFont, TRUE);        SendMessage(hwndOption3, WM_SETFONT, (WPARAM)hFont, TRUE);        SendMessage(hwndOption4, WM_SETFONT, (WPARAM)hFont, TRUE);        hwndNext = CreateWindow("BUTTON", "下一题",             WS_VISIBLE | WS_CHILD, 50, 400, 100, 40, hwnd, (HMENU)ID_NEXT, NULL, NULL);        hwndPrev = CreateWindow("BUTTON", "上一题",             WS_VISIBLE | WS_CHILD, 200, 400, 100, 40, hwnd, (HMENU)ID_PREV, NULL, NULL);        hwndSubmit = CreateWindow("BUTTON", "交卷",             WS_VISIBLE | WS_CHILD, 350, 400, 100, 40, hwnd, (HMENU)ID_SUBMIT, NULL, NULL);        hwndTimer = CreateWindow("STATIC", "剩余时间: 20:00",             WS_VISIBLE | WS_CHILD | SS_CENTER, 500, 400, 200, 40, hwnd, NULL, NULL, NULL);        // 设置按钮字体        SendMessage(hwndNext, WM_SETFONT, (WPARAM)hFont, TRUE);        SendMessage(hwndPrev, WM_SETFONT, (WPARAM)hFont, TRUE);        SendMessage(hwndSubmit, WM_SETFONT, (WPARAM)hFont, TRUE);        SendMessage(hwndTimer, WM_SETFONT, (WPARAM)hFont, TRUE);        // 初始化        ShuffleQuestions();        userAnswers.resize(selectedQuestions.size(), ' '); // 初始化为未选择状态        DisplayQuestion();        SetTimer(hwnd, ID_TIMER, 1000, NULL);        break;    }    case WM_COMMAND: {        int cmd = LOWORD(wParam);        if (cmd == ID_NEXT || cmd == ID_PREV) {            // 保存当前答案            userAnswers[currentQuestionIndex] = GetSelectedOption();                        // 计算新索引            int newIndex = currentQuestionIndex;            if (cmd == ID_NEXT && currentQuestionIndex < selectedQuestions.size() - 1) {                newIndex++;            } else if (cmd == ID_PREV && currentQuestionIndex > 0) {                newIndex--;            }                        // 如果索引变化,更新显示            if (newIndex != currentQuestionIndex) {                currentQuestionIndex = newIndex;                DisplayQuestion();            }        }         else if (cmd == ID_SUBMIT) {            KillTimer(hwnd, ID_TIMER);            score = 0;            for (size_t i = 0; i < selectedQuestions.size(); ++i) {                if (userAnswers[i] == selectedQuestions[i].correctAnswer) {                    score += 10;                }            }            SaveScore();                        char result[100];            sprintf(result, "得分: %d/100\n剩余时间: %d分%d秒",                 score, timeLeft / 60, timeLeft % 60);            MessageBox(hwnd, result, "考试结束", MB_OK);            PostQuitMessage(0);        }         else if (cmd >= ID_OPTION1 && cmd <= ID_OPTION4) {            // 实时保存选项            userAnswers[currentQuestionIndex] = 'A' + (cmd - ID_OPTION1);        }        break;    }    case WM_TIMER: {        if (timeLeft > 0) {            timeLeft--;            char timeStr[20];            sprintf(timeStr, "剩余时间: %02d:%02d", timeLeft / 60, timeLeft % 60);            SetWindowText(hwndTimer, timeStr);            // 最后5分钟变红            HDC hdc = GetDC(hwndTimer);            SetTextColor(hdc, timeLeft <= 300 ? RGB(255, 0, 0) : RGB(0, 0, 0));            ReleaseDC(hwndTimer, hdc);        } else {            KillTimer(hwnd, ID_TIMER);            MessageBox(hwnd, "时间到!", "考试结束", MB_OK);            PostQuitMessage(0);        }        break;    }    case WM_DESTROY: {        KillTimer(hwnd, ID_TIMER);        PostQuitMessage(0);        break;    }    default:        return DefWindowProc(hwnd, msg, wParam, lParam);    }    return 0;}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,                  LPSTR lpCmdLine, int nCmdShow) {    WNDCLASSEX wc = { sizeof(WNDCLASSEX) };    wc.style = CS_HREDRAW | CS_VREDRAW;    wc.lpfnWndProc = WndProc;    wc.hInstance = hInstance;    wc.hCursor = LoadCursor(NULL, IDC_ARROW);    wc.lpszClassName = "ExamSystem";    RegisterClassEx(&wc);    HWND hwnd = CreateWindow("ExamSystem", "八年级下信息科技第一单元检测",        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,         800, 600, NULL, NULL, hInstance, NULL);    ShowWindow(hwnd, nCmdShow);    UpdateWindow(hwnd);    MSG msg;    while (GetMessage(&msg, NULL, 0, 0)) {        TranslateMessage(&msg);        DispatchMessage(&msg);    }    return msg.wParam;}
    分享到:
    版权声明:本网页内容(包含但不限于文字、图片、视频)由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至zhanzhangtoutiao@163.com举报,一经查实,本站将立刻删除。
    投诉

    登录后发表评论

    已有 0 人参与

    评论

    相关推荐

    80后ABC

    1927篇文章

    TA的文章
    广告
    广告
    广告
    • 今日热文
    • 本周热文
    • 本月热文
        小编推荐    
        热门服务     更多>>>
        热门搜索     更多>>>
        返回顶部