

编译器选项设置
功能说明:试题管理模块
内置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函数)记录内容包含:得分与剩余时间详细错题分析历史记录分隔符("-------------------------")界面空间布局
本系统通过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;}