[C/C++]学生管理系统带文件操作

该代码实现了一个基于C语言的学生信息管理系统,包括加载学生数据、查询、排序、添加、删除、修改和按性别分割文件等功能。系统使用结构体存储学生信息,并通过文件进行数据持久化。用户通过菜单交互,可选择不同操作对数据进行处理。
摘要由CSDN通过智能技术生成
  •  个人主页:北·海
  •  🎐CSDN新晋作者
  •  🎉欢迎 👍点赞✍评论⭐收藏
  • ✨收录专栏:C/C++
  • 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

 

#if 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAX = 100;
// 定义学生结构体
typedef struct {
    char name[20];
    char birthday[20];//出生年月
    char jiguna[20];//籍贯
    char phone[20];//手机号
    char gender[10];
    int studentID;
    float score;
} Student;

// 定义全局变量,存储学生信息
Student students[MAX];
int numStudents = 0;

// 加载学生信息文件,读入到结构体
void loadStudentsFromFile() {
    FILE *file = fopen("D:/JK0112.txt", "r");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return;
    }
    numStudents = 0;

    while (fscanf(file, "%d %s %s %s %s %s %f\n", &students[numStudents].studentID, students[numStudents].name, students[numStudents].gender,
                  students[numStudents].birthday,students[numStudents].jiguna,students[numStudents].phone, &students[numStudents].score) ==7) {
        numStudents++;
    }

    fclose(file);//文件关闭
}

// 显示菜单
void displayMenu() {
    printf("\t \"---------------------------------------------------------------------------------|\n");
    printf("\t \"|                                 欢迎使用学生管理系统                           |\n");
    printf("\t \"|--------------------------------------------------------------------------------|\n");
    printf("\t \"|            1、查询                     |                 2、排序               |\n");
    printf("\t \"|----------------------------------------|---------------------------------------|\n");
    printf("\t \"|            3、添加                     |                 4、删除               |\n");
    printf("\t \"|----------------------------------------|---------------------------------------|\n");
    printf("\t \"|            5、修改                     |                 6、按性别分割文件     |\n");
    printf("\t \"|----------------------------------------|---------------------------------------|\n");
    printf("\t \"|                                  0、退出系统                                   |\n");
    printf("\t \"---------------------------------------------------------------------------------|\n");
    printf("请输入选项:");
}

// 按姓名查询显示
void searchByName() {
    char name[20];
    printf("请输入要查询的学生姓名:");
    scanf("%s", name);

    for (int i = 0; i < numStudents; i++) {
        if (strcmp(students[i].name, name) == 0) {
            printf("姓名\t学号\t性别\t籍贯\t出生年月\t电话\t\t\t成绩\n");
            printf("%s\t%d\t%s\t\t%s\t%s\t\t%s\t\t%.2f\n", students[i].name,students[i].studentID, students[i].gender,
                   students[i].jiguna,students[i].birthday,students[i].phone, students[i].score);
        }
    }
}

// 按学号查询显示
void searchByStudentID() {
    int studentID;
    printf("请输入要查询的学生学号:");
    scanf("%d", &studentID);

    for (int i = 0; i < numStudents; i++) {
        if (students[i].studentID == studentID) {
            printf("姓名\t学号\t性别\t籍贯\t出生年月\t电话\t\t\t成绩\n");
            printf("%s\t%d\t%s\t\t%s\t%s\t\t%s\t\t%.2f\n", students[i].name,students[i].studentID, students[i].gender,
                   students[i].jiguna,students[i].birthday,students[i].phone, students[i].score);
            return;
        }
    }

    printf("找不到该学号对应的学生信息!\n");
}

// 显示全部学生信息
void displayAllStudents() {
    printf("姓名\t学号\t性别\t籍贯\t出生年月\t电话\t\t\t成绩\n");
    for (int i = 0; i < numStudents; i++) {
        printf("%s\t%d\t%s\t\t%s\t%s\t\t%s\t\t%.2f\n", students[i].name,students[i].studentID, students[i].gender,
               students[i].jiguna,students[i].birthday,students[i].phone, students[i].score);
    }
}

