C语言学生管理系统(全部代码,复制即用)

前言

无套路,均已上机通过,求个关注求个赞,提供答疑解惑服务。

功能

本课题要求用C语言编写某班级学生学情管理系统。对一个有若干个学生的学院,每个学生有N门课程,系统实现对学生情况的管理。学生信息包括:学号、姓名、班级、身高、体重、身体健康,各门课程的成绩、家庭住址、本人联系电话、紧急联系人及联系电话、本人QQ号、本人特长、本人智育排名、任课教师姓名及手机号等信息。系统要求能够实现以下功能:

  • 1、 信息录入:建立学生情况记录数据库;
  • 2、 显示:按照学号顺序显示所有学生信息记录;
  • 3、 增加记录:增加学生的信息记录;
  • 4、 修改(要求先输入密码):可修改某个学生的基本信息(学号不可改变)。
  • 5、 删除:删除一个或多个学生的记录;
  • 6、 检索:可按“学号”、“姓名”或者“手机号”查询学生的记录,可提供模糊检索;
  • 7、 成绩统计:可显示某门课程最高成绩及其名单、最差成绩及其名单、平均成绩、及格人数、不及格人数、及格率;
  • 8、 智育排名序:按照智育排名排序,并将学生信息按顺序显示。

运行截图

在这里插入图片描述

所有代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char studentID[20];
    char name[20];
    float height;
    float weight;
    char address[50];
    char phoneNumber[15];
    char emergencyContact[20];
    char emergencyPhoneNumber[15];
    char qqNumber[15];
    char specialSkills[50];
    int intelligenceRank;
    char teacherName[20];
    char teacherPhoneNumber[15];
} Student;

typedef struct {
    char courseName[20];
    float score;
} Course;

typedef struct StudentNode {
    Student data;
    Course *courses; // 课程成绩数组
    struct StudentNode *next;
} StudentNode;

// Function Declarations
void displayMenu();

void loadStudentsFromFile(StudentNode **head);

void saveStudentsToFile(StudentNode *head);

void addStudentRecord(StudentNode **head);

void displayAllStudents(StudentNode *head);

void modifyStudentRecord(StudentNode *head);

void deleteStudentRecord(StudentNode **head);

void searchStudentRecord(StudentNode *head);

void gradeStatistics(StudentNode *head);

void rankByIntelligence(StudentNode *head);

void searchByStudentID(StudentNode *head, const char *targetID);

void searchByName(StudentNode *head, const char *targetName);

void freeMemory(StudentNode *head);

void searchByPhoneNumber(StudentNode *head, const char *targetPhoneNumber);

void gradeStatistics(StudentNode *head);

void gradeStatistics(StudentNode *head);

void searchByName(StudentNode *head, const char *targetName);

void gradeStatistics(StudentNode *head);

int main() {
    StudentNode *head = NULL;
    loadStudentsFromFile(&head);

    int choice;
    do {
        displayMenu();
        printf("请输入你的选择: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                addStudentRecord(&head);
                break;
            case 2:
                displayAllStudents(head);
                break;
            case 3:
                modifyStudentRecord(head);
                break;
            case 4:
                deleteStudentRecord(&head);
                break;
            case 5:
                searchStudentRecord(head);
                break;
            case 6:
                gradeStatistics(head);
                break;
            case 7:
                rankByIntelligence(head);
                break;
            case 8:
                saveStudentsToFile(head);
                break;
            case 0:
                printf("程序退出。再见!\n");
                break;
            default:
                printf("无效的选择,请重试。\n");
        }

    } while (choice != 0);

    freeMemory(head);

    return 0;
}

void displayMenu() {
    printf("\n===== 学生信息管理系统 =====\n");
    printf("1. 添加学生记录\n");
    printf("2. 显示所有学生\n");
    printf("3. 修改学生记录\n");
    printf("4. 删除学生记录\n");
    printf("5. 搜索学生记录\n");
    printf("6. 成绩统计\n");
    printf("7. 智育排名\n");
    printf("8. 将学生信息保存到文件\n");
    printf("0. 退出\n");
}

