当前位置: 首页 > news >正文

【c语言课程设计】单选题考试系统(无链表,含码源)

 1.预期单选题考试系统菜单页面

2.菜单页面

// 清屏并显示标题
void clearScreen() {system("cls");printf("****************************************\n");printf("********单项选择题标准化考试系统********\n");printf("****************************************\n");
}
// 显示主菜单
void showMenu() {clearScreen();printf("主菜单\n\n");printf("1. 输入题目\n");printf("2. 查询题目\n");printf("3. 修改题目\n");printf("4. 删除题目\n");printf("5. 题目统计\n");printf("6. 开始考试\n");printf("0. 退出系统\n");printf("\n请选择操作(0-6): ");
}

3.选择对应操作

4.文件保存、读取题目

// 保存题目到文件
int saveQuestions() {FILE* fp = fopen("questions.dat", "wb");if (fp == NULL) {printf("无法打开文件进行保存!\n");return 0;}fwrite(&questionCount, sizeof(int), 1, fp);fwrite(questionBank, sizeof(Question), questionCount, fp);fclose(fp);return 1;
}// 从文件读取题目
int loadQuestions() {FILE* fp = fopen("questions.dat", "rb");if (fp == NULL) {printf("未找到题库文件,将创建新题库!\n");return 0;}fread(&questionCount, sizeof(int), 1, fp);if (questionCount > MAX_QUESTIONS) {printf("题库文件损坏,加载失败!\n");fclose(fp);return 0;}fread(questionBank, sizeof(Question), questionCount, fp);fclose(fp);return 1;
}

5.输入题目

// 输入题目
void inputQuestions() {clearScreen();printf("=== 题目输入功能 ===\n\n");if (questionCount >= MAX_QUESTIONS) {printf("题库已满,无法添加更多题目!\n");return;}printf("当前题库中有 %d 道题目,最多可添加 %d 道\n", questionCount, MAX_QUESTIONS - questionCount);printf("请输入要添加的题目数量: ");int addCount;scanf("%d", &addCount);getchar(); // 消耗换行符if (addCount <= 0 || addCount > MAX_QUESTIONS - questionCount) {printf("输入数量无效!\n");return;}for (int i = 0; i < addCount; i++) {printf("\n=== 正在输入第 %d 题 ===\n", questionCount + 1);// 题目编号自动生成questionBank[questionCount].id = questionCount + 1;printf("请输入题干: ");fgets(questionBank[questionCount].question, MAX_LENGTH, stdin);questionBank[questionCount].question[strcspn(questionBank[questionCount].question, "\n")] = '\0';printf("请输入难易程度 (*/**/***): ");scanf("%s", questionBank[questionCount].difficulty);getchar();printf("请输入分值: ");scanf("%d", &questionBank[questionCount].score);getchar();printf("请输入选项A: ");fgets(questionBank[questionCount].optionA, MAX_LENGTH, stdin);questionBank[questionCount].optionA[strcspn(questionBank[questionCount].optionA, "\n")] = '\0';printf("请输入选项B: ");fgets(questionBank[questionCount].optionB, MAX_LENGTH, stdin);questionBank[questionCount].optionB[strcspn(questionBank[questionCount].optionB, "\n")] = '\0';printf("请输入选项C: ");fgets(questionBank[questionCount].optionC, MAX_LENGTH, stdin);questionBank[questionCount].optionC[strcspn(questionBank[questionCount].optionC, "\n")] = '\0';printf("请输入选项D: ");fgets(questionBank[questionCount].optionD, MAX_LENGTH, stdin);questionBank[questionCount].optionD[strcspn(questionBank[questionCount].optionD, "\n")] = '\0';printf("请输入正确答案(A/B/C/D): ");scanf(" %c", &questionBank[questionCount].correctAnswer);getchar();// 显示刚输入的题目供确认displayQuestion(questionCount);printf("确认添加此题吗?(Y/N): ");char confirm = getchar();getchar();if (toupper(confirm) == 'Y') {questionCount++;printf("题目添加成功!\n");}else {printf("题目已取消添加!\n");}}if (saveQuestions()) {printf("\n题目已成功保存!\n");}else {printf("\n题目保存失败!\n");}
}

 

6.查询题目

