C/C++校园疫情填报管理系统[2023-01-31]
一、数据导入
系统的预设数据文件统一存放在软件项目的data目录中。文件中,#开头的一行文字为注释(相当于C语言的/* */)。
- 学生数据导入
从本地文件系统中读取学生信息。文件名为students.txt,文件格式如下(每行一名同学信息,各字段空格分隔)
#学号 姓名 学院 班级 宿舍
202000704000 张三 计算机学院 计201 南区6-101
- 风险地区导入
从本地文件系统中读取国家划定的风险区域。文件名为riskregion.txt,文件格式如下
#[日期]
#风险区域
[2022-11-21]
广西区-桂林市-象山区
广西区-桂林市-七星区
[2022-11-20]
广西区-桂林市-象山区
广西区-桂林市-七星区
- 疫情填报表导入
从本地文件系统中读取用户预设的问卷。问卷名为questionnare.txt,问卷格式如下。注意,对于多次填报的个别题目为选做内容
#[题干]
#题型(填空/单选/多选)@填报次数(once/many),填入的最大字符数(如果是填空题)
#选项(如果有的话。每行一个)
[学号]
填空@once,10
[日期(yyyy-mm-dd)]
填空@once,10
[健康码颜色]
单选@once
绿色
黄色
红色
[返校交通方式]
单选@once
火车/动车/高铁
飞机
自驾
其它
[车次]
填空@once,20
[风险类型]
单选@once
无
途径高风险地区
居住在高风险地区
密接高危人群
[返校途径城市(包括家和学校所在城市,城市间用空格分隔)]
填空@once,1000
# 全体同学,返校后需要多次核酸检测(根据防疫政策要求,3天2检或5天3检等)
[核算检测的日期及结果,录入格式为yyyy-mm-dd:-/+(-表示阴性,+表示阳性)]
填空@many,20
- 疫情管控措施表导入(选做)
从本地文件系统中读取管控措施选项。文件名为plan.txt,格式如下
#[题干]
#题型:填空/单选/多选,填入的最大字符数(如果是填空题)
#选项(如果有的话。每行一个)
# 红、黄码的同学,以及核酸阳性的同学,需要疫情管控
[管控措施]
单选
就地隔离
校内集中隔离
校外集中隔离
居家隔离
[隔离地点]
填空,200
二、功能需求
整体流程:导入数据->填报疫情->查看、统计结果。
- 正确读取导入的文件,并用恰当的数据结构存储。
- 疫情申报数据及管控数据,及时存储进自定义的文件中。需要多次填报的题目,例如核酸检测结果,提供额外的填报入口。
- 根据姓名,查看单个同学的填报信息。
- 查看途径某城市的学生列表信息。
- 查看黄码/红码,以及核酸阳性的学生信息。
- 统计各个隔离地点的学生信息。
- 对于红码和核酸阳性的学生,建立他们所途经的城市图
附
一、程序结构
建议采用经典的三层架构(3-tier architecture)来实现,将整个业务应用划分为:界面层(User Interface Layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data Access Layer)。
在构建多目录/多文件的项目工程时,目录名、文件名应体现出相应的层次。可供参考的项目目录组织如下,各同学根据自己的设计进行改动。
Project: EpidemicReport
|----ui 界面的交互
| |----menu.cpp 菜单定义及显示
| |----epiDetail.cpp 单个疫情数据的详细显示定义
| |----epiList.cpp 多个疫情数据的列表显示定义
| |----city.cpp 城市图的显示定义
| |----layout.cpp 整个界面的规划(菜单、显示区、输入区)
| |---- …… ……
|----business 业务逻辑的实现
| |----report.cpp 疫情填报
| |----statics.cpp 统计处理
| |----load.cpp 配置数据载入
| |----search.cpp 查找功能
| |---- …… ……
|----model 模型 (如果操作简单,可以并入business中)
| |----student.cpp 学生模型的操作(数据处理)
| |----epidemic.cpp 疫情信息的操作(数据处理)
| |---- …… ……
|----dataStructure 数据结构的操作
| |----sequenceList.cpp 顺序表
| |----linkedList.cpp 链表
| |----queue.cpp 队列
| |----tree.cpp 二叉树/红黑树等
| |----hash.cpp 散列表
| |----graph.cpp 图
| |----serialize.cpp 将数据结构序列化到文件中(保存到文件)
|----utils 各种工具库
| |----memoryLib.cpp 内存管理库:实现内存的分配、释放、
| | 内存池、智能指针等
| |----fileLib.cpp 文件的操作:文件的打开、关闭、读写等
| |----keyboard.cpp 键盘的操作:数据的读入
| |----display.cpp 显示器的输出控制:清屏、定位等
|----headers 头文件的定义
| |----business.h 业务功能的操作(函数)声明
| |----ui.h 视图定义及操作声明
| |----dataStructure.h 数据结构的模型定义及操作接口声明
| |----utils.h 工具库的操作声明
| |----model.h (业务)模型的类型定义与操作声明
有能力的同学,也可以采用MVC等更新的架构模式来设计程序。此方式虽然可以更加优雅地实现功能,但涉及较多的函数指针应用,因此仅供自信自学能力强的同学参考。
二、界面设计(可选)
整个程序,无论输入输出什么信息,最好有统一的风格。参考的界面布局如下。可以调用系统的cls等命令进行清屏;可以设定好屏幕输出的缓冲区,要输出的数据、菜单等信息先写入缓冲区,再一起输出。
内容展示区
菜单显示区
输入区
三、关键技术、函数提示
- 通用数据结构的实现,可采用数据元素的无类型定义来实现。
例如,顺序表可以定义为:
无类型数据元素的赋值操作,可用memcpy()函数实现。
/* 从存储区 src 复制 n 个字节到存储区 dest */
void *memcpy(void *dest, const void *src, size_t n);
查找时,可以通过函数指针来个性化查找字段。例如,按学生的学号来查找,可如下实现:
- 文本文件的读取及字符串处理
/* 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置 */
char *strchr(const char *str, int c) ;