void loadStudentsFromFile(StudentNode **head) {
    FILE *file = fopen("students.txt", "r");
    if (file == NULL) {
        printf("打开文件读取错误。\n");
        return;
    }

    while (!feof(file)) {
        StudentNode *newStudent = (StudentNode *) malloc(sizeof(StudentNode));
        if (newStudent == NULL) {
            printf("内存分配错误。\n");
            fclose(file);
            return;
        }

        fscanf(file, "学号: %s\n", newStudent->data.studentID);
        if (feof(file)) {
            free(newStudent);
            break; // 避免读取到文件末尾多分配一个节点
        }

        fscanf(file, "姓名: %s\n", newStudent->data.name);
        fscanf(file, "身高: %f\n", &newStudent->data.height);
        fscanf(file, "体重: %f\n", &newStudent->data.weight);
        fscanf(file, "地址: %s\n", newStudent->data.address);
        fscanf(file, "联系电话: %s\n", newStudent->data.phoneNumber);
        fscanf(file, "紧急联系人: %s\n", newStudent->data.emergencyContact);
        fscanf(file, "紧急联系电话: %s\n", newStudent->data.emergencyPhoneNumber);
        fscanf(file, "QQ号: %s\n", newStudent->data.qqNumber);
        fscanf(file, "特长: %s\n", newStudent->data.specialSkills);
        fscanf(file, "智育排名: %d\n", &newStudent->data.intelligenceRank);
        fscanf(file, "任课教师姓名: %s\n", newStudent->data.teacherName);
        fscanf(file, "任课教师联系电话: %s\n", newStudent->data.teacherPhoneNumber);

        newStudent->courses = (Course *) malloc(3 * sizeof(Course)); // 假设每个学生有三门课程
        if (newStudent->courses == NULL) {
            printf("内存分配错误。\n");
            free(newStudent);
            fclose(file);
            return;
        }

        for (int i = 0; i < 3; i++) { // 假设每个学生有三门课程
            fscanf(file, "课程: %s, 成绩: %f\n", newStudent->courses[i].courseName, &newStudent->courses[i].score);
        }

        newStudent->next = *head;
        *head = newStudent;
    }

    fclose(file);
}

