17 C语言学生管理系统

学生管理系统

👍😂💯 项目代码

代码可能存在细节上的错误,希望大家可以指导意见。

c 复制代码
#define _CRT_SECURE_NO_WARNINGS  1

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

#define MAX_STUDENTS 100

typedef struct {
    int id;
    char name[50];
    float score1;
    float score2;
    float score3;
    float average;
} Student;

Student students[MAX_STUDENTS];
int num_students = 0;

void display_menu() {
    printf("**********************************************\n");
    printf("              学生管理系统\n");
    printf("**********************************************\n");
    printf("                                          \n");
    printf(" 1.增加一位学生信息  2.删除一位同学信息      \n");
    printf(" 3.按学号查询学生    4.按姓名查询学生       \n");
    printf(" 5.修改学生信息      6.按姓名排序           \n");
    printf(" 7.按平均分排序      8.装入学生信息         \n");
    printf(" 9.保存学生信息      0.显示全部同学的信息   \n");
    printf("                                          \n");
    printf("按q或者Q退出系统                    \n");
    printf("**********************************************\n");
    printf("请选择操作:");
}

void add_student() {
    Student new_student;
    printf("输入学生的学号(-1 结束): ");
    scanf("%d", &new_student.id);

    if (new_student.id == -1) {
        return;
    }

    printf("输入学生的姓名: ");
    scanf("%s", new_student.name);
    printf("输入学生的高数成绩: ");
    scanf("%f", &new_student.score1);
    printf("输入学生的C语言成绩: ");
    scanf("%f", &new_student.score2);
    printf("输入学生的英语成绩: ");
    scanf("%f", &new_student.score3);
    new_student.average = (new_student.score1 + new_student.score2 + new_student.score3) / 3.0;
    students[num_students++] = new_student;
    printf("学生信息添加成功\n");
}

void delete_student() {
    int student_id;
    int i;
    printf("输入学生的学号: ");
    scanf("%d", &student_id);
    int index = -1;
    for (i = 0; i < num_students; i++) {
        if (students[i].id == student_id) {
            index = i;
            break;
        }
    }
    if (index == -1) {
        printf("学号不存在\n");
        return;
    }
    for (i = index; i < num_students - 1; i++) {
        students[i] = students[i + 1];
    }
    num_students--;
    printf("删除学生信息成功\n");
}

void search_by_id() {
    int student_id;
    int i;
    printf("输入学生的学号: ");
    scanf("%d", &student_id);
    int index = -1;
    for (i = 0; i < num_students; i++) {
        if (students[i].id == student_id) {
            index = i;
            break;
        }
    }

    if (index == -1) {
        printf("学号不存在\n");
        return;
    }
    printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");
    printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",
           students[index].id, students[index].name, students[index].score1,
           students[index].score2, students[index].score3, students[index].average);
}

void search_by_name() {

    int found = 0;
    char student_name[50];
    int i;
    printf("输入学生的姓名: ");
    scanf("%s", student_name);
    printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");
    for (i = 0; i < num_students; i++) {
        if (strcmp(students[i].name, student_name) == 0) {
            printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",
                   students[i].id, students[i].name, students[i].score1,
                   students[i].score2, students[i].score3, students[i].average);
            found = 1;
        }
    }

    if (!found) { printf("学生不存在\n"); }
}

void update_student() {
    int student_id;
    int index = -1;
    int i;
    printf("输入学生的学号: ");
    scanf("%d", &student_id);
    for (i = 0; i < num_students; i++) {
        if (students[i].id == student_id) {
            index = i;
            break;
        }
    }
    if (index == -1) {
        printf("学号不存在\n");
        return;
    }
    printf("输入学生的姓名: ");
    scanf("%s", students[index].name);
    printf("输入学生的课程1成绩: ");
    scanf("%f", &students[index].score1);
    printf("输入学生的课程2成绩: ");
    scanf("%f", &students[index].score2);
    printf("输入学生的课程3成绩: ");
    scanf("%f", &students[index].score3);
    students[index].average = (students[index].score1 + students[index].score2 + students[index].score3) / 3.0;
    printf("学生信息更新成功\n");
}

