第二十四章、校园信息管理系统项目
信息管理系统(Information Management System, IMS)是一种用于收集、存储、处理和分发信息的软件系统,旨在有效管理和利用信息资源,支持决策制定和业务操作。
如下应用都属于信息管理系统。
- CRM -- 客户关系管理(Customer Relationship Management)
- ERP -- 企业资源计划(Enterprise Resource Planning)
- SCM -- 供应链关系管理(Supply Chain Management)
- HIS -- 医院信息系统(Hospital Information System)
信息管理系统的核心功能如下
- 数据收集:从内部或外部来源获取数据(如传感器、用户输入等)。
- 存储与管理:通过文件、数据库或云存储管理结构化或非结构化数据。
- 处理与分析:清洗、转换数据,并通过算法或工具(如BI工具)生成洞察。
- 信息传递:以报告、仪表盘、通知等形式向用户提供有用信息。
- 控制与安全:确保数据完整性、访问控制和合规性。
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 位置顺序排列,中间不留空隙。
项目文件
- 学校相关模块:
school.c、school.h; - 班级相关模块:
class_room.c、class_room.h; - 学生相关模块:
student.h; - 工具相关模块:
tools.c、tools.h; - 主模块:
main.c。
初始程序框架内容如下
- 学校相关模块:
school.c
#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秒
}
}
}
- 主模块:
main.c。
#include <stdio.h>
#include "school.h"
int main(int argc, char *argv[])
{
// 加载 csv 文件中的信息
load_from_csv_file(DEFAULT_DOC_PATHNAME);
// 进入学生信息管理主界面
class_manager();
return 0;
}