// 按姓名排序
int compareByName(const void *a, const void *b) {
    Student *studentA = (Student *)a;
    Student *studentB = (Student *)b;
    return strcmp(studentA->name, studentB->name);
}

// 按成绩排序
int compareByScore(const void *a, const void *b) {
    Student *studentA = (Student *)a;
    Student *studentB = (Student *)b;
    if (studentA->score > studentB->score) {
        return 1;
    } else if (studentA->score < studentB->score) {
        return -1;
    } else {
        return 0;
    }
}

// 按姓名排序并显示
void sortByName() {
    qsort(students, numStudents, sizeof(Student), compareByName);
    displayAllStudents();
}

// 按成绩排序并显示
void sortByScore() {
    qsort(students, numStudents, sizeof(Student), compareByScore);
    displayAllStudents();
}

// 添加新的学生信息
void addStudent() {
    if (numStudents >= 100) {
        printf("学生信息已满,无法添加!\n");
        return;
    }

    //Student newStudent;
    printf("请输入学生姓名:");
    scanf("%s", students[numStudents].name);

    printf("请输入学生学号:");
    scanf("%d", &students[numStudents].studentID);

    printf("请输入学生性别:");
    scanf("%s", students[numStudents].gender);

    printf("请输入学生籍贯:");
    scanf("%s", students[numStudents].jiguna);

    printf("请修改学生生日:");
    scanf("%s", students[numStudents].birthday);

    printf("请输入学生手机号:");
    scanf("%s", students[numStudents].phone);

    printf("请输入学生成绩:");
    scanf("%f", &students[numStudents].score);

    for (int i = 0; i < numStudents; i++) {
        if (students[i].studentID == students[numStudents].studentID) {
            printf("该学号已存在,无法添加!\n");
            return;
        }
    }
    printf("学生信息添加成功!\n");
    numStudents++;
}

// 按姓名删除学生信息
void deleteByName() {
    char name[20];
    printf("请输入要删除的学生姓名:");
    scanf("%s", name);

    int found = 0;
    for (int i = 0; i < numStudents; i++) {
        if (strcmp(students[i].name, name) == 0) {
            students[i] = students[--numStudents];
            found = 1;
        }
    }

    if (found) {
        printf("学生信息删除成功!\n");
    } else {
        printf("找不到该姓名对应的学生信息!\n");
    }
}

// 按学号删除学生信息
void deleteByStudentID() {
    int studentID;
    printf("请输入要删除的学生学号:");
    scanf("%d", &studentID);

    int found = 0;
    for (int i = 0; i < numStudents; i++) {
        if (students[i].studentID == studentID) {
            students[i] = students[--numStudents];
            found = 1;
        }
    }

    if (found) {
        printf("学生信息删除成功!\n");
    } else {
        printf("找不到该学号对应的学生信息!\n");
    }
}

// 修改学生信息
void modifyStudent() {
    int studentID;
    printf("请输入要修改的学生学号:");
    scanf("%d", &studentID);

    int found = 0;
    for (int i = 0; i < numStudents; i++) {
        if (students[i].studentID == studentID) {
            printf("找到学生信息,请输入修改后的学生姓名:");
            scanf("%s", students[i].name);

            printf("请修改学生学号:");
            scanf("%d", &students[i].studentID);

            printf("请修改学生性别:");
            scanf("%s", students[i].gender);

            printf("请修改学生出生年月:");
            scanf("%s", students[i].birthday);

            printf("请修改学生籍贯:");
            scanf("%s", students[i].jiguna);

            printf("请修改学生手机号:");
            scanf("%s", students[i].phone);

            printf("请修改学生成绩:");
            scanf("%f", &students[i].score);

            printf("学生信息修改成功!\n");
            found = 1;
        }
    }

    if (!found) {
        printf("找不到该学号对应的学生信息!\n");
    }
}

