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

发布于:2025-07-01 ⋅ 阅读:(19) ⋅ 点赞:(0)

 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;
}

 


网站公告

今日签到

点亮在社区的每一天
去签到