青岛农业大学理学与信息科学学院高级语言课程设计报告设计题目宿舍管理系统学生专业班级班学生姓名(学号)设计小组其他同学姓名(学号)指导教师完成时间设计地点2016年 12 月 06 日一、课程设计目的和任务《高级语言程序设计》课程设计是计算机相关专业的主要实践性教学环节。
其目的在于加深对高级语言程序设计理论和基本知识的理解,掌握使用C语言进行面向过程设计的基本方法,提高运用面向过程知识解决实际问题的能力。
为毕业设计和以后的工程实践打下良好的基础。
宿舍管理系统:用C语言为学生宿舍管理人员编写一个宿舍管理软件。
设某宿舍有:101,102,201,202四个房间,每个房间可住学生<=4人,存储结构:学号、姓名、房间号,按房间号有序,实现学生的入住、退房和查询,按给定学号、姓名、房号查询。
二、分析与设计1.程序的基本功能:(1).实现新生入住登记(2).修改入住学生信息(3)实现退房(4)实现以姓名查询学生信息(5)实现以学号查询学生信息(6)实现以寝室号查询学生信息(7)实现按照寝室号从小到大排序(8)实现按学号从小到大排序(9)实现显示所有学生信息(10)实现退出程序并保存数据2.定义的函数及说明:此程序由11个函数构成。
Add ----------添加学生信息函数(姓名、学号、宿舍号、班级)Alter----------修改学生信息函数Delete--------删除学生信息函数Display_All--------显示所有学生信息函数Query_S_name ---------查询函数以姓名为关键字进行查询Query_S_number -------查询函数以学号为关键字进行查询Query_D_number ------查询函数以寝室号为关键字进行查询Save -----存储函数Judge_Save ----退出程序时判断是否保存函数Menu --菜单Main---主函数3.系统总框图:三、系统实施1.源程序代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<ctype.h>int dirty=0; //用来判断是否已保存操作//定义一个存储学生相关信息的结构体typedef struct{char S_name[10]; //学生姓名char S_number[10]; //学生学号int D_number; //学生所在寝室的宿舍号char S_class1[10]; //班级int Total; //学生总数}Student[16];int sushehao[4]={101,102,201,202};int count[4]={0};//判断学号是否与表中所存学号重复void S_number_Judge(Student S,int t){int i;for(i=1;i<=(S->Total)-1;i++)while(strcmp(S[i].S_number,S[t].S_number)==0)//strcmp字符串比较函数,两个字符逐个比较,相等返回值为{printf("学号输入失败,该学号已存在,请重新输入学号!\n");printf("请输入学生的学号(10个字符以内):");scanf("%s",S[t].S_number);getchar();i=1;}}//添加学生信息函数void Add(Student S){int j;int flag=1;printf("请输入学生姓名(10个字符以内):");scanf("%s",S[++(S->Total)].S_name);getchar();//获取换行符printf("请输入学生的学号(10个字符以内):");scanf("%s",S[S->Total].S_number);getchar();S_number_Judge(S,S->Total);//判断输入的学号是否与表中所存在的学号重复while(flag){printf("请输入宿舍号码:");scanf("%d",&S[S->Total].D_number);for (j=0;j<4;j++){if (S[S->Total].D_number==sushehao[j] && count[j]<4){count[j]++;flag=0;break;}if(S[S->Total].D_number==sushehao[j]&&count[j]==4){printf("该宿舍已满,请重新输入\n");break;}}}getchar();printf("请输入所在班级:");scanf("%s",S[S->Total].S_class1);getchar();printf("添加成功!\n\n");}//修改学生信息函数void Alter(Student S){int i;int flag=0; //用来判断表中是否存在所要修改的学生的信息char number[10];printf("请输入你要修改学生的学号:");scanf("%s",number);getchar();for(i=1;i<=S->Total;i++)if(strcmp(S[i].S_number,number)==0)flag=i;if(!flag)printf("你所要修改的学生信息在表中不存在!\n");else{printf("新信息如下:\n");printf("请输入学生姓名(10个字符以内):");scanf("%s",S[flag].S_name);getchar();printf("请输入学生的学号(10个字符以内):");scanf("%s",S[flag].S_number);getchar();S_number_Judge(S,flag);printf("请输入宿舍号:");scanf("%d",&S[flag].D_number);getchar();printf("请输入床铺号码:");scanf("%s",&S[S->Total].S_bednum);getchar();printf("请输入所在班级:");scanf("%s",&S[S->Total].S_class1);getchar();dirty=1;printf("修改成功!\n");}putchar('\n');}//删除学生信息void Delete(Student S){int i,j;int flag=0; //用来判断表中是否存在所要删除的学生的信息char number[10];printf("请输入你要删除学生的学号:");scanf("%s",number);getchar();for(i=1;i<=S->Total;i++)if(strcmp(S[i].S_number,number)==0)flag=i;if(!flag)printf("你所要删除的学生在表中不存在!");else{for(i=flag;i<S->Total;i++){j=i+1;strcpy(S[i].S_name,S[j].S_name);//字符串拷贝函数,格式: strcpy (字符数组名,字符数组名),赋值给strcpy(S[i].S_number,S[j].S_number);S[i].D_number=S[j].D_number;strcpy(S[i].S_bednum,S[j].S_bednum);strcpy(S[i].S_class1,S[j].S_class1);}(S->Total)--;dirty=1;printf("删除成功!");}printf("\n\n");}//显示所有学生信息函数void Display_All(Student S){int i;printf("全体学生信息如下:\n");printf("---------------------------------------------------\n"); /*格式头*/printf(" 房间号床位号学号姓名班级 \n");printf("---------------------------------------------------\n");for(i=1;i<=S->Total;i++)printf(" %-10d%-10s%-10s%-10s%-10s\n",S[i].D_number,S[i].S_bednum,S[i].S_ number,S[i].S_name,S[i].S_class1);putchar('\n');}//查询函数以姓名为关键字进行查询(顺序查找)void Query_S_name(Student S){int i,j=0;char name[10];printf("请输入你要查找的学生的姓名(10个字符以内):");scanf("%s",name);getchar();printf("所查找学生信息如下:\n");printf("\t\t------------------------------------------------\n"); /*格式头*/printf("\t\t房间号床位号学号姓名班级 \n");printf("\t\t------------------------------------------------\n");for(i=1;i<=S->Total;i++)if(strcmp(name,S[i].S_name)==0){printf("\t\t%-10d%-10s%-10s%-10s%-10s\n",S[i].D_number,S[i].S_bednum,S[i].S _number,S[i].S_name,S[i].S_class1);j=1;}if(!j)printf("\n查找失败,表中不存在该学生的信息!\n\n");}//查询函数以学号为关键字进行查询(折半查找)void Query_S_number(Student S){int i,j=0;char number[10];printf("请输入你要查找的学生的学号(10个字符以内):");scanf("%s",number);getchar();printf("所查找学生信息如下:\n");printf("\t\t------------------------------------------------\n"); /*格式头*/printf("\t\t房间号床位号学号姓名班级 \n");printf("\t\t------------------------------------------------\n");for(i=1;i<=S->Total;i++)if(strcmp(number,S[i].S_number)==0){printf("\t\t%-10d%-10s%-10s%-10s%-10s\n",S[i].D_number,S[i].S_bednum,S[i].S _number,S[i].S_name,S[i].S_class1);j=1;}if(!j)printf("\n查找失败,表中不存在该学生的信息!\n\n");}//查询函数以寝室号为关键字进行查询(折半查找)void Query_D_number(Student S){int i,j,m,n,base,top,mid;j=0;base=1;top=S->Total;printf("请输入你要查询的寝室号:");scanf("%d",&i);getchar();Sort_D_number(S);//将表中原数据按照寝室号从小到大排序printf("所查找寝室信息如下:\n");printf("\t\t------------------------------------------------\n"); /*格式头*/printf("\t\t房间号床位号学号姓名班级 \n");printf("\t\t------------------------------------------------\n");if(i>=S[1].D_number&&i<=S[S->Total].D_number){while(base<=top){mid=(base+top)/2;if(i==S[mid].D_number){m=mid;n=mid-1;while(S[m].D_number==i){printf("\t\t%-10d%-10s%-10s%-10s%-10s\n",S[m].D_number,S[m].S_bednum,S[m]. S_number,S[m].S_name,S[m].S_class1);m++;if(m>S->Total)break;}if(n>0){while(S[n].D_number==i){printf("\t\t%-10d%-10s%-10s%-10s%-10s\n",S[n].D_number,S[n].S_bednum,S[n]. S_number,S[n].S_name,S[n].S_class1);n--;if(n<1)break;}}j=1;putchar('\n');break;}else if(i>S[mid].D_number)base=mid+1;elsetop=mid-1;}}if(!j)printf("\n查找失败,表中不存在该寝室的信息!\n\n");}//存储函数void Save(Student S){int i=0;FILE *fp; /*定义文件指针*/char filename[100]; /*定义文件名*/printf("\t\t输入文件名:"); /*输入文件名*/scanf("\t\t%s",&filename);if((fp=fopen(filename,"w"))==NULL) /*打开文件*/{printf("\t\t无法打开该文件\n");system("pause");return;}fprintf(fp,"%d\n",S->Total); /*循环写入数据*/while(i<(S->Total)){fprintf(fp,"%-10d%-10s%-10s%-10s%-10s\n",S[i].D_number,S[i].S_bednum,S[i].S_nu mber,S[i].S_name,S[i].S_class1);i++;}fclose(fp); /*关闭文件*/printf("写入成功!\n"); /*返回成功信息*/}//退出程序时判断是否保存函数void Judge_Save(int i,Student S){char ch;if(i){printf("表中数据已改变,是否保存后再退出(Y/N)?:");ch=getchar();getchar();while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y'){printf("请输入N(n)或者Y(y):");ch=getchar();getchar();}if(ch=='y'||ch=='Y')Save(S);}}//菜单void Menu(){system("cls"); /*运行前清屏*/printf("\n");printf(" 青岛农业大学学生宿舍管理系统\n\n");printf(" \n"); printf(" 作者:明伟、李善虎、胡蒙亨\n");printf("\n");printf("\t\t=============学生宿舍管理系统===========\n"); /*菜单选择*/printf("\t\t \n");printf("\t\t 1.新生入住 \n");printf("\t\t 2.修改入住学生信息 \n");printf("\t\t 3.退房服务 \n");printf("\t\t 4.以姓名查询学生信息 \n");printf("\t\t 5.以学号查询学生信息 \n");printf("\t\t 6.以寝室号查询学生信息 \n");printf("\t\t 7.查询全部学生信息 \n");printf("\t\t 0.退出程序 \n"); printf("\t\t=========================================\n");} int main(){int i;Student S;S->Total=0;do{Menu();printf("请选择您要运行的选项按(0-9):");scanf("%d",&i);getchar(); //获取换行符putchar('\n');switch(i){case 1:Add(S);system("pause");break;case 2:Alter(S);system("pause");break;case 3:Delete(S);system("pause");break;case 4:Query_S_name(S);system("pause");break;case 5:Query_S_number(S);system("pause");break;case 6:Query_D_number(S);system("pause");break;case 7:Display_All(S);system("pause");break;case 0:Judge_Save(dirty,S);exit(0);break;default:printf("选择错误:请在选项到之间选择!\n\n");break;}}while(i!=10);}(注:黑体部分为我负责的部分)2.程序运行说明(包括结果说明)程序运行说明运行程序后,出现主菜单界面,按照主菜单上的编号进行操作即可,每输入一个编号后按回车即进入该子程序,然后按照提示输入或查询信息。