1、HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGYC 语言程序设计课程设计报告课设题目: 宿舍管理系统 系 部: 电气与信息工程学院 专 业: 电子信息科学与技术(车联网工程) 姓 名: 李鑫 完成日期: 2014 年 6 月 25 日2014 年 7 月 5 日 宿舍管理系统第 1 页 共 28 页目 录C 语言程序设计 0课程设计报告 .01.课程设计目的 22.需求分析 22.1 要求 .22.2 任务描述 .32.3 运行环境 .32.4 开发工具 .33.总体设计 33.1 系统模块设计 .34.详细设计 44.1 数据结构设计 .44.2 模块接口设
2、计 .54.3 以下是几个主要模块的流程图: 65.运行结果 125.1 欢迎界面及文件信息导入: .125.2 主菜单界面: .125.3 新建学生住宿信息: 135.4 查询指定学号的学生住宿信息: .145.5 修改指定宿舍号及床位号的学生住宿信息 .155.6 删除指定宿舍号及床位号的学生住宿信息: .155.7 显示指定宿舍号的学生住宿信息: .165.8 统计空床位数: .165.9 保存学生住宿信息 .175.10 退出界面 .176.程序前后文本 187.编程体会 188.程序源代码 189.参考文献 281.课程设计目的1) 通过课程设计,加深对结构化程序设计思想的理解,能对
3、系统功能进行分析,宿舍管理系统第 2 页 共 28 页并设计合理的模块化结构。2) 通过课程设计,进一步掌握 C 语言中重要的数据结构。掌握并熟练运用指针、链表、结构体、文件等数据结构。3) 通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。4) 通过课程设计,培养 C 语言知识运用和自学能力,真正的把课堂上获得的知识运用起来,培养自己对程序编写的兴趣,并能独立设计和实现一个小型系统。5) 通过课程设计,加强了自己的程序分析能力。2.需求分析2.1 要求1) 遵循软件开发过程的基本规范;能灵活应用,初步具备运用 C 程序解决实际问题的能力。2) 运用结构化程序设计方法,按照
4、课程设计题目要求,完成包括需求分析、数据结构设计、概要设计、详细设计、编写代码、调试和测试 C 程序等过程。3) 学会利用数组、结构体、链表进行相关信息表示。4) 功能模块划分清晰,系统结构图符合功能操作要求,且有详尽的功能描述5) 各主要功能模块有详尽的流程图及描述,用函数的形式实现,且调用入口、功能、出口等关系正确。6) 所设计的 C 程序较好的可读性和可靠性;程序书写风格规范,注释清晰。7) 界面友好(良好的人机互交) ,凡需要输入信息时,都有较详尽的提示信息,并对输入信息有较完善的值域分析。8) 程序经上机调试通过,不应出现语法型、功能型错误,并获得满意的结果。9) 学会通过各功能性测
5、试用例测试程序的能力,尽可能避免原则性错误的出现。10) 掌握编写、调试和测试 C 语言程序的基本技巧,充分理解结构化程序设计的基本方法。11)C 语言课程设计报告的内容反应实际设计过程,且符合格式要求,无抄袭现象。2.2 任务 描述现学校要管理宿舍入住的学生,请设计一宿舍管理程序,以方便学校宿舍管宿舍管理系统第 3 页 共 28 页理员对学生进行管理,该程序应该具有以下功能:1) 能从键盘录入床位信息。2) 指定学号,显示该学生的住宿的信息。3) 指定宿舍号,显示住宿信息。4) 给定宿舍号、床位号,修改住宿信息。5) 给定宿舍号、床位号,删除住宿信息。2.3 运行环境1) WindowsXP
6、/7 系统2) VC+6.0 编译环境2.4 开发工具C 语言3.总体设计3.1 系统模块设计1) 欢迎及信息导入界面:构造函数 int main(),显示欢迎及制作信息。构造函数 void loadRec(), 从磁盘文件导入住宿信息到内存。2) 主菜单界面:构造函数 int menu_select(),实现系统主菜单的显示。3) 住宿信息新建:构造函数 void createRec(),新建或录入学生住宿信息。4) 住宿信息查询:构造函数 void searchRec()查询指定学号的学生住宿信息。5) 住宿信息修改:构造函数 void modifyRec()修改指定宿舍号及床位号的学生住
7、宿信息。6) 住宿信息删除:构造函数 void deleteRec()实现对指定宿舍号及床位号的学生住宿信息记录的删除。并通过函数 free(),释放内存空间。7) 住宿信息浏览:构造函数 void listRec(),实现对指定宿舍住宿信息浏览界面的显示。8) 住宿信息统计:构造函数 void countRec(),实现对床位信息中空床位数的宿舍管理系统第 4 页 共 28 页统计。9) 住宿信息保存:构造函数 void writeInfo(),保存学生住宿信息。10) 退出界面:构造函数 void exit0()退出程序。系统功能模块图进入主界面信息添加模块信息查询模块信息修改模块信息修改
8、模块信息显示模块信息保存模块文件读入住宿信息空床位统计模块系统退出模块4.详细设计4.1 数据结构设计根据系统要求,系统中需要保存的数据信息,其结构如下:数据项名称 数据项系统表示 数据类型 数据长度 备注姓名 p1-name 字符串 20学号 p1-id 字符串 20班级 p1-classs 字符串 10入住时间 p1-intake.yearp1-intake.monthp1-intake.day整形床位信息 p1-bed.dorm,p1-bed.bedidp1-bed.k字符型字符型整形105根据系统要求,系统中需要保存的类别信息,其结构如下:类别代号 char name20 char i
9、d20 char classs10 DATE intake类别名称 姓名 学号 班级 入住时间宿舍管理系统第 5 页 共 28 页类别代号 INFO bed类别名称 住宿情况基本信息结构体Typedef structint year;int month;int day;DATE;Typedef structchar dorm10;char bedid5;int k;INFO;struct studentchar name20;char id20;char classs20;DATE intake;INFO bed;struct student *next;4.2 模块接口设计1) 所有函数模块
10、声明如下:void createRec(); /*新建住宿信息记录*/void loadRec(); /*从磁盘文件导入住宿信息到内存void searchRec(); /*查询住宿记录*/宿舍管理系统第 6 页 共 28 页void modifyRec(); /*修改住宿记录*/void countRec(); /*统计空床位记录*/void deleteRec(); /*删除住宿记录*/void listRec(); /*显示住宿信息*/void writeInfo(); /*保存住宿记录*/void exit0(); /*退出*/int menu_select(); /*主菜单*/2)
11、定义一个全局变量以及结构体指针:struct student *head=NULL,*p1,*p2,*p3;定义结构体指针 head 为头指针,p1 为输入数据缓存空间指针,p2 为尾指针,p3 为中间指针int writeinfo_flag=0; 保存住宿信息标志的全局变量标志。3) 主要模块的实现系统以主函数 int main()为入口调用 void loadRec()函数导入住宿信息,然后调用 int menu_select();函数,进入主菜单界面。系统接收用户输入的选择,调用相应的函数,进入到下一级菜单进行相关工作。4.3 以下是几个主要模块的流程图:1) 主菜单函数:宿舍管理系统第
12、 7 页 共 28 页否是否 是图 1 主函数流程图2) 查询指定学号学生住宿信息函数:接受用户选择是否合法开始显示主菜单界面是否为零匹配相应数值 退出系统显示该学生住宿信息按任意键返回主菜单调用对应函数输入选项判断是否合法是否宿舍管理系统第 8 页 共 28 页图 2 显示指定宿舍学生住宿信息结构框图3) 新建或添加学生住宿信息函数:图 3 新建若干组学生住宿信息结构框图输入选项否判断是否合法是输入建立信息条数判断是否合法输入学生住宿信息是否按意键返回主菜单宿舍管理系统第 9 页 共 28 页4) 修改(删除)指定宿舍号及床位号的学生住宿信息函数:图 4 修改(删除)指定宿舍号及床位号的学生
13、住宿信息结构框图5) 显示指定宿舍号学生住宿信息函数:对相应学生住宿信息进行修改(删除)按任意键返回主菜单输入选项否是否正确是否是否有对应是宿舍号床位号宿舍管理系统第 10 页 共 28 页图 5 显示指定宿舍号学生住宿信息函数结构框图 显示相应宿舍所有学生住宿信息按任意键返回主菜单输入选项否是否正确是否是否有对应是输入宿舍号宿舍管理系统第 11 页 共 28 页6) 保存学生住宿信息函数:图 6 保存学生住宿信息函数结构框图0判断全局变量writenflag 的值1否判断数据库中是否有住宿信息是按任意键返回主菜单将学生住宿信息保存到文件信息保存完毕关闭文件判断文件路径是否正确是否数据库中是否
14、有图书信息数据库中学生住宿信息无法保存宿舍管理系统第 12 页 共 28 页5.运行结果5.1 欢迎界面及文件信息导入:图 1 欢迎界面及文件信息导入5.2 主菜单界面:宿舍管理系统第 13 页 共 28 页图 2 主菜单界面5.3 新建学生住宿信息:宿舍管理系统第 14 页 共 28 页图 3 新建学生住宿信息5.4 查询指定学号的学生住宿信息:图 4 查询指定学号的学生住宿信息:宿舍管理系统第 15 页 共 28 页5.5 修改指定宿舍号及床位号的学生住宿信息图 5 修改指定宿舍号及床位号的学生住宿信息5.6 删除指定宿舍号及床位号的学生住宿信息:图 6 删除指定宿舍号及床位号的学生住宿信
15、息宿舍管理系统第 16 页 共 28 页5.7 显示指定宿舍号的学生住宿信息:图 7 显示指定宿舍号的学生住宿信息5.8 统计空床位数:图 8 统计空床位数宿舍管理系统第 17 页 共 28 页5.9 保存学生住宿信息图 9 保存学生住宿信息5.10 退出界面图 10 退出界面宿舍管理系统第 18 页 共 28 页6.程序前后文本1 导入的文本路径:1.txt张强 1 11 2012-08-06 125 1 1王阳明 2 11 2012-08-06 125 2 0陈超 3 11 2012-08-06 125 3 0李可 4 11 2012-08-06 128 4 12 保存后的文本路径:1.t
16、xt王阳明 2 11 2012-8-6 125 2 0陈超 3 11 2012-8-6 125 3 0李可 4 11 2012-8-6 128 4 1陈东 5 11 2012-8-6 128 1 07.编程体会本次课程设计总体感觉要较之去年的简单了不少。但由于 C 语言初学较差,基础薄弱,感觉还是存在较大的问题。所以这次的编程实现主要是对教师模板进行的在修改,使得其满足课设中所提众多要求。编程中大体要满足的一般都是新建、修改、删除、保存、查询、文件读入等功能,其中的删除和文件读入较为复杂。个人认为这次课设的一个难点是要求运用链表实现编程。不得不说链表的运用会提高程序的清晰度和可读性。但由于链表
17、理解起来较难,这会在应用上存在极大的难度。课设中信息较为复杂,如床位信息、入住时间,都是作为一个信息存在,但本省包含多个信息量。所以在定义结构体时,对结构体进行了另命名和结构体嵌套。在创建、删除等链表等功能的实现中,经常需要找到当前结点之前的结点,也就是前驱结点。随着程序的进展,也需要更新前驱结点指针。在真正的程序应用中,总是会有许多出错的地方,比如各函数对输入数据格式的限制。文件读入时,文件不存在,文件读取错误等。还有指针应用中,申请空间及对废弃指针存储内容的释放等。细节决定成败,程序编写中一个微小的错误就会引发一系列的错误,造成修改难度大,程序无法运行的诸多麻烦。所以在程序编写之初,便应保
18、持良好的心态,认真对待,有条不紊。通过这次课程设计,我可以说是获益匪浅,不仅使得我回顾了大量的 C语言知识,巩固了已知,在此基础之上,我还了解理解了虚度哦故去不是很理解或根本不知道的东西。而且从另一侧面锻炼了我的心性,让我在对待事物上可以统筹,又可以对每一个部分进行充分的认识。以及耐心,认真,反复检查,精益求精等良好的品行等。总之,本次课设于我意义重大,受益良多。宿舍管理系统第 19 页 共 28 页8.程序源代码/* 已知一个宿舍的信息为:床位信息(宿舍号、床位号、是否入住) 、学号、姓名、班级、入住时间,从键盘输入 n 个宿舍的信息,并将其保存在 () 文件中。 */*所使用的有头文件*/
19、#include#include#include#include #include#define LEN sizeof(struct student)/*结构体定义*/typedef structint year; /*年*/int month; /*月*/int day; /*日*/DATE;typedef struct char dorm10; /*宿舍号*/char bedid5; /*床位号*/int k; /*入住情况 k=(0/1)*/INFO;struct student char name20; /*姓名*/char id20; /*学号*/char classs10; /*班
20、级*/DATE intake; /*入住时间 */INFO bed; /*床位信息*/ struct student *next; ;/*函数声明*/void createRec(); /*新建住宿信息记录 */void loadRec(); /*从磁盘文件导入住宿信息到内存 */void searchRec(); /*查询住宿记录 */void modifyRec(); /*修改住宿记录 */宿舍管理系统第 20 页 共 28 页void countRec(); /*统计空床位记录 */void deleteRec(); /*删除住宿记录*/void listRec(); /*显示住宿信息
21、*/void writeInfo(); /*保存住宿记录*/void exit0(); /*退出*/int menu_select(); /*主菜单*/*链表操作所用结构体指针*/struct student *head=NULL,*p1,*p2,*p3;/*定义结构体指针 head 为头指针 p1 为输入数据缓存空间指针 p2 为尾指针*/*宿舍记录保存标志全局变量*/int writeinfo_flag=0;/*主函数*/int main() printf(“ntt n“);printf(“ntt n“);printf(“ntt C 语言课程设计- 宿舍管理 nn“);printf(“nt
22、t n“);printf(“ntt n“);printf(“ntt 指导老师:张吴波 n“);printf(“ntt 制作人:李鑫 班级:T1223-11 n“); printf(“ntt QQ:1726160202 n“);printf(“ntt 电话:18772966023 n“);printf(“nntt*n“); getchar();system(“cls“);loadRec();for(;) switch(menu_select() case 1: system(“cls“); createRec();break;case 2: system(“cls“); searchRec();
23、break;case 3: system(“cls“); modifyRec();break;case 4: system(“cls“); deleteRec();break;case 5: system(“cls“); listRec(); break;宿舍管理系统第 21 页 共 28 页case 6: system(“cls“); countRec(); break;case 7: system(“cls“); writeInfo();break;case 0: system(“cls“); exit0();return 0;default : getchar();system(“cls
24、“);printf(“n 选择错误,请正确输入你的选择(07),:n“);printf(“n 按任意键返回n“);getchar();system(“cls“); /*清屏*/return 0;/*主菜单*/int menu_select() int c;printf(“ntt n“); printf(“ntt 欢迎使用简易宿舍管理系统 n“);printf(“ntt*nn“);printf(“tt* 1.新建学生住宿信息 n“);printf(“tt* 2.查询指定学号的学生住宿信息 n“);printf(“tt* 3.修改指定宿舍号及床位号的学生住宿信息n“);printf(“tt* 4.
25、删除指定宿舍号及床位号的学生住宿信息n“);printf(“tt* 5.显示指定宿舍号学生住宿信息 n“);printf(“tt* 6.统计空床位数 n“);printf(“tt* 7.保存学生住宿信息 n“);printf(“tt* 0.退出(任何情况下按 Ctrl+C 退出程序)nn“);printf(“tt*n“);printf(“n 请输入相应选择(07):n“);scanf(“%d“,return c;/*从磁盘文件导入学生住宿信息到内存*/void loadRec() FILE *fp;int n=0;if(fp=fopen(“1.txt“,“r“)=NULL) /*打开文件 */
26、 printf(“文件不存在或无法打开!n“);return;宿舍管理系统第 22 页 共 28 页head=p1=(struct student *)malloc(LEN); /*开辟一个新单元*/p1-next =NULL;while(!feof(fp) n+;fscanf(fp,“%s%s%s %d-%d-%d %s%s%d“, p1-name,p1-id,p1-classs, if(p1-id0id09) n-;break;p2=(struct student *)malloc(LEN); /*开辟一个新单元 */p1-next =p2;p3=p1;p1=p2;p1-next =NUL
27、L;free(p2);p3-next=NULL;printf(“ntt %d 项信息输入完毕,按任意键返回n“,n);getchar();system(“cls“); /*清屏*/writeinfo_flag=0; /*设置保存记录标志*/if( fclose(fp) ) /* 关闭文件 */ printf( “Can not close the file!n“ );exit(0);/*新建宿舍信息记录*/void createRec() int n,i;if(head!=0) p3=head;while( p3-next!=NULL)p3=p3-next;getchar();printf(“
28、n 住宿信息数据库已存在,新建住宿信息将接续在原信息库的后面,按任意键继续:n“);getchar();system(“cls“); /*清屏 */p3-next=p1=(struct student *)malloc(LEN); /*开辟一个新单元*/else head=p1=(struct student *)malloc(LEN); /*开辟一个新单元*/宿舍管理系统第 23 页 共 28 页p1-next =NULL;printf(“nn 请输入希望建立的住宿基本信息条数 n(n10) printf(“nn 输入范围有误,请重新输入希望建立的宿舍基本信息条数 n(n10);/*开始建立
29、 n 条学生住宿基本信息记录*/printf(“nn 请输入学生的住宿信息如:n 姓名 学号 班级 入住时间 宿舍号 床位号 入住情况(0/1)n“);for(i=0;iname,p1-id,p1-classs, p2=(struct student *)malloc(LEN); /*开辟一个新单元 */p1-next =p2;p3=p1;p1=p2;p1-next =NULL;free(p2);p3-next=NULL;printf(“n %d 项信息输入完毕,按任意键返回 n“,n);getchar();system(“cls“); /*清屏*/writeinfo_flag=1; /*清除
30、保存记录标志*/*查询指定学号的学生住宿信息记录*/void searchRec()char id20;p1=head;if(p1=NULL) printf(“nn 住宿信息数据库为空 ! n“); printf(“n 按任意键返回n“);getch();system(“cls“); /*清屏*/return ;printf(“nn 请输入学生学号以便查证 :n“);scanf(“%s“,id);while(p1!=NULL)宿舍管理系统第 24 页 共 28 页 if(strcmp(p1-id,id )=0) printf(“t 该学生住宿信息如下 :nt 姓名 :“);printf(“%s
31、n“,p1-name );printf(“t 学号 :“);printf(“%sn“,p1-id );printf(“t 班级 :“);printf(“%sn“,p1-classs );printf(“t 入住时间 :“);printf(“%d-%d-%dn“,p1-intake.year,p1-intake.month,p1-intake.day); printf(“t 床位信息 :“);printf(“%s %s %dn“,p1-bed.dorm,p1-bed.bedid,p1-bed.k );break;else p1=p1-next ;if(p1=NULL) printf(“nn 找不
32、到该学生的相应住宿信息!n“); printf(“n 按任意键返回n“);getch();system(“cls“); /*清屏*/*修改指定宿舍号及床位号的学生住宿记录*/ void modifyRec()char dorm10,bedid5;if(head=NULL) getchar();printf(“n 学生住宿信息数据库为空,不能修改,按任意键将返回:n“);getchar();system(“cls“); /*清屏*/return;p1=head;printf(“nn 请输入要修改记录的宿舍号及床位号:n“);scanf(“%s%s“,dorm,bedid);while(strcm
33、p(dorm,p1-bed.dorm )!=NULLif(strcmp(dorm,p1-bed.dorm )=NULLstrcpy(p1-bed.bedid,bedid); printf(“nn 请输入该学生的姓名 :“);scanf(“%s“,p1-name);printf(“nn 请输入该学生的学号 :“);宿舍管理系统第 25 页 共 28 页scanf(“%s“,p1-id);printf(“nn 请输入该学生的班级 :“);scanf(“%s“,p1-classs);printf(“nn 请输入该学生的入住时间 :“); scanf(“%d-%d-%d“,printf(“nn 请输入
34、该学生的床位信息 :“);scanf(“%s%s%d“,p1-bed.dorm,p1-bed.bedid,printf(“n 该项信息修改完毕,“);elseprintf(“nn 找不到相应信息 !“);getchar();printf(“按任意键将返回:n“);getchar();system(“cls“); /*清屏*/writeinfo_flag=1; /*清除保存记录标志*/return;/*删除指定宿舍号及床位号的学生住宿记录*/void deleteRec()char dorm10,bedid5;if(head=NULL) getchar();printf(“n 学生住宿信息数据库
35、为空,不能删除,按任意键将返回:n“);getchar();system(“cls“); /*清屏*/return;p1=head;printf(“nn 请输入要删除记录的宿舍号及床位号:n“);scanf(“%s%s“,dorm,bedid);while(strcmp(dorm,p1-bed.dorm )!=NULLp1=p1-next ;if(strcmp(dorm,p1-bed.dorm )=NULLhead=NULL;宿舍管理系统第 26 页 共 28 页else if(head=p1) head=p1-next;free(p1);else p2-next=p1-next;free(p
36、1);printf(“n 删除完毕;“);elseprintf(“nn 找不到相应信息 !“);getchar();printf(“按任意键返回:n“);getchar();system(“cls“); /*清屏*/writeinfo_flag=1; /*清除保存记录标志*/return;/*显示指定宿舍号学生住宿信息*/void listRec() char dorm10;if(head=NULL) printf(“n 数据库中没有该宿舍信息,按任意键返回。n“);getch(); system(“cls“); return;printf(“nn 请输入要显示的宿舍号以便查证 :n“);sc
37、anf(“%s“,dorm);p1=head;printf(“n 该宿舍住宿信息如下:n“);printf(“n 姓名 t 学号t 班级t 入住时间 t 宿舍号t 床位号t 入住情况(0/1)n“);while(p1!=NULL) if(strcmp(p1-bed.dorm,dorm)=0) printf(“ %s t%st%st%d-%d-%dt%st%st%dn“,p1-name,p1-id,p1-classs,p1-intake.year,p1-intake.month,p1-intake.day,p1-bed.dorm,p1-bed.bedid,p1-bed.k);p1=p1-next
38、;elsep1=p1-next;printf(“n 按任意键返回!n“);宿舍管理系统第 27 页 共 28 页getch();system(“cls“); /*清屏*/*保存学生住宿记录*/void writeInfo() FILE *fp; /*定义文件指针 */if(head=NULL) printf(“n 数据库中没有学生住宿信息,按任意键返回。n“);getch(); system(“cls“); return;if(writeinfo_flag=0) printf(“n 数据库中学生住宿信息已保存过,按任意键返回。n“); getch(); system(“cls“); retur
39、n;if(fp=fopen(“1.txt“,“w“)=NULL) /*打开文件 */ printf(“n 数据库中学生住宿信息无法保存,按任意键返回。n“);getch();system(“cls“);return;p1=head;while(p1!=NULL)fprintf(fp,“%s %s %s %d-%d-%d %s %s %d“, p1-name,p1-id,p1-classs,p1-intake.year,p1-intake.month,p1-intake.day,p1-bed.dorm,p1-bed.bedid,p1-bed.k); p1=p1-next;fclose(fp);p
40、rintf(“n 数据库中学生住宿信息保存完毕,按任意键返回。n“);getch();system(“cls“);writeinfo_flag=0; /*设置保存记录标志*/return;/*统计空床位数*/void countRec()int i=0;if(head=NULL) printf(“n 数据库中没有学生住宿信息,按任意键返回。n“);getch(); system(“cls“); return;p1=head;while(p1!=NULL)if(p1-bed.k=0)宿舍管理系统第 28 页 共 28 页i+;p1=p1-next;printf(“nnt 空床位数为 :%dn“,
41、i);printf(“n 按任意键返回!n“);getch();system(“cls“);/*退出*/void exit0() if(writeinfo_flag=1) /*修改过记录时,先保存,再退出 */writeInfo();p1=head;while( p1!=NULL) p2=p1-next;free(p1);p1=p2;system(“cls“);printf(“nnntt * 再见!*n“);printf(“ntt * 欢迎再次使用!*n“);printf(“ntt *n“);getch(); 9.参考文献1 廖湖声C 程序设计案例教程人民邮电出版社,2010.92 何钦铭C 语言程序设计高等教育出版社,2009.5 3 谭浩强C 程序设计(第 2、3 、4 版)清华大学出版社,2000.1.4 C 语言程序设计教程 ,杨路明著,北京邮电大学出版社.