基于C语言的学生住宿信息管理系统

primadonna

发布日期: 2019-04-14 10:44:11 浏览量: 281
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一、系统需求分析

学生住宿信息管理系统主要包括宿舍楼信息,在住学生基本信息,在住学生缴纳住宿费信息等三方面的信息。

系统要求

  • 能对以上三类信息进行录入,修改,删除功能,并且在录入时系统应提供快捷和方便的数据录入方式,避免重复操作,降低数据冗余度。同时还应提供自动数据校验功能,满足数据正确性、合理性、有效性和依耐性等要求,避免录入无用或非法数据

  • 能对三种数据进行查询,并且能按一下多种条件分别进行查询:

    • 按宿舍楼编号查询宿舍楼信息
    • 按楼栋管理员姓名查询其所管理的宿舍楼信息
    • 按学号查询学生基本信息
    • 以学生姓名、学生类别、班级等组合条件查询学生基本信息,并能进行模糊查询
    • 以学号为条件,查询学生缴纳住宿费信息
    • 查询某时间段内所有学生的缴费信息
  • 能提供统计功能,具体包括:

    • 统计所有宿舍楼可住学生数、在住学生数、空床位数、入住率(保留两位小数),按入住率从高到低排序后输出
    • 分性别统计所有年级各种类别学生的在住人数,按年级从高到低输出
    • 统计四年来各宿舍楼住宿费收入
    • 统计并输出欠缴住宿费信息,按缴费金额从高到低排序后输出
  • 数据存取功能。要求程序在运行时,三种信息以链表形式存在于内存中,数据存储采用动态储存分配方式。同时在外存上以数据文件对数据进行存储,且保证在内存和外存两种存储介质上内容的一致性

二、总体设计

学生住宿信息管理系统由五大功能模块组成:文件模块,编辑模块,查询模块,统计模块,帮助模块。如下图所示:

  • 文件模块包括四个子模块:数据保存,数据备份,数据恢复,退出

  • 编辑模块包括九个子模块:添加宿舍楼,修改宿舍楼,删除宿舍楼,添加学生基本信息,修改学生基本信息,删除学生基本信息,添加住宿缴费信息,修改住宿缴费信息,删除住宿缴费信息

  • 查询模块包括三个子模块:查询宿舍楼信息,查询学生基本信息,查询学生住宿缴费信息

  • 统计模块包括四个子模块:统计各宿舍楼入住率,统计在住学生分类信息,统计宿舍楼年度收入情况,统计住宿费欠缴情况

  • 帮助模块包括二个子模块:帮助主题,关于系统

三、数据结构设计

3.1 宿舍楼信息链结点结构(DORM_NODE)及用法

  1. typedef struct dorm_node {
  2. char dorm_id[5]; /**< 宿舍楼号*/
  3. char name[10]; /**< 姓名*/
  4. char tel[20]; /**< 联系电话*/
  5. short room_amount; /**< 房间数目*/
  6. short bed_amount; /**< 床位数目*/
  7. float fee; /**< 每床位每年住宿费*/
  8. struct stu_node *snext; /**< 指向学生基本信息支链的指针*/
  9. struct dorm_node *next; /**< 指向下一结点的指针*/
  10. } DORM_NODE;
数据项名称 数据类型及长度 数据项标识 举例
宿舍楼号 char[5] dorm_id D13
姓名 char[10] name 张三
联系电话 char[20] tell 13777855768

3.2 学生基本信息链结点结构(STU_NODE)及用法

  1. typedef struct stu_node {
  2. char stu_id[12]; /**< 学号*/
  3. char name[10]; /**< 姓名*/
  4. char sex[4]; /**< 性别*/
  5. char birthday[12]; /**< 出生日期*/
  6. char type[5]; /**< 学生类别*/
  7. char term; /**< 学制*/
  8. char enroll_date[10]; /**< 入学年月*/
  9. char class_id[10]; /**< 班级*/
  10. char dorm_id[5]; /**< 宿舍楼号*/
  11. char room[5]; /**< 房间号*/
  12. char tel[20]; /**< 联系电话*/
  13. struct charge_node *cnext; /**< 指向缴费信息支链的指针*/
  14. struct stu_node *next; /**< 指向下一结点的指针*/
  15. } STU_NODE;
数据项名称 数据类型及长度 数据项标识 举例
学号 char[1] stu_id 1514588
姓名 char[10] name 张三
性别 char[4] sex
出生日期 char[12] birthday 19970923
学生类别 char[5] type 本科
学制 char term 4
入学年月 char[10] enroll_date 20150901
班级 char[10] class_id CS1504
宿舍楼号 char[5] dorm_id D13
房间号 char[5] room 525
联系电话 char[20] tel 17777309475