// 查询题目
void queryQuestions() {clearScreen();printf("=== 题目查询功能 ===\n\n");if (questionCount == 0) {printf("题库为空,没有可查询的题目!\n");return;}printf("1. 按编号查询\n");printf("2. 按难度查询\n");printf("3. 显示全部题目\n");printf("请选择查询方式: ");int choice;scanf("%d", &choice);getchar();if (choice == 1) {int id;printf("请输入要查询的题目编号: ");scanf("%d", &id);getchar();int found = 0;for (int i = 0; i < questionCount; i++) {if (questionBank[i].id == id) {found = 1;displayQuestion(i);break;}}if (!found) {printf("未找到编号为 %d 的题目!\n", id);}}else if (choice == 2) {char difficulty[10];printf("请输入要查询的题目难度(*/**/***): ");scanf("%s", difficulty);getchar();printf("\n=== 难度为 %s 的题目 ===\n", difficulty);int found = 0;for (int i = 0; i < questionCount; i++) {if (strcmp(questionBank[i].difficulty, difficulty) == 0) {found++;displayQuestion(i);}}if (!found) {printf("没有找到难度为 %s 的题目!\n", difficulty);}else {printf("\n共找到 %d 道难度为 %s 的题目\n", found, difficulty);}}else if (choice == 3) {printf("\n=== 题库全部题目 ===\n");printf("共 %d 道题目\n\n", questionCount);for (int i = 0; i < questionCount; i++) {displayQuestion(i);}}else {printf("无效的选择!\n");}
}

 

 

7.修改题目

// 修改题目
void modifyQuestion() {clearScreen();printf("=== 题目修改功能 ===\n\n");if (questionCount == 0) {printf("题库为空,没有可修改的题目!\n");return;}printf("当前题库中的题目编号: ");for (int i = 0; i < questionCount; i++) {printf("%d ", questionBank[i].id);}printf("\n");int id;printf("请输入要修改的题目编号: ");scanf("%d", &id);getchar();int index = -1;for (int i = 0; i < questionCount; i++) {if (questionBank[i].id == id) {index = i;break;}}if (index == -1) {printf("未找到编号为 %d 的题目!\n", id);return;}// 显示原题目信息printf("\n=== 当前题目信息 ===\n");displayQuestion(index);printf("\n=== 请输入新的题目信息 ===\n");printf("(直接回车保持原内容)\n");printf("请输入题干: ");char input[MAX_LENGTH];fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].question, input);}printf("请输入难度: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].difficulty, input);}printf("请输入分值(输入0保持原内容): ");int score;char scoreInput[10];fgets(scoreInput, sizeof(scoreInput), stdin);if (strlen(scoreInput) > 0 && atoi(scoreInput) > 0) {questionBank[index].score = atoi(scoreInput);}printf("请输入选项A: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].optionA, input);}printf("请输入选项B: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].optionB, input);}printf("请输入选项C: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].optionC, input);}printf("请输入选项D: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].optionD, input);}printf("请输入正确答案: ");char answer;char answerInput[10];fgets(answerInput, sizeof(answerInput), stdin);if (strlen(answerInput) > 0) {answer = toupper(answerInput[0]);if (answer == 'A' || answer == 'B' || answer == 'C' || answer == 'D') {questionBank[index].correctAnswer = answer;}}// 显示修改后的题目printf("\n=== 修改后的题目 ===\n");displayQuestion(index);if (saveQuestions()) {printf("\n题目修改成功并已保存!\n");}else {printf("\n题目修改成功但保存失败!\n");}
}

 

8.删除题目

