1、序号: 2012~2013年春季学期 学术与工程实践(计算机) 课设报告 课设题目: 大学生公寓系统 指导老师: 何丽 班级计12-班 学号 12101020129 姓名 依力夏提江·艾买尔 总成绩: 评语: 指导教师签字: 日期: 目录 学术与工程实践(计算机) 1 课设报告 1 1 课题主要内容介绍 1 大学生公寓管理系统 1 2 系统设计与实现 3 2.1 系统设计 3 2.1.1 设计原则与设计思路 3 2.1.2 功能设计 3 2.1.3 数据结构设计 5 2.2 系统实现 7 2.2.1 学生数据录入功能
2、8 2.2.2 住宿安排功能 17 2.2.3 退宿管理功能 20 2.2.4 宿舍调配功能 25 2.2.3 学生退学功能 28 2.2.6 全部信息输出功能 31 2.2.4 查询统计功能 38 2.2.8 密码修改功能 44 3 系统测试和结果分析 47 3.1 宿舍人数检测功能 47 4 课题收获与总结 48 4.1 理论知识应用体会 48 4.2 课题应用软件环境的体会 48 4.3 其它体会 48 5 参考文献 49 1 课题主要内容介绍 大学生公寓管理系统 一、实训目的 通过本实训,学生应具有创建一个命令行模式的大学生公寓管
3、理系统。 1、掌握结构体类型数据的定义方法和引用方法。 2、掌握有关C语言程序设计的文件打开,关闭,输入,输出以及定位。 3、培养C语言程序编程规范。 二、实训内容及要求 一.1.1.1.1 1. 项目需求 通过此系统可以实现如下功能: 1) 学生、宿舍、宿舍卫生等数据信息的录入 2) 住宿安排 3) 退宿管理 4) 宿舍调配 5) 学生退学 6) 全部信息输出 7) 查询统计 8) 修改密码 9) 退出系统 注:大学生公寓管理系统系统作为一个用来进宿舍管理的应用软件,在对其进行需求分析的过程中,需要充分考虑系统的可用性和有效性,联系实际应用,从而得到合理的软件
4、 一.1.1.1.2 2. 设计要求 1)画出功能模块图。 2)整个程序中不能只有main函数,必须按照功能模块图进行功能函数编写。功能函数不能少于10个。 3)学生基本信息、宿舍基本信息、住宿登记信息、卫生信息必须以结构体形式储存。 4)学生基本信息、宿舍基本信息、住宿登记信息、卫生信息必须存储在各自文件中。对文件进行操作,实现增加、删除、修改、查询等操作。 一.1.1.1.3 3. 开发环境 操作系统: Windows 2000/XP 开发语言: C语言 2 系统设计与实现 2.1 系统设计 2.1.1 设计原则与设计思路 设计原则: 根据大学生公寓安排的实
5、际情况,做出可行,可用的实用程序。 设计思路: 大学生公寓的安排包括各类数据的录入和分类保存,按性别学号来住进有空余床位的宿舍。系统用密码登入其中有密码修改功能。还有住宿安排后的调宿舍和退宿舍,这是涉及到信息的查找很修改。学生退学后信息的删除,各类按学号,宿舍号来查找宿舍的卫生等基本情况,大致就是这些,我首先对信息分类,然后输入,存到文件中,这里要用到链表和文件。数据按情况建立各类结构体。用文件实现密码登录和修改,先输入,保存,判断数据的可行性,再然后实现修改,删除,查找,输出等各项功能。 2.1.2 功能设计 大学生公寓管理系统 学生数据录入 住宿安排 退宿管理
6、 宿舍调配 学生退学 全部信息输出 查询统计 密码修改 退出 系统 根据项目需求,该程序至少要有9个功能,即如下结构所示。系统功能结构图如下所示: 下面是对程序功能设计的介绍。 一.1.1.1.4 1、数据信息的录入 (1)学生信息的录入:学号不允许重复。 录入信息保存在student.dat文件中。 (2)宿舍基本信息的录入:录入信息保存在room.dat文件中。 (3)卫生情况的录入:录入信息保存在score.dat文件中。 一.1.1.1.5 2、住宿安排 根据输入的学号、宿舍号、
7、入住日期等信息,将住宿情况登记在文件lodging.dat中,同时修改宿舍信息“room.dat”文件中的剩余床位数。注意:(1)在安排宿舍时候,男生、女生的区别。(2)当某宿舍的剩余床位数为0时,给出“人员已满,不可安排”的提示。 一.1.1.1.6 3、退宿管理 根据输入的学生姓名或者宿舍号,首先检索出该学生的当前住宿信息。办理退宿手续,退还住宿押金。 其中,高间住宿押金为1000元,标准间押金为500元。将备注信息修改为“已退宿”,注意同时修改room.dat文件中的剩余床位数。 一.1.1.1.7 4、宿舍调配 宿舍调配包括修改、删除、查询、退出等功能。在进行宿舍调配操作前必
8、须输入正确的用户密码才能进行操作。修改操作指将某个学生从一个宿舍调配到另外一个宿舍,不满足调配条件时(如另外一个宿舍已满),给出信息提示。 一.1.1.1.8 5、 学生退学 当在student.dat中删除一个学生信息时,自动地在lodging.dat中删除此人的住宿信息。 一.1.1.1.9 6、输出全部信息 输出全部的学生基本信息、宿舍基本信息、住宿安排信息。 一.1.1.1.10 7、查询统计功能(不局限于以下3种查询) (1)宿舍基本信息查询 输入宿舍号或宿舍级别(可选择),查出该宿舍或该级别宿舍的基本信息并显示输出。 (2)卫生情况查询及统计 输入某宿舍号,查询该
9、宿舍的卫生成绩。 输入某检查时间,查询改天的所有宿舍的卫生情况,并统计出90分以上的宿舍个数。 (3)住宿情况查询: u 输入一个宿舍号时,查询出此宿舍的基本信息以及当前的入住信息。将信息以列表形式显示。显示内容包括:宿舍号、宿舍类型、学生姓名、入住日期、 u 输入一个学生的姓名,查询出此学生的基本信息及住宿安排信息。将信息以列表形式显示。 u 输入一个学生的姓名,查询出该学生所住宿舍的卫生情况。将信息以列表形式显示。 一.1.1.1.11 8、修改密码 可以修改用户密码。 一.1.1.1.12 9、退出系统 2.1.3 数据结构设计 数据结构设计如下所示: ty
10、pedef struct Student //学生基本信息 { char num[10]; //学号 char name[10]; //姓名 char sex[10]; //性别 char home[20]; //籍贯 char brithday[20]; //出生日期 char nation[10]; //民族 char tel[20]; //联系电话 char college[20]; //学院 char team[10]; struct Student *next; }stu; stu *head,*end; typedef struct Room //宿
11、舍基本信息 { char num[20]; //公寓号 char room[20]; //宿舍编号 int bed; //床位总数 int sbed; //剩余床位数 char rlevel[10]; //宿舍级别 char remark[50]; //备注 struct Room *next; }ro; ro *head2,*end2; typedef struct Lodging //住宿信息 { char num[20]; //学号 char roomname[20]; //宿舍名称 char datecheck[20]; //入住日期 char
12、money[20]; //住宿押金 高间1000,标准间500 char remark[50]; //备注 struct Lodging *next; }lo; lo *head3,*end3; typedef struct Score //宿舍卫生成绩信息 { char num[20]; //宿舍号 char score[20]; //卫生成绩 ,以百分制给出 char dateexam[20]; //检查时间 char remark[50]; //备注 struct Score *next; }sc; sc *head4,*end4; 学生基本信
13、息文件:student.dat 宿舍基本信息文件:room.dat 宿舍等级信息文件:lodging.dat 宿舍卫生信息文件:score.dat 2.2 系统实现 2.2.1 学生数据录入功能 1. 学生信息录入流程图 N 错误 开始 结束 输出提示信息 输入录入信息 选返回 数字、日期、 重复性检查 提示错误 信息写入文件 Y 正确 2. 功能描述 输入学生信息,公寓信息,宿舍卫生信息然后保存到文件 3. 通过提示信息使用者将信息录入到系统中,录入后系统对数字信息和日期信息进行合法性检测,然后对编号进
14、行重复性检测,若无问题则将文件写入文件中,若有问题则提示使用者重新输入,最后选返回,回到主界面, 4. 源代码 void xueshengshuju() { char b; void xuesheng(); void sushe(); void weisheng(); do { printf("--------------------------------------------------------------------------------\n"); printf("\n (1)学生信息的录入\n\n"); printf(" (2)公寓基本信息的录入\n\
15、n"); printf(" (3)卫生情况的录入\n\n"); printf(" (4)返回\n\n"); printf("--------------------------------------------------------------------------------\n"); printf("请选择要进行的操作:"); fflush(stdin); b=getchar(); switch(b) { case'1': xuesheng();break; case'2': sushe();break; case'3': weisheng()
16、break; case'4': goto top00; default: printf("输入错误请重新输入!"); } }while(1); top00: ; } /*学生基本信息录入*/ void xuesheng() { stu *pb; FILE *fp; char ch; if((fp=fopen("student.dat","ab"))==NULL) /*追加模式打开*/ { printf("打开文件student.dat出错!\n"); return; } do { pb=(stu *)malloc
17、sizeof(stu)); if(!pb) { printf("内存分配失败!\n"); getchar(); exit(1); } printf("\n请输入学生基本信息:\n"); printf("学号:"); fflush(stdin); gets(pb->num); printf("姓名:"); gets(pb->name); printf("性别:"); gets(pb->sex); printf("籍贯:"); gets(pb->home); printf("生日:");
18、 gets(pb->brithday); printf("民族:"); gets(pb->nation); printf("联系电话:"); gets(pb->tel); printf("学院:"); gets(pb->college); printf("班级:"); gets(pb->team); printf("------------\n"); pb->next=NULL; /* 把新记录插入链表中 */ if(head==NULL) { head=pb; end=pb; } else { end
19、>next=pb; end=pb; } fwrite(pb,sizeof(stu),1,fp); /* 把新记录插入文件中 */ printf("\n继续输入下一个学生的信息(y/n)?"); ch=getchar(); fflush(stdin); } while(ch=='y' || ch=='Y'); fclose(fp); } /*宿舍基本信息录入*/ void sushe() { ro *pb; FILE *fp; char ch; int i=0; int t=0; if((fp=fopen("ro
20、om.dat","ab"))==NULL) /*追加模式打开*/ { printf("打开文件room.dat出错!\n"); return; } do { pb=(ro *)malloc(sizeof(ro)); if(!pb) { printf("内存分配失败!\n"); getchar(); exit(1); } printf("\n请输入公寓基本信息:\n"); printf("公寓号:"); fflush(stdin); gets(pb->num); printf("宿舍编号:");
21、 gets(pb->room); printf("床位总数:"); scanf("%d",&pb->bed); printf("剩余床位数:"); scanf("%d",&pb->sbed); printf("宿舍级别:"); fflush(stdin); gets(pb->rlevel); printf("备注:"); gets(pb->remark); printf("------------\n"); pb->next=NULL; /* 把新记录插入链表中 */ if(head2==NULL) { head
22、2=pb; end2=pb; } else { end2->next=pb; end2=pb; } fwrite(pb,sizeof(ro),1,fp); /* 把新记录插入文件中 */ printf("\n继续输入下一个宿舍的信息(y/n)?"); ch=getchar(); fflush(stdin); } while(ch=='y' || ch=='Y'); fclose(fp); } /*宿舍卫生情况录入*/ void weisheng() { sc *pb; FILE *fp; char ch;
23、 if((fp=fopen("score.dat","ab"))==NULL) /*追加模式打开*/ { printf("打开文件score.dat出错!\n"); return; } do { pb=(sc *)malloc(sizeof(sc)); if(!pb) { printf("内存分配失败!\n"); getchar(); exit(1); } printf("\n请输入宿舍号:"); fflush(stdin); gets(pb->num); printf("宿舍卫生成绩:");
24、 gets(pb->score); printf("检查时间:"); gets(pb->dateexam); printf("备注:"); gets(pb->remark); printf("------------\n"); pb->next=NULL; /* 把新记录插入链表中 */ if(head4==NULL) { head4=pb; end4=pb; } else { end4->next=pb; end4=pb; } fwrite(pb,sizeof(sc),1,fp); /* 把新记录插入文件中
25、/ printf("\n继续输入下一个宿舍的信息(y/n)?"); ch=getchar(); fflush(stdin); } while(ch=='y' || ch=='Y'); fclose(fp); } 5. 界面实现 录入界面: 继续录入提示提示: 返回主界面: 6. 使用说明 这模块包括学生基本信息,公寓信息,宿舍卫生信息,三累数据的录入与保存,然后按选项返回主界面。 7. 技术难点 因为在主界面夏的子界面而且包括选项所以,循环返回主界面是有点不好解决,而且这里调用的函数有几类容易弄混淆所以要注意调用。 2.2.
26、2 住宿安排功能 开始 1. 流程图 输出提示信息 输入住宿登记信息 保存到文件文件中 输出提示信息 是否继续输入 结束 2. 功能: 输入宿舍等级信息然后保存到文件中 3. 描述: 先按提示输入然后再按提示选择是否继续输入 4. 源代码 *住宿情况录入*/ void zhusuanpai() { lo *pb; char ch; int b=1; int i=0; FILE *fp; if((fp=fopen("lodging.dat","ab"))==NULL) /*追加模式打开*/
27、 { printf("打开文件lodging.dat出错!\n"); return; } do { pb=(lo *)malloc(sizeof(lo)); if(!pb) { printf("内存分配失败!\n"); getchar(); exit(1); } printf("\n请输入学生宿舍信息\n"); printf("学号:"); fflush(stdin); gets(pb->num); printf("宿舍名称:"); gets(pb->roomname); pri
28、ntf("入住日期:"); fflush(stdin); gets(pb->datecheck); printf("住宿押金:"); gets(pb->money); printf("备注:"); gets(pb->remark); pb->next=NULL; /* 把新记录插入链表中 */ if(head3==NULL) { head3=pb; end3=pb; } else { end3->next=pb; end3=pb; } fwrite(pb,sizeof(lo),1,fp); /* 把新记录插入文件中
29、/ printf("\n继续输入下一个学生的信息(y/n)?"); ch=getchar(); fflush(stdin); } while(ch=='y' || ch=='Y'); fclose(fp); } 5. 界面实现 6. 使用说明 按提示操作即可。 7. 技术难点 按住宿押金分高间与普通间 2.2.3 退宿管理功能 1. 流程图 开始 按提示输入需要退宿的学生号 输出该生住宿信息 确认是否退宿 修改原先信息 结束 2. 功能描述 按学号查找住宿信息然后输出信息,按提示操作,确认是否退宿管,
30、修改原先住宿信息 3. 源代码 /*退宿管理*/ void tuisuguanli() { char num[10]; lo *pa; void xiugai1(); int flag=0; int i; pa=head3; printf("请输入要退宿的学生学号:"); gets(num); fflush(stdin); while(pa) { if(strcmp(num,pa->num)==0) { flag=1; printf("%s\n",H); printf("该生住宿信息为:\n");
31、printf("学生学号:%s\n",pa->num); printf("宿舍名称:%s\n",pa->roomname); printf("入住时间:%s\n",pa->datecheck); printf("押金:%s\n",pa->money); printf("备注:%s\n",pa->remark); printf("是否确定退宿:1:是;2:否;请选择!:"); scanf("%d",&i); if(i==1) { xiugai1(); fflush(stdin); printf("修改结束
32、"); goto loop123; } else goto loop123; } pa=pa->next; } if (flag==0) { fflush(stdin); printf("\n在链表中未找到学号为 %s 的学生的信息!\n",num); fflush(stdin); } loop123: ; } /*修改学生信息*/ void xiugai1() { lo *emp1; char num[20]; //学号 char roomname[20]; //宿舍名称 char datechec
33、k[20]; //入住日期 char money[20]; //住宿押金 高间1000,标准间500 char remark[50]; //备注 void shanchu1(char* num); void savedata1(); int check3(); int flag=0; flag=check3(); printf("\n输入要修改的学生学号: "); fflush(stdin); gets(num); printf("\n输入要修改的宿舍名称: "); gets(roomname); printf("\n输入要修改的入住日期
34、 "); gets(datecheck); printf("\n输入要修改的住宿押金: "); gets(money); printf("\n输入要修改的备注: "); gets(remark); emp1=head3; while(emp1) { if(strcmp(num,emp1->num)==0) { flag=1; strcpy(emp1->num,num); strcpy(emp1->roomname,roomname); strcpy(emp1->datecheck,datecheck); strcpy
35、emp1->money,money); strcpy(emp1->remark,remark); } emp1=emp1->next; } if (flag==0) printf("\n在链表中未找到 学号为%s 的学生住宿信息!\n",num); else savedata1(); /* 把修改后的信息保存到文件中 */ } 4. 界面实现 5. 使用说明 按提示操作即可 6. 技术难点 这里面要用到连续几个函数的调用,首先找到学生信息,再修改,再保存 所以极易出错需要谨慎。 2.2.4 宿舍调配功能 1.流程图 2.功能描述
36、 宿舍调配中包括原来宿舍信息的修改,删除,查询,增加等功能 3.源代码 /*宿舍调配*/ void sushetiaopei() { void zengjia(); char ch,name[10]; int check(); void xiugai1(); void shanchu(char *name); void chaxun(char *name); void readdata(void); void readdata2(void); void readdata3(void); void readdata4(void
37、); void search(char *name); void student_shuju(); void tuichu(); int flag=0; do { printf("--------------------------------------------------------------------------------\n"); printf(" (1)修改\n"); printf(" (2)删除\n"); printf(" (3)查询\n"); printf(" (4)增加\n"); printf(" (5
38、)返回\n"); printf("--------------------------------------------------------------------------------\n"); printf("请选择要进行的操作:"); fflush(stdin); ch=getchar(); switch(ch) { case'1': flag=check3(); if(flag==0) printf("无数据记录\n"); else xiugai1(); break; case'2': flag
39、check(); if (flag==0) printf("无数据记录\n"); else { printf("\n请输入需要删除的学生姓名:"); fflush(stdin); gets(name); shanchu(name); } break; case'3': flag=check(); if (flag==0) printf("无数据记录\n"); else { printf("\n请输入查找姓名:");
40、fflush(stdin); gets(name); chaxun(name); } break; case'4': { zengjia(); break; } case'5': goto top01; break; default: printf("\n输入选项有误,请重新输入"); } }while(1); top01: ; } 4.界面实现 5.使用说明 按提示操作即可 6.技术难点 宿舍调配用了switch选择语句,跟主界面类此。而且调用了很多子函数 2.2.3 学生退学功能
41、 1. 流程图 2. 功能描述 与学退宿不同的是学生退学找出学生信息后需要删除该学生的所有信息并退还押金。 3. 源代码 void xueshengtuixue()// { char num[10]; int flag=0; int i; void shanchu1(char *num); lo *pa; pa=head3; flag=check3(); if (flag==0) printf("无数据记录\n"); else { printf("\n请输入需要退学的学生学号!\n");
42、 fflush(stdin); gets(num); printf("该学生住宿信息为:"); while(pa) { if(strcmp(num,pa->num)==0) { flag=1; printf("%s\n",H); printf("学生学号:%s\n",pa->num); printf("宿舍名称:%s\n",pa->roomname); printf("入住时间:%s\n",pa->datecheck); printf("押金:%s\n",pa->money);
43、 printf("备注:%s\n",pa->remark); printf("是否要退学!\n"); printf("是:1;否:0;请选择:"); scanf("%d",&i); fflush(stdin); if(i==1) { shanchu1(num); printf("退学成功!住宿信息已删除。\n"); goto loop111; } else goto loop111;
44、 } pa=pa->next; } if (flag==0) fflush(stdin); printf("\n在链表中未找到学号为 %s 的学生的住宿信息!\n",num); fflush(stdin); } loop111: ; } 4. 界面实现 查找退宿学生: 确认删除该学生信息: 5. 使用说明 按提示操作即可 6. 技术难点 技术与学生退宿相似只多了个删除功能。删除信息以后还要保存到文件中 删除的时候用strcmp找到要删除的节点以后再删除该链表节点。 2.2.6 全部
45、信息输出功能 1.流程图 2.功能描述 全部信息输出功能中包括学生信息输出,公寓信息输出,卫生信息输出,登记信息输出等几个功能。 7. 源代码 void quanbuxinxi()// { void chu1(); void chu2(); void chu3(); void chu4(); char ch; int flag=0; do { printf("--------------------------------------------------------------------------------\n");
46、 printf(" (1)输出学生全部信息\n"); printf(" (2)输出宿舍全部信息\n"); printf(" (3)输出宿舍卫生全部信息\n"); printf(" (4)输出宿舍登记全部信息\n"); printf(" (5)返回\n"); printf("--------------------------------------------------------------------------------\n"); printf("请选择要进行的操作:"); fflush(stdin); ch=getchar(
47、); fflush(stdin); switch(ch) { case'1': chu1(); break; case'2': chu2(); break; case'3': chu3(); break; case'4': chu4(); break; case'5': goto top010; break; } }while(1); top010: fflush(stdin); ; } void chu1(
48、) { stu *pa; int flag=0; pa=head; flag=check(); if(flag==0) printf("无数据记录!\n"); else while(pa) { printf("%s\n",H); printf("姓名:%s\n",pa->name); printf("学号:%s\n",pa->num); printf("性别:%s\n",pa->sex); printf("生日:%s\n",pa->brithday); printf(
49、"民族:%s\n",pa->nation); printf("联系电话:%s\n",pa->tel); printf("学院:%s\n",pa->college); printf("班级:%s\n",pa->team); pa=pa->next; } } void chu2() { ro *pa1; pa1=head2; int flag=0; flag=check1(); if(flag==0) printf("无数据记录!\n"); else while(pa1) {
50、printf("%s\n",H); printf("公寓号:%s\n",pa1->num); printf("宿舍编号:%s\n",pa1->room); printf("床位总数:%d\n",pa1->bed); printf("剩余床位数:%d\n",pa1->sbed); printf("宿舍级别:%s\n",pa1->rlevel); printf("备注:%s\n",pa1->remark); pa1=pa1->next; } } void chu3() { sc *pa3; pa3=head4; int fl






