学生宿舍管理软件C语言源代码(完整版)

上传人:xt****7 文档编号:118285947 上传时间:2022-07-11 格式:DOC 页数:21 大小:206.50KB
返回 下载 相关 举报
学生宿舍管理软件C语言源代码(完整版)_第1页
第1页 / 共21页
学生宿舍管理软件C语言源代码(完整版)_第2页
第2页 / 共21页
学生宿舍管理软件C语言源代码(完整版)_第3页
第3页 / 共21页
点击查看更多>>
资源描述
一、需求分析该程序是由C语言编写的一个宿舍管理查询软件,其主要功能是实现对学生信息的增加、删除、修改、查询、排序、存储、加载。其中查询可以分别以姓名、学号、寝室号为关键字查询学生信息。排序可以分别以学号和寝室号为关键字进行从小到大的排序。输入的形式:根据用户所选择的功能,然后再依据程序相应的提示进行输入: 选择功能1(添加学生信息):按照从先到后的顺序输入学生姓名(30个字符以内),学生学号(15个字符以内),宿舍号码(整数,范围在032767)。 选择功能2(修改学生信息):按照从先到后的顺序输入要修改的学生姓名(30个字符以内),修改后学生的姓名(30个字符以内),修改后学生的学号(15个字符以内),修改后学生的宿舍号(整数,范围在032767)。 选择功能3(删除学生信息):输入要删除的学生姓名(30个字符以内)。 选择功能4(以姓名查询学生信息):输入要查找的学生的姓名(30个字符以内)。 选择功能5(以学号查询学生信息):输入要查找的学生的学号(15个字符以内)。 选择功能6(以寝室号查询学生信息):输入寝室号(整数,范围在032767)。 输出的形式:根据用户所选择的功能不同,会有不同的输出: 选择功能1(添加学生信息):根据程序的判断会输出添加成功或者添加失败。 选择功能2(修改学生信息):根据程序的判断会输出修改成功或者修改失败。 选择功能3(删除学生信息):根据程序的判断会输出删除成功或者删除失败。 选择功能4(以姓名查询学生信息):根据程序的判断,如果查找成功,则会输出相应的学生信息,反之,则会输出查找失败。 选择功能5(以学号查询学生信息):根据程序的判断,如果查找成功,则会输出相应的学生信息,反之,则会输出查找失败。 选择功能6(以寝室号查询学生信息):根据程序的判断,如果查找成功,则会输出相应的学生信息,反之,则会输出查找失败。 选择功能7,8(以寝室号和学号为关键字进行从小到大的排序):程序会输出排序成功。 选择功能9(显示所有学生的信息):程序会输出所有以存学生的信息。 选择功能10(保存操作):根据程序的判断会输出保存成功或者保存失败。 选择功能11(加载记录):根据程序的判断会输出加载记录成功或者加载记录失败。 测试数据: 对功能1(添加学生信息)的测试:向程序中添加三条记录按照先后顺序分别输入:学生姓名:张三,学生学号:20070001,宿舍号:502 学生姓名:李四,学生学号:20070003,宿舍号:502 学生姓名:王五,学生学号:20070002,宿舍号:503对功能2(修改学生信息)的测试:修改学生王五的信息按照先后顺序分别输入:学生姓名:王五,学生姓名:王五,学生学号:20070005,宿舍号:501对功能3(删除学生信息)的测试:删除学生李四的信息输入:学生姓名:李四对功能4(以姓名查询学生信息)的测试:查询学生王五的信息输入:学生姓名:王五对功能5(以学号查询学生信息)的测试:查询学号为20070001的信息输入:学生学号:20070001对功能6(以寝室号查询学生信息)的测试:查询寝室号为501的信息输入:寝室号:501对功能7(按照寝室号从小到大的排序)和功能9(显示所有学生信息)的测试:先选择功能7,然后选择功能9,观察显示出来的记录是否按照寝室号从小到大排序。对功能8(按照学号从小到大的排序)和功能9(显示所有学生信息)的测试:先选择功能8,然后选择功能9,观察显示出来的记录是否按照学号从小到大排序。对功能10(保存操作)和功能11(加载记录)的测试:先选择功能10,然后关闭程序,重新运行,此时选择功能11,然后选择功能9显示出学生信息,查看信息是否有错误。二、概要设计1.抽象数据类型:ADT Student数据对象:D=ai,bi,ci,| aichar S31,bichar A16,ci,int ,i=1,2,3,.数据关系:R=| (ai,bi,ci) D, i=1,2,3,.基本操作: S_number_Judge(Student S,int t) 初始条件:表S已存在 操作结果:判断所输入学号在表中是否已存在 Add(Student S) 初始条件:表S已存在 操作结果:向表S中插入一个记录 Alter(Student S) 初始条件:表S已存在 操作结果:修改表S中的一条记录 Delete(Student S) 初始条件:表S已存在 操作结果:删除表S中的一条记录 Display_All(Student S) 初始条件:表S已存在 操作结果:显示表中所有学生的信息 Sort_D_number(Student S) 初始条件:表S已存在 操作结果:表中记录按照寝室号从小到大排序 Sort_S_number(Student S) 初始条件:表S已存在 操作结果:表中记录按学号从小到大排序 Query_S_name(Student S) 初始条件:表S已存在 操作结果:根据所输入的学生姓名显示出该学生的信息 Query_S_number(Student S) 初始条件:表S已存在 操作结果:根据所输入的学号显示出该学生的信息 Query_D_number(Student S) 初始条件:表S已存在 操作结果:根据所输入的寝室号显示出该寝室的学生的信息 Save(Student S) 初始条件:表S已存在 操作结果:将表中数据保存的文件中去 Load(Student S) 初始条件:表S已存在 操作结果:将文件中数据加载到程序中 Judge_Save(int i,Student S) 初始条件:表S已存在 操作结果:表中数据改变后没有及时保存在退出程序时提醒用户是否保存 ADT Student2.本程序所包含的15个函数为:(1)主函数main();(2)菜单函数Menu(); (3)判断学号是否重复函数S_number_Judge(Student S,int t);(4)添加学生信息函数Add(Student S);(5)修改学生信息函数Alter(Student S);(6)删除学生信息函数Delete(Student S);(7)显示所有学生信息函数Display_All(Student S);(8)按照寝室号从小到大排序函数Sort_D_number(Student S);(9)按照学号从小到大排序函数Sort_S_number(Student S);(10)根据学生姓名查找函数Query_S_name(Student S);(11)根据学生学号查找函数Query_S_number(Student S);(12)根据寝室号查找函数Query_D_number(Student S)(13)存储函数Save(Student S);(14)加载函数Load(Student S);(15)判断在退出程序时是否保存函数Judge_Save(int i,Student S);各函数之间的调用关系如下:Sort_D_number(Student S)Display_All(Student S)Menu()Sort_S_number(Student S)Query_S_name(Student S)Save(Student S)Query_S_number(Student S)main()Load(Student S)Query_D_number(Student S)Judge_Save(int i,Student S)Delete(Student S)S_number_Judge(Student S,int t)Alter(Student S)Add(Student S)3.N-S流程图 调用Menu() 输入i值 i= =1 Y NAdd(S) Y i= =2 NAlter(S) i= =3Y NDelete(S) i= =4Y NQuery_S_name(S) i= =5Y NQuery_S_number(S)i= =6Y NQuery_D_number(S)i= =7Y NSort_D_number(S) i= =8Y NSort_S_number(S) i= =9Y NDisplay_All(S) i= =10Y NSave(S)i= =11Y NLoad(S) i= =12Y NJudge_Save(dirty,S)输出:选择错误,请在数字1-12中选择 直到i= =12三、详细设计源程序代码:#include#include#include#define M 100int dirty=0; /用来判断是否已保存操作/定义一个存储学生相关信息的结构体typedef structchar S_name31; /学生姓名 char S_class31; /学生班级 char S_number16; /学生学号int D_number; /学生所在寝室的宿舍号 char S_address500; /学生地址 int S_phone20; /学生电话号码 int Total; /学生总数StudentM,St;/判断学号是否与表中所存学号重复void S_number_Judge(Student S,int t)int i;for(i=1;iTotal)-1;i+)while(strcmp(Si.S_number,St.S_number)=0)printf(学号输入失败,该学号已存在,请重新输入学号!n);printf(请输入学生的学号(15个字符以内):); scanf(%s,St.S_number);getchar();i=1;/添加学生信息函数void Add(Student S)printf(请输入学生姓名(30个字符以内):);scanf(%s,S+(S-Total).S_name);getchar();/获取换行符 printf(“请输入学生班级(30个字符以内):”); scanf(%s,SS-Total.S_class); getchar();printf(请输入学生的学号(15个字符以内):);scanf(%s,SS-Total.S_number); getchar();S_number_Judge(S,S-Total);/判断输入的学号是否与表中所存在的学号重复printf(请输入宿舍号码:);scanf(%d,&SS-Total.D_number); getchar(); printf(请输入学生地址:); scanf(%s,SS-Total.S_address); getchar(); printf(“请输入学生电话号码:”); scanf(%s,&SS-Total. S_phone);getchar();dirty=1;printf(添加成功!nn);/修改学生信息函数void Alter(Student S)int i;int flag=0; /用来判断表中是否存在所要修改的学生的信息char name20;printf(请输入你要修改学生的姓名:); scanf(%s,name);getchar();for(i=1;iTotal;i+)if(strcmp(Si.S_name,name)=0)flag=i;if(!flag)printf(你所要修改的学生信息在表中不存在!n);elseprintf(新信息如下:n);printf(请输入学生姓名(30个字符以内):);scanf(%s,Sflag.S_name);getchar(); printf(“请输入学生班级(30个字符以内):”); scanf(%s,Sflag.S_class); getchar();printf(请输入学生的学号(15个字符以内):);scanf(%s,Sflag.S_number);getchar();S_number_Judge(S,flag);printf(请输入宿舍号:);scanf(%d,&Sflag.D_number); getchar(); printf(请输入学生地址:); scanf(%s,Sflag.S_address); getchar(); printf(“请输入学生电话号码:”); scanf(%s,&Sflag. S_phone);getchar();dirty=1;printf(修改成功!n);putchar(n);/删除学生信息void Delete(Student S)int i,j;int flag=0; /用来判断表中是否存在所要删除的学生的信息char name20;printf(请输入你要删除学生的姓名:);scanf(%s,name); getchar();for(i=1;iTotal;i+)if(strcmp(Si.S_name,name)=0)flag=i;if(!flag)printf(你所要删除的学生在表中不存在!);else for(i=flag;iTotal;i+) j=i+1; strcpy(Si.S_name,Sj.S_name); strcpy(Si.S_number,Sj.S_number); Si.D_number=Sj.D_number; (S-Total)-;dirty=1;printf(删除成功!);printf(nn);/显示所有学生信息函数void Display_All(Student S)int i;printf(全体学生信息如下:n);printf(学生姓名 学生班级 学生学号 宿舍号 学生地址 学生电话号码n);for(i=1;iTotal;i+)printf(%-20s%-20s %-15s%-5d%s-10%sn,Si.S_name,Si.S_class,Si.S_number,Si.D_number,Si.S_address,Si.S_phone);putchar(nn);/排序函数按照寝室号从小到大排序(冒泡法)void Sort_D_number(Student S)int i,j,t;char name30;char number15; char address300; char Cnumber30;for(i=1;iTotal;i+)for(j=i;jTotal;j+)if(Si.D_numberSj.D_number)strcpy(name,Si.S_name);strcpy(number,Si.S_number); strcpy(address,Si.S_address); strcpy(Cnumber,Si.S_class);t=Si.D_number;strcpy(Si.S_name,Sj.S_name);strcpy(Si.S_number,Sj.S_number); strcpy(Si.S_address,Sj.S_address); strcpy(Si.S_class,Sj.S_class);Si.D_number=Sj.D_number;strcpy(Sj.S_name,name);strcpy(Sj.S_number,number); strcpy(Sj.S_address,address); strcpy(Sj.S_class,Cnumber);Sj.D_number=t;/排序函数按照学号从小到大排序(冒泡法)void Sort_S_number(Student S)int i,j,t;char name30;char number15; char address300; char Cnumber30;for(i=1;iTotal;i+)for(j=i;jTotal;j+)if(strcmp(Si.S_number,Sj.S_number)0)strcpy(name,Si.S_name);strcpy(number,Si.S_number); strcpy(address,Si.S_address); strcpy(Cnumber,Si.S_class);t=Si.D_number;strcpy(Si.S_name,Sj.S_name);strcpy(Si.S_number,Sj.S_number); strcpy(Si.S_address,Sj.S_address); strcpy(Si.S_class,Sj.S_class);Si.D_number=Sj.D_number;strcpy(Sj.S_name,name);strcpy(Sj.S_number,number); strcpy(Sj.S_address,address); strcpy(Sj.S_class,Cnumber);Sj.D_number=t;/排序函数按照班级号从小到大排序(冒泡法)void Sort_S_class (Student S)int i,j,t;char name30;char number15; char address300; char Cnumber30;for(i=1;iTotal;i+)for(j=i;jTotal;j+)if(strcmp(Si.S_class,Sj.S_class)0)strcpy(name,Si.S_name);strcpy(number,Si.S_number); strcpy(address,Si.S_address); strcpy(Cnumber,Si.S_class);t=Si. D_number;strcpy(Si.S_name,Sj.S_name);strcpy(Si.S_number,Sj.S_number); strcpy(Si.S_address,Sj.S_address); strcpy(Si.S_class,Sj.S_class);Si. D_number =Sj. D_number;strcpy(Sj.S_name,name);strcpy(Sj.S_number,number); strcpy(Sj.S_address,address); strcpy(Sj.S_class,Cnumber);Sj. D_number =t;/查询函数以班级为关键字进行查询(顺序查找)void Query_S_class(Student S)int i,j=0;char classnumber31;printf(请输入你要查找的班级号(30个字符以内):);scanf(%s,classnumber);getchar();printf(所查找学生信息如下:n);printf(学生姓名 学生班级 学生学号 宿舍号 学生地址 学生电话号码n);for(i=1;iTotal;i+)if(strcmp(classnumber,Si.S_class)=0)printf(%-20s%-20s %-15s%-5d%s-10%sn,Si.S_name, Si.S_class,Si.S_number,Si.D_number,Si.S_address,Si.S_phone); j=1; if(!j)printf(n查找失败,表中不存在该学生的信息!nn);/查询函数以姓名为关键字进行查询(顺序查找)void Query_S_name(Student S)int i,j=0;char name31;printf(请输入你要查找的学生的姓名(30个字符以内):);scanf(%s,name);getchar();printf(所查找学生信息如下:n);printf(学生姓名 学生班级 学生学号 宿舍号 学生地址 学生电话号码n);for(i=1;iTotal;i+)if(strcmp(name,Si.S_name)=0)printf(%-20s%-20s %-15s%-5d%s-10%sn,Si.S_name, Si.S_class,Si.S_number,Si.D_number,Si.S_address,Si.S_phone); j=1; if(!j)printf(n查找失败,表中不存在该学生的信息!nn);/查询函数以学号为关键字进行查询(折半查找)void Query_S_number(Student S)int i,j,top,base,mid;char number15;j=0;base=1;top=S-Total;printf(请输入你要查找学生的学号:);scanf(%s,number);getchar();Sort_S_number(S); /将表中原数据按照学号从小到大排序printf(所查找学生信息如下:n);printf(学生姓名 学生班级 学生学号 宿舍号 学生地址 学生电话号码n);if(strcmp(number,S1.S_number)=0&strcmp(number,SS-Total.S_number)=0)while(base0)base=mid+1;elsetop=mid-1;if(!j)printf(n查找失败,表中不存在该学生的信息!nn);/查询函数以寝室号为关键字进行查询(折半查找)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(学生姓名 学生班级 学生学号 宿舍号 学生地址 学生电话号码n);if(i=S1.D_number&iTotal.D_number)while(baseS-Total)break;if(n0)while(Sn.D_number=i)printf(%-20s%-15s%-5dn,Sn.S_name,Sn.S_number,Sn.D_number); n-;if(nSmid.D_number)base=mid+1;elsetop=mid-1;if(!j)printf(n查找失败,表中不存在该寝室的信息!nn);/存储函数void Save(Student S)St Std;int i;int flag1=0,flag2=0; /判断存储是否成功FILE *fp; if(fp=fopen(Dorm_Manage,w)=NULL) printf(打开文件失败!nn); flag1=1; exit(0); /结束程序for(i=1;iTotal;i+) if(fwrite(&Si,sizeof(Std),1,fp)!=1) printf(数据写入错误nn); flag2=1;exit(0); if(!flag1&!flag2) printf(数据存储成功!nn);dirty=0; fclose(fp);/加载记录函数void Load(Student S)St Std;FILE *fp;if(fp=fopen(Dorm_Manage,r)=NULL)printf(打开文件失败!nn);exit(0);while(!feof(fp)fread(&S+(S-Total),sizeof(Std),1,fp);fclose(fp); printf(加载数据成功!nn); (S-Total)-; /由于读取问题,表中个数要减去/退出程序时判断是否保存函数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()/菜单printf( 学生管理nn);printf(*菜单*n);printf(1.添加学生信息 | 8.按照班级号从小到大排序n”);printf(2.修改学生信息 | 9.按照寝室号从小到大排序n);printf(3.删除学生信息 | 10.按照学号从小到大排序n);printf(4.以姓名查询学生信息 | 11.显示所有学生的相关信息n);printf(5.以学号查询学生信息 | 12.保存操作n);printf(6.以寝室号查询该寝室中的全部学生信息 | 13.加载记录n); printf(“7.以班级号查询该班级中的全部学生信息 | 14.退出程序n);printf(*n);void main()int i;Student S;S-Total=0;doMenu();printf(请选择所要实现的功能(请输入114中的任意一个数字):);scanf(%d,&i);getchar(); /获取换行符putchar(n);switch(i)case 1:Add(S); break;case 2:Alter(S); break;case 3:Delete(S); break;case 4:Query_S_name(S); break;case 5:Query_S_number(S); break;case 6:Query_D_number(S); break; case 7: Query_S_class (S); break; case 8: Sort_S_class (S); printf(排序完成!nn); break;case 9:Sort_D_number(S); printf(排序完成!nn); break;case 10:Sort_S_number(S); printf(排序完成!nn); break;case 11:Display_All(S); break;case 12:Save(S); break;case 13:Load(S); break;case 14:Judge_Save(dirty,S); exit(0); break;default:printf(选择错误:请在选项到之间选择!nn); break;while(i!=14);四、调试分析1.数据测试对功能1(添加学生信息)的测试:向程序中添加三条记录按照先后顺序分别输入:学生姓名:张三,学生学号:20070001,宿舍号:502 如图1所示 学生姓名:李四,学生学号:20070003,宿舍号:502 如图2所示 学生姓名:王五,学生学号:20070002,宿舍号:503 如图3所示图1 图2 图3对功能2(修改学生信息)的测试:修改学生王五的信息按照先后顺序分别输入:学生姓名:王五,学生姓名:王五,学生学号:20070005,宿舍号:501如图4所示: 图4对功能3(删除学生信息)的测试:删除学生李四的信息输入:学生姓名:李四 如图5所示 图5对功能4(以姓名查询学生信息)的测试:查询学生王五的信息输入:学生姓名:王五 如图6所示 图6对功能5(以学号查询学生信息)的测试:查询学号为20070001的信息输入:学生学号:20070001 如图7所示 图7对功能6(以寝室号查询学生信息)的测试:查询寝室号为501的信息输入:寝室号:501 如图8所示 图8对功能7(按照寝室号从小到大的排序)和功能9(显示所有学生信息)的测试:先选择功能7(如图9),然后选择功能9(如图10)。 图9 图10对功能8(按照学号从小到大的排序)和功能9(显示所有学生信息)的测试:先选择功能8(如图11),然后选择功能9(如图12)。 图11 图12对功能10(保存操作)和功能11(加载记录)的测试:先选择功能10(如图13),然后关闭程序,重新运行,此时选择功能11(如图14),然后选择功能9显示出学生信息(如图15)。 图13 图14 图152.时间复杂度分析判断学号是否重复函数S_number_Judge(Student S,int t); 时间复杂度T(n)=n添加学生信息函数Add(Student S); 时间复杂度T(n)=1修改学生信息函数Alter(Student S); 时间复杂度T(n)=n删除学生信息函数Delete(Student S); 时间复杂度T(n)=n显示所有学生信息函数Display_All(Student S); 时间复杂度T(n)=n按照寝室号从小到大排序函数Sort_D_number(Student S); 时间复杂度T(n)=n2按照学号从小到大排序函数Sort_S_number(Student S); 时间复杂度T(n)=n2根据学生姓名查找函数Query_S_name(Student S); 时间复杂度T(n)=n根据学生学号查找函数Query_S_number(Student S); 时间复杂度T(n)=2n根据寝室号查找函数Query_D_number(Student S) 时间复杂度T(n)=2n 3.调试过程中对所遇问题的分析问题主要出现在按照寝室号从小到大排序函数Sort_D_number(Student S)和加载记录函数Load(Student S)上。在调试Sort_D_number(Student S)时,由于一个寝室可能会居住多个学生,所以在找到所查找的寝室时,必须再利用两个循环对所查找的寝室分别向前和向后继续查找符合所要求的寝室号的学生信息;在调试Load(Student S)函数时,由于程序每次都会从文件里多读一条记录,即乱码,所以在记录加载完毕后,必须对记录总数减一。在其他函数的调试中没遇到什么特别问题。4.算法的改进设想在排序函数上,可将冒泡排序法改为效率更高的算法如:堆排序、归并排序、基数排序等。在查找函数上,可将折半查找法改为哈希查找法等。五、用户手册操作介绍如下:运行程序会出现如图16所示的画面: 图16此时选择所想要实现的功能,输入所想实现的功能前的数字即可,例如选择添加学生信息功能,即输入“1”(输入时无引号),则会出现如图17所示的画面: 图17此时只需根据程序提示,依次输入各项,并在输入完各项后单击回车按钮,最后如图18所示: 图18当一个功能完成后,可以选择其他功能,此时又会出现如图16所示的画面。直到完成所想完成的所有工作后,可以选择“12”(输入时无引号)退出程序(如图19所示)。 图19此时只需按下键盘上的任意键即可退出程序。六、课程总结在本程序的设计过程中深刻体会到了程序是建立在数据结构之上的。程序中的所有算法都要围绕着自己所定义的抽象数据类型来设计。由此可见在设计程序时,定义一个好的数据结构尤为重要。在此程序设计过程中也增强了对一些算法的了解以及运用,如二分法。但是也发现了自己还有很多不足的地方,比如算法时间复杂度还是偏高,没能想出更有效的减少时间复杂度的方法,这是在今后学习中需要加强的。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑环境 > 建筑工程


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!