3.3 缴费信息链结点结构(CHARGE_NODE)及用法

  1. typedef struct charge_node {
  2. char stu_id[12]; /**< 学号*/
  3. char name[10]; /**< 姓名*/
  4. char date[12]; /**< 缴费日期*/
  5. float sum; /**< 缴费金额*/
  6. char payee[10]; /**< 收费人*/
  7. char notes[5]; /**< 备注*/
  8. struct charge_node *next; /**< 指向下一结点的指针*/
  9. } CHARGE_NODE;
数据项名称 数据类型及长度 数据项标识 举例
学号 char[12] stu_id 1514588
姓名 char[10] name 张三
缴费日期 char[12] date 20150901
缴费金额 float sum 1000
收费人 char[10] payee 陈老师
备注 char[5] notes 贷款

3.4 宿舍楼入住率统计信息链结点结构(USE_RATE_NODE)及用法

  1. typedef struct use_rate_node {
  2. char dorm_id[5]; /**< 宿舍楼号*/
  3. unsigned short total_num; /**< 可住学生数*/
  4. unsigned short used_num; /**< 在住学生数*/
  5. unsigned short free_num; /**< 空床位数*/
  6. float use_rate; /**< 入住率*/
  7. struct use_rate_node *next; /**< 指向下一结点的指针*/
  8. } USE_RATE_NODE;
数据项名称 数据类型及长度 数据项标识 举例
宿舍楼号 char[5] stu_id D13
可住学生数 unsigned short total num 400
在住学生数 unsigned short used num 100
空床位数 unsigned short free num 300
入住率% float use rate 25%

3.5 在住学生分类统计信息链结点结构(STU_TYPE_NODE)及用法

  1. typedef struct stu_type_node {
  2. char grade[5]; /**< 年级*/
  3. unsigned short school_boy1; /**< 男专科生数*/
  4. unsigned short school_girl1; /**< 女专科生数*/
  5. unsigned short school_boy2; /**< 男本科生数*/
  6. unsigned short school_girl2; /**< 女本科生数*/
  7. unsigned short school_boy3; /**< 男硕士生数*/
  8. unsigned short school_girl3; /**< 女硕士生数*/
  9. unsigned short school_boy4; /**< 男博士生数*/
  10. unsigned short school_girl4; /**< 女博士生数*/
  11. unsigned short school_boy5; /**< 其他男生数*/
  12. unsigned short school_girl5; /**< 其他女生数*/
  13. struct stu_type_node *next; /**< 指向下一结点的指针*/
  14. } STU_TYPE_NODE;
数据项名称 数据类型及长度 数据项标识 举例
年级 char[5] grade 2014
男专科生数 unsigned short school_boy1 212
女专科生数 unsigned short school_girl11 86
男本科生数 unsigned short school_boy2 540
女本科生数 unsigned short school_girl12 112
男硕士生数 unsigned short school_boy3 900
女硕士生数 unsigned short school_girl13 760
男博士生数 unsigned short school_boy4 500
女博士生数 unsigned short school_girl14 280
其他男生数 unsigned short school_boy5 860
其他女生数 unsigned short school_girl15 980

3.6 宿舍楼年度住宿费收入统计信息链结点结构(INCOME_NODE)及用法

  1. typedef struct income_node {
  2. char dorm_id[5]; /**< 宿舍楼号*/
  3. float year1_income; /**< 年度1收入*/
  4. float year2_income; /**< 年度2收入*/
  5. float year3_income; /**< 年度3收入*/
  6. float year4_income; /**< 年度4收入*/
  7. struct income_node *next; /**< 指向下一结点的指针*/
  8. } INCOME_NODE;
数据项名称 数据类型及长度 数据项标识 举例
宿舍楼号 char[5] stu_id D13
年度1收入 float year1_income 2000
年度2收入 float year2_income 8000
年度3收入 float year3_income 10320
年度4收入 float year4_income 28000

3.7 在住学生欠费统计信息链结点结构(UNCHARGE_NODE)及用法

  1. typedef struct uncharge_node {
  2. char stu_id[12]; /**< 学号*/
  3. char name[10]; /**< 姓名*/
  4. char dorm_id[5]; /**< 宿舍楼号*/
  5. char room_num[5]; /**< 房间号*/
  6. float amount; /**< 欠缴金额*/
  7. struct uncharge_node *next; /**< 指向下一结点的指针*/
  8. } UNCHARGE_NODE;
数据项名称 数据类型及长度 数据项标识 举例
学号 char[12] stu_id 1514588
姓名 char[10] name 张三
宿舍楼号 char[5] dorm_id D13
房间号 char[5] room_num 525
欠缴金额 float amount 320

3.8 三方向十字交叉链表结构图

四、详细设计

4.1 主程序运行流程图