void saveStudentsToFile(StudentNode *head) {
    FILE *file = fopen("students.txt", "w");
    if (file == NULL) {
        printf("打开文件写入错误。\n");
        return;
    }

    StudentNode *current = head;
    while (current != NULL) {
        fprintf(file, "学号: %s\n", current->data.studentID);
        fprintf(file, "姓名: %s\n", current->data.name);
        fprintf(file, "身高: %.2f\n", current->data.height);
        fprintf(file, "体重: %.2f\n", current->data.weight);
        fprintf(file, "地址: %s\n", current->data.address);
        fprintf(file, "联系电话: %s\n", current->data.phoneNumber);
        fprintf(file, "紧急联系人: %s\n", current->data.emergencyContact);
        fprintf(file, "紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
        fprintf(file, "QQ号: %s\n", current->data.qqNumber);
        fprintf(file, "特长: %s\n", current->data.specialSkills);
        fprintf(file, "智育排名: %d\n", current->data.intelligenceRank);
        fprintf(file, "任课教师姓名: %s\n", current->data.teacherName);
        fprintf(file, "任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

        for (int i = 0; i < 3; i++) { // 假设每个学生有三门课程
            fprintf(file, "课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
        }

        fprintf(file, "\n");

        current = current->next;
    }

    fclose(file);
}

void addStudentRecord(StudentNode **head) {
    StudentNode *newStudent = (StudentNode *) malloc(sizeof(StudentNode));
    if (newStudent == NULL) {
        printf("内存分配错误。\n");
        return;
    }

    printf("输入学号: ");
    scanf("%s", newStudent->data.studentID);

    // 检查是否已存在相同学号的记录,避免重复
    StudentNode *current = *head;
    while (current != NULL) {
        if (strcmp(current->data.studentID, newStudent->data.studentID) == 0) {
            printf("错误: 学号已存在。\n");
            free(newStudent);
            return;
        }
        current = current->next;
    }

    printf("输入姓名: ");
    scanf("%s", newStudent->data.name);
    printf("输入身高: ");
    scanf("%f", &newStudent->data.height);
    printf("输入体重: ");
    scanf("%f", &newStudent->data.weight);
    printf("输入地址: ");
    scanf("%s", newStudent->data.address);
    printf("输入联系电话: ");
    scanf("%s", newStudent->data.phoneNumber);
    printf("输入紧急联系人: ");
    scanf("%s", newStudent->data.emergencyContact);
    printf("输入紧急联系电话: ");
    scanf("%s", newStudent->data.emergencyPhoneNumber);
    printf("输入QQ号: ");
    scanf("%s", newStudent->data.qqNumber);
    printf("输入特长: ");
    scanf("%s", newStudent->data.specialSkills);
    printf("输入智育排名: ");
    scanf("%d", &newStudent->data.intelligenceRank);
    printf("输入任课教师姓名: ");
    scanf("%s", newStudent->data.teacherName);
    printf("输入任课教师联系电话: ");
    scanf("%s", newStudent->data.teacherPhoneNumber);

    newStudent->courses = (Course *) malloc(3 * sizeof(Course)); // 假设每个学生有三门课程
    if (newStudent->courses == NULL) {
        printf("内存分配错误。\n");
        free(newStudent);
        return;
    }

    for (int i = 0; i < 3; i++) { // 假设每个学生有三门课程
        printf("输入第 %d 门课程名称: ", i + 1);
        scanf("%s", newStudent->courses[i].courseName);
        printf("输入第 %d 门课程成绩: ", i + 1);
        scanf("%f", &newStudent->courses[i].score);
    }

    newStudent->next = *head;
    *head = newStudent;
    printf("学生记录添加成功。\n");
}

void displayAllStudents(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    printf("\n===== 所有学生 =====\n");
    StudentNode *current = head;
    while (current != NULL) {
        printf("学号: %s\n", current->data.studentID);
        printf("姓名: %s\n", current->data.name);
        printf("身高: %.2f\n", current->data.height);
        printf("体重: %.2f\n", current->data.weight);
        printf("地址: %s\n", current->data.address);
        printf("联系电话: %s\n", current->data.phoneNumber);
        printf("紧急联系人: %s\n", current->data.emergencyContact);
        printf("紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
        printf("QQ号: %s\n", current->data.qqNumber);
        printf("特长: %s\n", current->data.specialSkills);
        printf("智育排名: %d\n", current->data.intelligenceRank);
        printf("任课教师姓名: %s\n", current->data.teacherName);
        printf("任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

        for (int i = 0; i < 3; i++) { // 假设每个学生有三门课程
            printf("课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
        }

        printf("\n");

        current = current->next;
    }
}

void modifyStudentRecord(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    char targetID[20];
    printf("请输入要修改的学生学号: ");
    scanf("%s", targetID);

    StudentNode *current = head;
    while (current != NULL) {
        if (strcmp(current->data.studentID, targetID) == 0) {
            printf("学生找到,现在可以进行修改。\n");
            printf("请输入新的姓名: ");
            scanf("%s", current->data.name);
            printf("请输入新的身高: ");
            scanf("%f", &current->data.height);
            printf("请输入新的体重: ");
            scanf("%f", &current->data.weight);
            printf("请输入新的地址: ");
            scanf("%s", current->data.address);
            printf("请输入新的联系电话: ");
            scanf("%s", current->data.phoneNumber);
            printf("请输入新的紧急联系人: ");
            scanf("%s", current->data.emergencyContact);
            printf("请输入新的紧急联系电话: ");
            scanf("%s", current->data.emergencyPhoneNumber);
            printf("请输入新的QQ号: ");
            scanf("%s", current->data.qqNumber);
            printf("请输入新的特长: ");
            scanf("%s", current->data.specialSkills);
            printf("请输入新的智育排名: ");
            scanf("%d", &current->data.intelligenceRank);
            printf("请输入新的任课教师姓名: ");
            scanf("%s", current->data.teacherName);
            printf("请输入新的任课教师联系电话: ");
            scanf("%s", current->data.teacherPhoneNumber);

            for (int i = 0; i < 3; i++) {
                printf("请输入新的第 %d 门课程名称: ", i + 1);
                scanf("%s", current->courses[i].courseName);
                printf("请输入新的第 %d 门课程成绩: ", i + 1);
                scanf("%f", &current->courses[i].score);
            }

            printf("学生信息修改成功。\n");
            return;
        }
        current = current->next;
    }

    printf("未找到学生学号为 %s 的记录。\n", targetID);
}

void deleteStudentRecord(StudentNode **head) {
    if (*head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    char targetID[20];
    printf("请输入要删除的学生学号: ");
    scanf("%s", targetID);

    StudentNode *current = *head;
    StudentNode *prev = NULL;

    while (current != NULL) {
        if (strcmp(current->data.studentID, targetID) == 0) {
            if (prev == NULL) {
                *head = current->next;
            } else {
                prev->next = current->next;
            }

            free(current->courses);
            free(current);
            printf("学生信息删除成功。\n");
            return;
        }

        prev = current;
        current = current->next;
    }

    printf("未找到学生学号为 %s 的记录。\n", targetID);
}

void searchStudentRecord(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    int choice;
    printf("请选择搜索方式:\n");
    printf("1. 按学号搜索\n");
    printf("2. 按姓名搜索\n");
    printf("3. 按手机号搜索\n");
    printf("请输入你的选择: ");
    scanf("%d", &choice);

    char target[20];
    switch (choice) {
        case 1:
            printf("请输入要搜索的学生学号: ");
            scanf("%s", target);
            searchByStudentID(head, target);
            break;
        case 2:
            printf("请输入要搜索的学生姓名: ");
            scanf("%s", target);
            searchByName(head, target);
            break;
        case 3:
            printf("请输入要搜索的学生手机号: ");
            scanf("%s", target);
            searchByPhoneNumber(head, target);
            break;
        default:
            printf("无效的选择。\n");
            break;
    }
}

void searchByPhoneNumber(StudentNode *head, const char *targetPhoneNumber) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    int found = 0;
    StudentNode *current = head;
    while (current != NULL) {
        if (strcmp(current->data.phoneNumber, targetPhoneNumber) == 0 ||
            strcmp(current->data.emergencyPhoneNumber, targetPhoneNumber) == 0) {
            printf("\n===== 学生信息 =====\n");
            printf("学号: %s\n", current->data.studentID);
            printf("姓名: %s\n", current->data.name);
            printf("身高: %.2f\n", current->data.height);
            printf("体重: %.2f\n", current->data.weight);
            printf("地址: %s\n", current->data.address);
            printf("联系电话: %s\n", current->data.phoneNumber);
            printf("紧急联系人: %s\n", current->data.emergencyContact);
            printf("紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
            printf("QQ号: %s\n", current->data.qqNumber);
            printf("特长: %s\n", current->data.specialSkills);
            printf("智育排名: %d\n", current->data.intelligenceRank);
            printf("任课教师姓名: %s\n", current->data.teacherName);
            printf("任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

            for (int i = 0; i < 3; i++) {
                printf("课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
            }

            found = 1;
            break;
        }
        current = current->next;
    }

    if (!found) {
        printf("未找到联系电话为 %s 的学生记录。\n", targetPhoneNumber);
    }
}

void gradeStatistics(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    char courseName[20];
    printf("请输入要统计的课程名称: ");
    scanf("%s", courseName);

    int countPass = 0;
    int countFail = 0;
    float sum = 0.0;
    float maxScore = -1.0;
    float minScore = 101.0;
    StudentNode *current = head;

    while (current != NULL) {
        for (int i = 0; i < 3; i++) {
            if (strcmp(current->courses[i].courseName, courseName) == 0) {
                float score = current->courses[i].score;
                sum += score;

                if (score >= 60.0) {
                    countPass++;
                } else {
                    countFail++;
                }

                if (score > maxScore) {
                    maxScore = score;
                }

                if (score < minScore) {
                    minScore = score;
                }
            }
        }
        current = current->next;
    }

    if (countPass + countFail == 0) {
        printf("该课程暂无学生成绩。\n");
    } else {
        float average = sum / (countPass + countFail);
        float passRate = (float)countPass / (countPass + countFail) * 100.0;

        printf("\n===== 成绩统计 =====\n");
        printf("最高分: %.2f\n", maxScore);
        printf("最低分: %.2f\n", minScore);
        printf("平均分: %.2f\n", average);
        printf("及格人数: %d\n", countPass);
        printf("不及格人数: %d\n", countFail);
        printf("及格率: %.2f%%\n", passRate);
    }
}

void rankByIntelligence(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    // 计算链表长度
    int count = 0;
    StudentNode *current = head;
    while (current != NULL) {
        count++;
        current = current->next;
    }

    // 将链表数据提取到数组中以便排序
    Student *students = (Student *)malloc(count * sizeof(Student));
    if (students == NULL) {
        printf("内存分配错误。\n");
        return;
    }

    current = head;
    for (int i = 0; i < count; i++) {
        students[i] = current->data;
        current = current->next;
    }

    // 使用冒泡排序按照智育排名排序
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (students[j].intelligenceRank < students[j + 1].intelligenceRank) {
                // 交换两个学生的位置
                Student temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }

    // 显示排序结果
    printf("\n===== 智育排名 =====\n");
    for (int i = 0; i < count; i++) {
        printf("排名 %d:\n", i + 1);
        printf("学号: %s\n", students[i].studentID);
        printf("姓名: %s\n", students[i].name);
        printf("智育排名: %d\n", students[i].intelligenceRank);
        printf("\n");
    }

    free(students);
}

void freeMemory(StudentNode *head) {
    while (head != NULL) {
        StudentNode *temp = head;
        head = head->next;
        free(temp->courses);
        free(temp);
    }
}

void searchByStudentID(StudentNode *head, const char *targetID) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    int found = 0;
    StudentNode *current = head;
    while (current != NULL) {
        if (strcmp(current->data.studentID, targetID) == 0) {
            printf("\n===== 学生信息 =====\n");
            printf("学号: %s\n", current->data.studentID);
            printf("姓名: %s\n", current->data.name);
            printf("身高: %.2f\n", current->data.height);
            printf("体重: %.2f\n", current->data.weight);
            printf("地址: %s\n", current->data.address);
            printf("联系电话: %s\n", current->data.phoneNumber);
            printf("紧急联系人: %s\n", current->data.emergencyContact);
            printf("紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
            printf("QQ号: %s\n", current->data.qqNumber);
            printf("特长: %s\n", current->data.specialSkills);
            printf("智育排名: %d\n", current->data.intelligenceRank);
            printf("任课教师姓名: %s\n", current->data.teacherName);
            printf("任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

            for (int i = 0; i < 3; i++) {
                printf("课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
            }

            found = 1;
            break;
        }
        current = current->next;
    }

    if (!found) {
        printf("未找到学号为 %s 的学生记录。\n", targetID);
    }
}

void searchByName(StudentNode *head, const char *targetName) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    int found = 0;
    StudentNode *current = head;
    while (current != NULL) {
        if (strcmp(current->data.name, targetName) == 0) {
            printf("\n===== 学生信息 =====\n");
            printf("学号: %s\n", current->data.studentID);
            printf("姓名: %s\n", current->data.name);
            printf("身高: %.2f\n", current->data.height);
            printf("体重: %.2f\n", current->data.weight);
            printf("地址: %s\n", current->data.address);
            printf("联系电话: %s\n", current->data.phoneNumber);
            printf("紧急联系人: %s\n", current->data.emergencyContact);
            printf("紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
            printf("QQ号: %s\n", current->data.qqNumber);
            printf("特长: %s\n", current->data.specialSkills);
            printf("智育排名: %d\n", current->data.intelligenceRank);
            printf("任课教师姓名: %s\n", current->data.teacherName);
            printf("任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

            for (int i = 0; i < 3; i++) {
                printf("课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
            }

            found = 1;
            break;
        }
        current = current->next;
    }

    if (!found) {
        printf("未找到姓名为 %s 的学生记录。\n", targetName);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亻乍屯页女子白勺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值