// 将学生信息按性别分割成两个文件
void splitByGender() {
    FILE *maleFile = fopen("D:/male.txt", "w");
    FILE *femaleFile = fopen("D:/female.txt", "w");
//fscanf(file, "%d %s %s %s %s %s %f", &students[numStudents].studentID, students[numStudents].name, students[numStudents].gender,
//                  students[numStudents].birthday,students[numStudents].jiguna,students[numStudents].phone, &students[numStudents].score) ==6)
    for (int i = 0; i < numStudents; i++) {
        if (strcmp(students[i].gender, "male") == 0) {
            fprintf(maleFile, "%d %s %s %s %s %s %f\n",students[i].studentID, students[i].name, students[i].gender,
                    students[i].birthday,students[i].jiguna, students[i].phone,students[i].score);
        } else if (strcmp(students[i].gender, "female") == 0) {
            fprintf(femaleFile, "%d %s %s %s %s %s %f\n",students[i].studentID, students[i].name, students[i].gender,
                    students[i].birthday,students[i].jiguna, students[i].phone,students[i].score);
        }
    }

    fclose(maleFile);
    fclose(femaleFile);
    printf("学生信息已按性别分割并保存到文件!\n");
}

//将数据写入文件
void Write_File(){
    FILE *file = fopen("D:/JK0112.txt", "w");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return;
    }
    for(int i = 0 ;i<numStudents;i++) {
        fprintf(file, "%d %s %s %s %s %s %f\n", students[numStudents].studentID, students[numStudents].name,
                students[numStudents].gender, students[numStudents].birthday, students[numStudents].jiguna,
                students[numStudents].phone, students[numStudents].score);
    }
    printf("信息保存成功!\n");

}

int main() {
    loadStudentsFromFile();//加载数据到结构体
    int option;
    do {
        displayMenu();
        scanf("%d", &option);

        switch (option) {
            case 1:
                printf("请选择查询方式:\n");
                printf("1. 按姓名查询\n");
                printf("2. 按学号查询\n");
                printf("3. 显示全部\n");
                printf("请输入选项:");
                int searchOption;
                scanf("%d", &searchOption);
                switch (searchOption) {
                    case 1:
                        searchByName();
                        break;
                    case 2:
                        searchByStudentID();
                        break;
                    case 3:
                        displayAllStudents();
                        break;
                    default:
                        printf("无效的选项!\n");
                        break;
                }
                break;
            case 2:
                printf("请选择排序方式:\n");
                printf("1. 按姓名排序\n");
                printf("2. 按成绩排序\n");
                printf("请输入选项:");
                int sortOption;
                scanf("%d", &sortOption);
                switch (sortOption) {
                    case 1:
                        sortByName();
                        break;
                    case 2:
                        sortByScore();
                        break;
                    default:
                        printf("无效的选项!\n");
                        break;
                }
                break;
            case 3:
                addStudent();
                break;
            case 4:
                printf("请选择删除方式:\n");
                printf("1. 按姓名删除\n");
                printf("2. 按学号删除\n");
                printf("请输入选项:");
                int deleteOption;
                scanf("%d", &deleteOption);
                switch (deleteOption) {
                    case 1:
                        deleteByName();
                        break;
                    case 2:
                        deleteByStudentID();
                        break;
                    default:
                        printf("无效的选项!\n");
                        break;
                }
                break;
            case 5:
                modifyStudent();
                break;
            case 6:
                splitByGender();
                break;
            case 0:
                Write_File();
                printf("退出程序。\n");
                break;
            default:
                printf("无效的选项!\n");
                break;
        }
    } while (option != 0);

    return 0;
}
#endif

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北·海

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

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

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

打赏作者

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

抵扣说明:

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

余额充值