打开系统后首先进入的是欢迎界面,然后按任意键进入系统。继而加载文件中储存的链表数据信息,文本菜单界面初始化,生成可视化窗口。

系统的功能主要包括数据维护,数据查询以及数据统计三大方面,最后保存链表数据信息,退出系统。

4.2 数据保存流程图

在数据保存过程中,首先访问的是宿舍楼主链信息,遍历主链指针,当指针不为空时在宿舍楼信息链中插入新的结点并正确输入宿舍楼信息;然后以插入的结点指针为学生基本信息链的头指针,遍历学生基本信息链表指针,当不为空时,以该指针为第三条链缴费信息链的头指针,最后遍历住宿缴费信息链表,插入新的结点作为该学生的住宿缴费信息。

4.3 数据加载流程图

在数据加载过程中,首先加载的是宿舍楼信息,动态创立一个宿舍楼结点,以此为头指针遍历链表,读入宿舍楼信息;

然后动态创立学生基本信息结点,在宿舍楼链中找到该学生所在的宿舍楼结点,在该节点下建一条学生基本信息链,遍历链表,读入学生基本信息;

最后动态创立住宿缴费信息结点,在学生基本信息来链中找到该学生的基本信息,在该结点下建一条住宿缴费信息链,遍历链表,读入住宿缴费信息。

4.4 宿舍楼信息插入流程图

4.5 宿舍楼信息修改流程图

4.6 宿舍楼信息删除流程图

4.7 学生基本信息插入流程图

4.8 学生基本信息修改流程图

4.9 学生基本信息删除流程图

4.10 住宿缴费信息插入流程图

4.11 缴费信息修改流程图

4.12 住宿缴费信息删除流程图

五、运行测试与结果分析

进入系统欢迎界面

数据保存

添加宿舍楼信息

宿舍楼信息查询

学生基本信息查询

宿舍楼入住率统计

六、总结

刚开始我看到题目完全不知该从何处下手,因为平时学的C根本没有写过大型程序,根本不知该用哪方面的知识来实现文本菜单界面,因为平时只做过一些输入输出的普通小程序,根本没有界面的概念。于是我就想如果先运行一下老师给的样例程序,脑中大概也就有了一些概念和想法。可是把老师给的几个代码拿来一运行编译error就有几十行,面对那上千行的代码,我就不知该怎么下手了。后来快要开学了了,我又开始行动起来。首先我拿起那本《C语言实验与课程设计》,我就反复看,大概懂了一些控制台函数的用法,可是还是不知道怎么动手写代码,我就开始将书上的代码一段一段的输入进去跑一跑,慢慢的就大概懂了怎么来实现那些界面。

课设中最重要的部分是如何一一实现所要求的功能。我参考实验书上给的源代码,编写了链表的创建,之后是将链表的内容写入到文件中保存,并将文件中写入的内容再次逐条读取出来,显示在屏幕上。这个主体写完了,接下来就开始写宿舍楼、学生基本信息信息的查询函数,书上有完整的例子,这个就比较容易点。

最后就是调试程序了。这个应该是整个课程设计中最为复杂和难搞的部分。首先是整个系统,光是函数就有几十个,而且经常是一个函数中又调用着若干其它函数,这样调试起来就比较困难,因为就算一个函数里,一点小小的错误就会引起连锁反应导致其它函数都出错,而且有些错误时隐性的,就是可能在这个函数中运行没问题,可在哪个函数中运行起来又有大问题。所以调试也是最耗时间和精力的一个环节,有时候我为了测试一个函数的功能是否稳定,得将程序跑很多次,一遍又一遍的运行,看看有没有一些不足的地方,有没有一些隐藏的问题,然后又得静下心来仔细分析问题原因所在并慢慢地纠正并再次调试运行,直到满意为止。在调试程序过程中我也体会调试员真还得过硬的基础知识,能敏锐觉察出代码中的错误,而且还得有足够的精力和耐力。

尽管程序系统算是完成了,但是当我开始写报告时才发现原来课程设计才刚完成了一半而已。由于书上给了很多完整的例子,所以很多时候我就直接将书上的代码写了上去,有很多自己也不是很懂,到学校后在完善程序的过程中又问了不少同学,有些代码我觉得别人写的比较好于是我便直接借鉴过来了,这样便造成了一个后果,虽然我的程序可以跑起来,可是有很多地方我自己都不是很懂,导致在演示时老师问了我好几个问题我竟没回答上来。所以我明白了不管我们以后写程序是不是借鉴了别人的或者网上的代码,我们首先得把它完完全全搞懂才能为自己所用。

上传的附件 cloud_download 基于C语言的学生住宿信息管理系统.7z ( 650.61kb, 3次下载 )
error_outline 下载需要12点积分

发送私信

生活就像骑自行车,只有不断前进,才能保持平衡

16
文章数
14
评论数
最近文章
eject