void sort_by_name() {
    int i, j;
    for (i = 0; i < num_students - 1; i++) {
        for (j = 0; j < num_students - 1 - i; j++) {
            if (strcmp(students[j].name, students[j + 1].name) > 0) {
                Student temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }
    printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");
    for (i = 0; i < num_students; i++) {
        printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",
               students[i].id, students[i].name, students[i].score1,
               students[i].score2, students[i].score3, students[i].average);
    }
}

void sort_by_average() {
    int i, j;
    for (i = 0; i < num_students - 1; i++) {
        for (j = 0; j < num_students - 1 - i; j++) {
            if (students[j].average < students[j + 1].average) {
                Student temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }
    printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");
    for (i = 0; i < num_students; i++) {
        printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",
               students[i].id, students[i].name, students[i].score1,
               students[i].score2, students[i].score3, students[i].average);
    }
}

void load_students() {
    FILE *file = fopen("student_info.bin", "rb");
    if (file == NULL) {
        printf("无法打开文件\n");
        return;
    }
    fread(&num_students, sizeof(int), 1, file);
    fread(students, sizeof(Student), num_students, file);
    fclose(file);
}

void save_students() {
    FILE *file = fopen("student_info.bin", "wb");
    if (file == NULL) {
        return;
    }
    fwrite(&num_students, sizeof(int), 1, file);
    fwrite(students, sizeof(Student), num_students, file);
    fclose(file);
    printf("学生信息保存成功\n");
}

void display_students() {
    int i;
    printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");
    for (i = 0; i < num_students; i++) {
        printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", students[i].id, students[i].name, students[i].score1,
               students[i].score2, students[i].score3, students[i].average);
    }
}

int main() {
    load_students();
    while (1) {
        display_menu();
        char choice;
        scanf(" %c", &choice);
        switch (choice) {
            case '1':
                add_student();
                break;
            case '2':
                delete_student();
                break;
            case '3':
                search_by_id();
                break;
            case '4':
                search_by_name();
                break;
            case '5':
                update_student();
                break;
            case '6':
                sort_by_name();
                break;
            case '7':
                sort_by_average();
                break;
            case '8':
                load_students();
                break;
            case '9':
                save_students();
                break;
            case '0':
                display_students();
                break;
            case 'q':
            case 'Q':
                printf("再见!\n");
                exit(0);
            default:
                printf("输入错误,请重新输入!\n");
                break;
        }
    }
    return 0;
}

项目运行展示





这段代码是一个简单的学生管理系统,它使用 C 语言编写,主要用于存储、管理和展示学生的基本信息及成绩。下面是对项目结构、逻辑结构和项目背景的详细描述:

项目结构

  1. 头文件和宏定义

    • #define _CRT_SECURE_NO_WARNINGS 1:这是为了防止在 Visual Studio 等编译器中出现关于不安全函数的警告。
    • #include 指令用于引入标准库,如 stdio.hstdlib.hstring.h,这些库提供了输入输出、内存操作和字符串处理等功能。
  2. 数据结构定义

    • Student 结构体定义了学生的信息,包括学号、姓名、三门课程的成绩和平均分。
  3. 全局变量

    • students 数组用于存储所有学生的信息。
    • num_students 变量用于跟踪当前存储的学生数量。
  4. 功能函数

    • display_menu():显示系统菜单。
    • add_student():添加学生信息。
    • delete_student():删除学生信息。
    • search_by_id()search_by_name():分别通过学号和姓名查询学生信息。
    • update_student():更新学生信息。
    • sort_by_name()sort_by_average():分别按姓名和平均分对学生进行排序。
    • load_students()save_students():从文件加载和保存学生信息。
    • display_students():显示所有学生信息。
  5. 主函数 main()

    • 初始化学生信息数组。
    • 进入一个无限循环,显示菜单并根据用户输入执行相应的操作。
    • 提供退出选项。

逻辑结构

  1. 初始化

    • main() 函数开始时,调用 load_students() 从文件加载已有的学生信息。
  2. 用户交互

    • 通过 display_menu() 函数显示操作选项。
    • 用户输入选择后,通过 switch 语句执行相应的功能函数。
  3. 数据处理

    • 每个功能函数都对 students 数组和 num_students 变量进行操作,以实现增加、删除、查询、更新、排序和显示学生信息的功能。
  4. 数据持久化

    • load_students()save_students() 函数通过二进制文件 student_info.bin 实现数据的持久化存储。
相关推荐
起名字真南14 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
少年负剑去14 分钟前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
tyler_download25 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~26 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#26 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透28 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
杜杜的man30 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
亦世凡华、31 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
测试界的酸菜鱼1 小时前
C# NUnit 框架:高效使用指南
开发语言·c#·log4j
GDAL1 小时前
lua入门教程 :模块和包
开发语言·junit·lua