// 删除题目
void deleteQuestion() {clearScreen();printf("=== 题目删除功能 ===\n\n");if (questionCount == 0) {printf("题库为空,没有可删除的题目!\n");return;}printf("当前题库中的题目编号: ");for (int i = 0; i < questionCount; i++) {printf("%d ", questionBank[i].id);}printf("\n");int id;printf("请输入要删除的题目编号: ");scanf("%d", &id);getchar();int index = -1;for (int i = 0; i < questionCount; i++) {if (questionBank[i].id == id) {index = i;break;}}if (index == -1) {printf("未找到编号为 %d 的题目!\n", id);return;}printf("\n=== 将要删除的题目信息 ===\n");displayQuestion(index);printf("\n确认要删除吗?(Y/N): ");char confirm = getchar();getchar();if (toupper(confirm) == 'Y') {// 将后面的题目前移for (int i = index; i < questionCount - 1; i++) {questionBank[i] = questionBank[i + 1];}questionCount--;if (saveQuestions()) {printf("\n题目删除成功并已保存!\n");}else {printf("\n题目删除成功但保存失败!\n");}}else {printf("\n已取消删除操作!\n");}
}

 

9.题目统计

// 统计题目
void statistics() {clearScreen();printf("=== 题目统计功能 ===\n\n");if (questionCount == 0) {printf("题库为空,没有可统计的题目!\n");return;}int easy = 0, medium = 0, hard = 0;int score1 = 0, score2 = 0, score3 = 0, scoreOther = 0;int totalScore = 0;for (int i = 0; i < questionCount; i++) {// 按难度统计if (strcmp(questionBank[i].difficulty, "*") == 0) {easy++;}else if (strcmp(questionBank[i].difficulty, "**") == 0) {medium++;}else if (strcmp(questionBank[i].difficulty, "***") == 0) {hard++;}// 按分值统计if (questionBank[i].score == 1) {score1++;}else if (questionBank[i].score == 2) {score2++;}else if (questionBank[i].score == 3) {score3++;}else {scoreOther++;}totalScore += questionBank[i].score;}printf("=== 按难度统计 ===\n");printf("简单题(*): %d 道 (%.1f%%)\n", easy, (float)easy / questionCount * 100);printf("中等题(**): %d 道 (%.1f%%)\n", medium, (float)medium / questionCount * 100);printf("难题(***): %d 道 (%.1f%%)\n", hard, (float)hard / questionCount * 100);printf("\n=== 按分值统计 ===\n");printf("1分题: %d 道\n", score1);printf("2分题: %d 道\n", score2);printf("3分题: %d 道\n", score3);if (scoreOther > 0) {printf("其他分值: %d 道\n", scoreOther);}printf("\n题库总分: %d 分\n", totalScore);printf("题库中共有 %d 道题目\n", questionCount);// 显示一个随机题目示例if (questionCount > 0) {srand((unsigned int)time(NULL));int sample = rand() % questionCount;printf("\n=== 随机题目示例 ===\n");displayQuestion(sample);}
}

 

10.开始考试

// 检查题目是否已被选中
int isAlreadySelected(int* selected, int count, int index) {for (int i = 0; i < count; i++) {if (selected[i] == index) {return 1;}}return 0;
}// 考试功能
void takeExam() {clearScreen();printf("=== 考试功能 ===\n\n");if (questionCount == 0) {printf("题库为空,无法进行考试!\n");return;}int numQuestions;printf("题库中共有 %d 道题目\n", questionCount);printf("请输入要抽取的题目数量(1-%d): ", questionCount);scanf("%d", &numQuestions);getchar();if (numQuestions <= 0 || numQuestions > questionCount) {printf("无效的题目数量!\n");return;}// 随机抽题srand((unsigned int)time(NULL));int* selected = (int*)malloc(numQuestions * sizeof(int));if (selected == NULL) {printf("内存分配失败!\n");return;}// 初始化选择数组for (int i = 0; i < numQuestions; i++) {selected[i] = -1;}// 随机选择不重复的题目for (int i = 0; i < numQuestions; i++) {int index;do {index = rand() % questionCount;} while (isAlreadySelected(selected, i, index));selected[i] = index;}// 开始考试int totalScore = 0;int earnedScore = 0;printf("\n=== 考试开始 ===\n");printf("共 %d 题,请认真作答\n\n", numQuestions);for (int i = 0; i < numQuestions; i++) {int qIndex = selected[i];totalScore += questionBank[qIndex].score;printf("\n第 %d/%d 题 (分值: %d, 难度: %s)\n",i + 1, numQuestions,questionBank[qIndex].score,questionBank[qIndex].difficulty);printf("题目: %s\n", questionBank[qIndex].question);printf("  A. %s\n", questionBank[qIndex].optionA);printf("  B. %s\n", questionBank[qIndex].optionB);printf("  C. %s\n", questionBank[qIndex].optionC);printf("  D. %s\n", questionBank[qIndex].optionD);printf("你的答案(A/B/C/D): ");char answer;scanf(" %c", &answer);getchar();if (toupper(answer) == toupper(questionBank[qIndex].correctAnswer)) {printf("回答正确! +%d分\n", questionBank[qIndex].score);earnedScore += questionBank[qIndex].score;}else {printf("回答错误! 正确答案是 %c\n", questionBank[qIndex].correctAnswer);}}printf("\n=== 考试结束 ===\n");printf("你的得分: %d/%d (%.1f%%)\n",earnedScore, totalScore,(float)earnedScore / totalScore * 100);free(selected);
}

 

11.退出系统

12.单选题考试系统源代码

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>#define MAX_QUESTIONS 100
#define MAX_LENGTH 100typedef struct {int id;                  // 题目编号char question[MAX_LENGTH]; // 题干char difficulty[10];     // 难易程度 (*, **, ***)int score;               // 分值char optionA[MAX_LENGTH]; // 选项Achar optionB[MAX_LENGTH]; // 选项Bchar optionC[MAX_LENGTH]; // 选项Cchar optionD[MAX_LENGTH]; // 选项Dchar correctAnswer;      // 正确答案 (A/B/C/D)
} Question;Question questionBank[MAX_QUESTIONS];
int questionCount = 0; // 当前题目数量// 清屏并显示标题
void clearScreen() {system("cls");printf("****************************************\n");printf("********单项选择题标准化考试系统********\n");printf("****************************************\n");
}// 保存题目到文件
int saveQuestions() {FILE* fp = fopen("questions.dat", "wb");if (fp == NULL) {printf("无法打开文件进行保存!\n");return 0;}fwrite(&questionCount, sizeof(int), 1, fp);fwrite(questionBank, sizeof(Question), questionCount, fp);fclose(fp);return 1;
}// 从文件读取题目
int loadQuestions() {FILE* fp = fopen("questions.dat", "rb");if (fp == NULL) {printf("未找到题库文件,将创建新题库!\n");return 0;}fread(&questionCount, sizeof(int), 1, fp);if (questionCount > MAX_QUESTIONS) {printf("题库文件损坏,加载失败!\n");fclose(fp);return 0;}fread(questionBank, sizeof(Question), questionCount, fp);fclose(fp);return 1;
}// 显示单个题目详情
void displayQuestion(int index) {printf("\n=== 题目详情 [编号:%d] ===\n", questionBank[index].id);printf("【题干】 %s\n", questionBank[index].question);printf("【难度】 %s\n", questionBank[index].difficulty);printf("【分值】 %d\n", questionBank[index].score);printf("【选项】\n");printf("  A. %s\n", questionBank[index].optionA);printf("  B. %s\n", questionBank[index].optionB);printf("  C. %s\n", questionBank[index].optionC);printf("  D. %s\n", questionBank[index].optionD);printf("【正确答案】 %c\n", questionBank[index].correctAnswer);printf("============================\n");
}// 输入题目
void inputQuestions() {clearScreen();printf("=== 题目输入功能 ===\n\n");if (questionCount >= MAX_QUESTIONS) {printf("题库已满,无法添加更多题目!\n");return;}printf("当前题库中有 %d 道题目,最多可添加 %d 道\n", questionCount, MAX_QUESTIONS - questionCount);printf("请输入要添加的题目数量: ");int addCount;scanf("%d", &addCount);getchar(); // 消耗换行符if (addCount <= 0 || addCount > MAX_QUESTIONS - questionCount) {printf("输入数量无效!\n");return;}for (int i = 0; i < addCount; i++) {printf("\n=== 正在输入第 %d 题 ===\n", questionCount + 1);// 题目编号自动生成questionBank[questionCount].id = questionCount + 1;printf("请输入题干: ");fgets(questionBank[questionCount].question, MAX_LENGTH, stdin);questionBank[questionCount].question[strcspn(questionBank[questionCount].question, "\n")] = '\0';printf("请输入难易程度 (*/**/***): ");scanf("%s", questionBank[questionCount].difficulty);getchar();printf("请输入分值: ");scanf("%d", &questionBank[questionCount].score);getchar();printf("请输入选项A: ");fgets(questionBank[questionCount].optionA, MAX_LENGTH, stdin);questionBank[questionCount].optionA[strcspn(questionBank[questionCount].optionA, "\n")] = '\0';printf("请输入选项B: ");fgets(questionBank[questionCount].optionB, MAX_LENGTH, stdin);questionBank[questionCount].optionB[strcspn(questionBank[questionCount].optionB, "\n")] = '\0';printf("请输入选项C: ");fgets(questionBank[questionCount].optionC, MAX_LENGTH, stdin);questionBank[questionCount].optionC[strcspn(questionBank[questionCount].optionC, "\n")] = '\0';printf("请输入选项D: ");fgets(questionBank[questionCount].optionD, MAX_LENGTH, stdin);questionBank[questionCount].optionD[strcspn(questionBank[questionCount].optionD, "\n")] = '\0';printf("请输入正确答案(A/B/C/D): ");scanf(" %c", &questionBank[questionCount].correctAnswer);getchar();// 显示刚输入的题目供确认displayQuestion(questionCount);printf("确认添加此题吗?(Y/N): ");char confirm = getchar();getchar();if (toupper(confirm) == 'Y') {questionCount++;printf("题目添加成功!\n");}else {printf("题目已取消添加!\n");}}if (saveQuestions()) {printf("\n题目已成功保存!\n");}else {printf("\n题目保存失败!\n");}
}// 查询题目
void queryQuestions() {clearScreen();printf("=== 题目查询功能 ===\n\n");if (questionCount == 0) {printf("题库为空,没有可查询的题目!\n");return;}printf("1. 按编号查询\n");printf("2. 按难度查询\n");printf("3. 显示全部题目\n");printf("请选择查询方式: ");int choice;scanf("%d", &choice);getchar();if (choice == 1) {int id;printf("请输入要查询的题目编号: ");scanf("%d", &id);getchar();int found = 0;for (int i = 0; i < questionCount; i++) {if (questionBank[i].id == id) {found = 1;displayQuestion(i);break;}}if (!found) {printf("未找到编号为 %d 的题目!\n", id);}}else if (choice == 2) {char difficulty[10];printf("请输入要查询的题目难度(*/**/***): ");scanf("%s", difficulty);getchar();printf("\n=== 难度为 %s 的题目 ===\n", difficulty);int found = 0;for (int i = 0; i < questionCount; i++) {if (strcmp(questionBank[i].difficulty, difficulty) == 0) {found++;displayQuestion(i);}}if (!found) {printf("没有找到难度为 %s 的题目!\n", difficulty);}else {printf("\n共找到 %d 道难度为 %s 的题目\n", found, difficulty);}}else if (choice == 3) {printf("\n=== 题库全部题目 ===\n");printf("共 %d 道题目\n\n", questionCount);for (int i = 0; i < questionCount; i++) {displayQuestion(i);}}else {printf("无效的选择!\n");}
}// 修改题目
void modifyQuestion() {clearScreen();printf("=== 题目修改功能 ===\n\n");if (questionCount == 0) {printf("题库为空,没有可修改的题目!\n");return;}printf("当前题库中的题目编号: ");for (int i = 0; i < questionCount; i++) {printf("%d ", questionBank[i].id);}printf("\n");int id;printf("请输入要修改的题目编号: ");scanf("%d", &id);getchar();int index = -1;for (int i = 0; i < questionCount; i++) {if (questionBank[i].id == id) {index = i;break;}}if (index == -1) {printf("未找到编号为 %d 的题目!\n", id);return;}// 显示原题目信息printf("\n=== 当前题目信息 ===\n");displayQuestion(index);printf("\n=== 请输入新的题目信息 ===\n");printf("(直接回车保持原内容)\n");printf("请输入题干: ");char input[MAX_LENGTH];fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].question, input);}printf("请输入难度: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].difficulty, input);}printf("请输入分值(输入0保持原内容): ");int score;char scoreInput[10];fgets(scoreInput, sizeof(scoreInput), stdin);if (strlen(scoreInput) > 0 && atoi(scoreInput) > 0) {questionBank[index].score = atoi(scoreInput);}printf("请输入选项A: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].optionA, input);}printf("请输入选项B: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].optionB, input);}printf("请输入选项C: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].optionC, input);}printf("请输入选项D: ");fgets(input, MAX_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';if (strlen(input) > 0) {strcpy(questionBank[index].optionD, input);}printf("请输入正确答案: ");char answer;char answerInput[10];fgets(answerInput, sizeof(answerInput), stdin);if (strlen(answerInput) > 0) {answer = toupper(answerInput[0]);if (answer == 'A' || answer == 'B' || answer == 'C' || answer == 'D') {questionBank[index].correctAnswer = answer;}}// 显示修改后的题目printf("\n=== 修改后的题目 ===\n");displayQuestion(index);if (saveQuestions()) {printf("\n题目修改成功并已保存!\n");}else {printf("\n题目修改成功但保存失败!\n");}
}// 删除题目
void deleteQuestion() {clearScreen();printf("=== 题目删除功能 ===\n\n");if (questionCount == 0) {printf("题库为空,没有可删除的题目!\n");return;}printf("当前题库中的题目编号: ");for (int i = 0; i < questionCount; i++) {printf("%d ", questionBank[i].id);}printf("\n");int id;printf("请输入要删除的题目编号: ");scanf("%d", &id);getchar();int index = -1;for (int i = 0; i < questionCount; i++) {if (questionBank[i].id == id) {index = i;break;}}if (index == -1) {printf("未找到编号为 %d 的题目!\n", id);return;}printf("\n=== 将要删除的题目信息 ===\n");displayQuestion(index);printf("\n确认要删除吗?(Y/N): ");char confirm = getchar();getchar();if (toupper(confirm) == 'Y') {// 将后面的题目前移for (int i = index; i < questionCount - 1; i++) {questionBank[i] = questionBank[i + 1];}questionCount--;if (saveQuestions()) {printf("\n题目删除成功并已保存!\n");}else {printf("\n题目删除成功但保存失败!\n");}}else {printf("\n已取消删除操作!\n");}
}// 统计题目
void statistics() {clearScreen();printf("=== 题目统计功能 ===\n\n");if (questionCount == 0) {printf("题库为空,没有可统计的题目!\n");return;}int easy = 0, medium = 0, hard = 0;int score1 = 0, score2 = 0, score3 = 0, scoreOther = 0;int totalScore = 0;for (int i = 0; i < questionCount; i++) {// 按难度统计if (strcmp(questionBank[i].difficulty, "*") == 0) {easy++;}else if (strcmp(questionBank[i].difficulty, "**") == 0) {medium++;}else if (strcmp(questionBank[i].difficulty, "***") == 0) {hard++;}// 按分值统计if (questionBank[i].score == 1) {score1++;}else if (questionBank[i].score == 2) {score2++;}else if (questionBank[i].score == 3) {score3++;}else {scoreOther++;}totalScore += questionBank[i].score;}printf("=== 按难度统计 ===\n");printf("简单题(*): %d 道 (%.1f%%)\n", easy, (float)easy / questionCount * 100);printf("中等题(**): %d 道 (%.1f%%)\n", medium, (float)medium / questionCount * 100);printf("难题(***): %d 道 (%.1f%%)\n", hard, (float)hard / questionCount * 100);printf("\n=== 按分值统计 ===\n");printf("1分题: %d 道\n", score1);printf("2分题: %d 道\n", score2);printf("3分题: %d 道\n", score3);if (scoreOther > 0) {printf("其他分值: %d 道\n", scoreOther);}printf("\n题库总分: %d 分\n", totalScore);printf("题库中共有 %d 道题目\n", questionCount);// 显示一个随机题目示例if (questionCount > 0) {srand((unsigned int)time(NULL));int sample = rand() % questionCount;printf("\n=== 随机题目示例 ===\n");displayQuestion(sample);}
}// 检查题目是否已被选中
int isAlreadySelected(int* selected, int count, int index) {for (int i = 0; i < count; i++) {if (selected[i] == index) {return 1;}}return 0;
}// 考试功能
void takeExam() {clearScreen();printf("=== 考试功能 ===\n\n");if (questionCount == 0) {printf("题库为空,无法进行考试!\n");return;}int numQuestions;printf("题库中共有 %d 道题目\n", questionCount);printf("请输入要抽取的题目数量(1-%d): ", questionCount);scanf("%d", &numQuestions);getchar();if (numQuestions <= 0 || numQuestions > questionCount) {printf("无效的题目数量!\n");return;}// 随机抽题srand((unsigned int)time(NULL));int* selected = (int*)malloc(numQuestions * sizeof(int));if (selected == NULL) {printf("内存分配失败!\n");return;}// 初始化选择数组for (int i = 0; i < numQuestions; i++) {selected[i] = -1;}// 随机选择不重复的题目for (int i = 0; i < numQuestions; i++) {int index;do {index = rand() % questionCount;} while (isAlreadySelected(selected, i, index));selected[i] = index;}// 开始考试int totalScore = 0;int earnedScore = 0;printf("\n=== 考试开始 ===\n");printf("共 %d 题,请认真作答\n\n", numQuestions);for (int i = 0; i < numQuestions; i++) {int qIndex = selected[i];totalScore += questionBank[qIndex].score;printf("\n第 %d/%d 题 (分值: %d, 难度: %s)\n",i + 1, numQuestions,questionBank[qIndex].score,questionBank[qIndex].difficulty);printf("题目: %s\n", questionBank[qIndex].question);printf("  A. %s\n", questionBank[qIndex].optionA);printf("  B. %s\n", questionBank[qIndex].optionB);printf("  C. %s\n", questionBank[qIndex].optionC);printf("  D. %s\n", questionBank[qIndex].optionD);printf("你的答案(A/B/C/D): ");char answer;scanf(" %c", &answer);getchar();if (toupper(answer) == toupper(questionBank[qIndex].correctAnswer)) {printf("回答正确! +%d分\n", questionBank[qIndex].score);earnedScore += questionBank[qIndex].score;}else {printf("回答错误! 正确答案是 %c\n", questionBank[qIndex].correctAnswer);}}printf("\n=== 考试结束 ===\n");printf("你的得分: %d/%d (%.1f%%)\n",earnedScore, totalScore,(float)earnedScore / totalScore * 100);free(selected);
}// 显示主菜单
void showMenu() {clearScreen();printf("主菜单\n\n");printf("1. 输入题目\n");printf("2. 查询题目\n");printf("3. 修改题目\n");printf("4. 删除题目\n");printf("5. 题目统计\n");printf("6. 开始考试\n");printf("0. 退出系统\n");printf("\n请选择操作(0-6): ");
}int main() {// 加载题库loadQuestions();while (1) {showMenu();int choice;if (scanf("%d", &choice) != 1) {printf("输入无效,请输入数字!\n");while (getchar() != '\n'); // 清空输入缓冲区continue;}getchar(); // 消耗换行符switch (choice) {case 1:inputQuestions();break;case 2:queryQuestions();break;case 3:modifyQuestion();break;case 4:deleteQuestion();break;case 5:statistics();break;case 6:takeExam();break;case 0:printf("感谢使用,再见!\n");return 0;default:printf("无效的选择,请重新输入!\n");}printf("\n按任意键返回主菜单...");getchar();}return 0;
}

 

http://www.dtcms.com/a/263283.html

相关文章:

  • 多校区在线跑腿小程序源码系统搭建平台 PHP+MySQL组合开发 含完整的搭建教程
  • 商品中心—16.库存分桶调配的技术文档
  • 【分布式】自定义统一状态机流转设计
  • Flowable01SpringBoot项目的引入--------------------每天都会更新,自学中
  • 组成原理精讲课--硬布线控制器和微程序控制器
  • STM32之火焰传感器模块(四针)
  • 11、类加载器
  • 项目:数据库应用系统开发:智能电商管理系统
  • 【Springai】项目实战进度和规划
  • 【FR801xH】富芮坤FR801xH之PMU GPIO
  • OpenCV CUDA模块设备层----- 正切(tangent)运算函数tan()
  • Python 数据分析与机器学习入门 (五):Matplotlib 数据可视化基础
  • R1-Searcher使用强化学习增强语言模型解决问题的搜索能力
  • WebSocket 的核心原理和工作流程
  • 前端Vue面试八股常考题(一)
  • 企业流程知识:《超越再造:以流程为中心的组织如何改变我们的工作和生活》读书笔记
  • 力扣面试150(7/150)
  • 【c/c++2】多线程,动静态库,信号,socket
  • 如何让宿主机完全看不到Wi-Fi?虚拟机独立联网隐匿上网实战!
  • 【知识图谱构建系列7】:结果评价(1)
  • 可编辑39页PPT | 数字化工厂蓝图整体框架建设举措建设路径实施路线规划建设方案
  • 从入门到精通:npm、npx、nvm 包管理工具详解及常用命令
  • Microsoft Edge 打开无反应、打开后显示兼容性问题、卸载重装 解决方案。一键卸载Microsoft Edge 。
  • 卫朋:华为流程体系拆解系列——IPD流程L1-L6分级导入实战演练
  • android BottomSheet及AlertDialog的几种material3 常见ui的用法
  • vue上传各种文件,并预览组件,(预览,下载),下载resources目录下文件
  • vmware 17 安装win11 24h2
  • 【解析】 微服务测试工具Parasoft SOAtest如何为响应式架构助力?
  • MongoDB 常见查询语法与命令详解
  • 设计模式精讲 Day 19:观察者模式(Observer Pattern)