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 100
typedef struct {
int id; // 题目编号
char question[MAX_LENGTH]; // 题干
char difficulty[10]; // 难易程度 (*, **, ***)
int score; // 分值
char optionA[MAX_LENGTH]; // 选项A
char optionB[MAX_LENGTH]; // 选项B
char optionC[MAX_LENGTH]; // 选项C
char optionD[MAX_LENGTH]; // 选项D
char 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;
}