第二十四章、校园信息管理系统项目

信息管理系统(Information Management System, IMS)是一种用于收集、存储、处理和分发信息的软件系统,旨在有效管理和利用信息资源,支持决策制定和业务操作。

如下应用都属于信息管理系统。

信息管理系统的核心功能‌如下

1. 校园信息管理系统项目简介

此项目的目标是实现对一个学校的班级、学生信息及学生成绩的管理。以实现小学校园数据的电子化,有利于查阅和数据分析,同时能够实现数据电子存档,减少纸张利用,节能减排。

项目需求

本项目要求对一个学校的信息进行管理。项目存储的信息是一个学校有多个班级,一个班级有多个学生,一个学生有姓名、语文成绩和数学成绩这三项数据。

此项目的作用是用来管理学校学生的信息。能够新增班级,删除班级,管理班级内的学生信息等功能,并能将全部信息保存成为 students.csv 文件中,可以使用电子表格软件打开和编辑。

项目设计

根据需求我们了解到整体关系如下:

项目结构图

根基项目需求我们设计具体软件功能如下:

学校功能

班级功能

设计应用程序的界面如下:

应用程序操作界面(主界面)

项目信息管理系统主界面

班级管理界面

项目班级管理主界面

项目实现

此项目解决的问题的规模是可控的。一般国内的学校都不会超过 50 个班级,每个班级的学生不超过 100 人。因此我们采用固定长度的数组来存储上述信息。

以下介绍核心数据的实现方式。

学生结构体

#define MAX_STU_NAME_LEN (32)   // 学生姓名的最大长度

// 学生类型
typedef struct student
{
    char name[MAX_STU_NAME_LEN];  // 姓名
    int chinese_score;  // 语文成绩
    int math_score;  // 数学成绩
} student_t;

上述结构体中规定 学生姓名name 最大长度 MAX_STU_NAME_LEN 是 32 个字节(包含尾零在内)。

班级结构体

// 班级名称的最大长度
#define MAX_CLASS_TITLE_LEN (64)

// 定义每个班级最大学生个数。
#define MAX_STU_COUNT_IN_CLASS_ROOM  (100)

// 班级的结构体
typedef struct class_room {
    char class_title[MAX_CLASS_TITLE_LEN];  // 班级名
    student_t student[MAX_STU_COUNT_IN_CLASS_ROOM]; // 每个班级的学生
    int student_count; // 用来记录具体的学生个数
} class_room_t;

上述结构体中规定了一个班级的具体信息,其中宏 MAX_STU_COUNT_IN_CLASS_ROOM定义了每个班级最多容纳 100 个学生。班级名称最多 64 个字节(包含尾零在内)。具体学生数由成员变量 student_count 记录。

学校的定义

如下的宏定义的每个学校容纳的最大班级数。

// 每个学校最大的班级数量
#define MAX_CLASS_COUNT_IN_SCHOOL (50)

使用全局的数组来存储学校的信息。定义如下

// 用于存放班级对象,初始状态为空
static class_room_t class_rooms[MAX_CLASS_COUNT_IN_SCHOOL] = {};
static int class_room_count = 0;  // 班级的个数

上述全局变量 class_room_count 用来记录数组中的数据个数,班级的数据从数组 class_rooms 索引 0 位置顺序排列,中间不留空隙。

项目文件

初始程序框架内容如下

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

#include "tools.h"
#include "school.h"
#include "class_room.h"

// 用于存放班级对象,初始状态为空
static class_room_t class_rooms[MAX_CLASS_COUNT_IN_SCHOOL] = {};
static int class_room_count = 0;  // 班级的个数


void show_school_menu(void)
{
    printf("        xxxx小学信息管理系统\n");
    printf("+-----------------------------------+\n");
    printf("| 1) 添加班级                       |\n");
    printf("| 2) 删除班级                       |\n");
    printf("| 3) 进入管理班级                   |\n");
    printf("| 4) 列出所有班级                   |\n");
    printf("| 5) 保存班级信息                   |\n");
    printf("| 6) 加载班级信息                   |\n");
    printf("| 0) 退出程序                       |\n");
    printf("+-----------------------------------+\n");
    printf("请选择:");
    fflush(stdout);  // 清空缓冲区
}
// 此函数用来管理班级数据
void class_manager(void)
{
    while (1)
    {
        int sel = 0;
        show_school_menu();
        scanf("%d", &sel);
        switch (sel)
        {
            case 1:  // 1) 添加班级
                // add_class_room();
                break;
            case 2:  // 2) 删除班级
                // del_class_room();
                break;
            case 3:  // 3) 进入管理班级
                // enter_class_manager();
                break;
            case 4:  // 4) 列出所有班级
                // list_all_class_room();
                break;
            case 5:  // 5) 保存班级信息
                // save_to_csv_file(DEFAULT_DOC_PATHNAME);
                break;
            case 6:  // 6) 加载班级信息
                // load_from_csv_file(DEFAULT_DOC_PATHNAME);
                break;
            case 0:  // 0) 退出程序
                return;
            default:
                printf("不存在的选项,请重新输入\n");
                sleep(2);
        }
    }
}

班级相关模块:class_room.c

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

#include "tools.h"
#include "student.h"
#include "class_room.h"


// 此函数用来显示操作菜单
static void show_class_menu(class_room_t *aclass)
{
    printf("        %s-班级管理\n", aclass->class_title);
    printf("+-----------------------------------+\n");
    printf("| 1) 添加学生                       |\n");
    printf("| 2) 修改学生的语文成绩             |\n");
    printf("| 3) 修改学生的数学成绩             |\n");
    printf("| 4) 删除学生                       |\n");
    printf("| 5) 列出所有学生的成绩             |\n");
    printf("| 0) 退出班级                       |\n");
    printf("+-----------------------------------+\n");
    printf("请选择:");
    fflush(stdout);
}

// 此函数用来管理学生数据
void student_manager(class_room_t *aclass)
{
    while(1) {
        int sel = 0;
        show_class_menu(aclass);
        scanf("%d", &sel);
        switch (sel)
        {
            case 1:  // 1) 添加学生
                // add_student(aclass);
                break;
            case 2:  // 2) 修改学生的语文成绩
                // modify_chinese_score(aclass);
                break;
            case 3:  // 3) 修改学生的数学成绩
                // modify_math_score(aclass);
                break;
            case 4:  // 4) 删除学生
                // del_student(aclass);
                break;
            case 5:  // 5) 列出所有学生的成绩
                // list_all_student_info(aclass);
                break;
            case 0:  // 0) 退出班级
                return;
            default:
                printf("不存在的选项,请重新输入\n");
                sleep(2);  // 让程序睡眠2秒
        }
    }
}
#include <stdio.h>
#include "school.h"

int main(int argc, char *argv[])
{
    // 加载 csv 文件中的信息
    load_from_csv_file(DEFAULT_DOC_PATHNAME);
    // 进入学生信息管理主界面
    class_manager();

    return 0;
}