中北大学数据结构课程设计说明书学生姓名:张旭亮学号:0706054232学院:电子与计算机科学技术学院专业:软件工程题目:宿舍管理查询系统成绩指导教师周海英靳雁霞2009年6月24日1.设计目的数据结构课程设计的目的是,通过设计掌握数据结构课程中学到的基本理论和算法并综合运用于解决实际问题中,它是理论与实践相结合的重要过程。设计要求学会如何对实际问题定义相关数据结构,并采用恰当的设计方法和算法解决问题,同时训练学生进行复杂程序设计的技能和培养良好的程序设计习惯。…………………………..2.设计内容和要求2.1设计内容:为宿舍管理人员编写一个宿舍管理查询软件。要求:1)建立数据文件,数据文件按关键字(姓名,学号,房号)进行排序(冒泡,选择,插入排序等任意一种)2)查询菜单(用二分法实现以下操作)A.按姓名查询B.按学号查询C.按房号查询2.2基本要求:1)系统功能的完善;2)代码中有必要的注释。、…………………………3.概要设计11)需要定义一个结构体:typedefstructpnode//结构体定义用于存放学生信息的节点{charname[8];//姓名charxh[16];//学号charfh[30];//房号}personnode;用来存储学生的信息。2)create()//初始条件:必须保证原有记录是空时方可建立操作结果:建立一个新的数据文件3)readfile()//初始条件:数据文件已经建立操作结果:获取次文件的信息4)serch1()按姓名查找serch2()按学号查找serch3()按宿舍号查找初始条件:数据文件中含有纪录操作结果:不支持模糊查询必须查询项和关键字吻合情况下才可查询。调用按不同关键字查询的子函数若存在相应的查询结果则显示在屏幕上,若查找的纪录不存在则提示该纪录不存在,请建立相应的数据纪5)insert()//添加数据纪录的函数初始条件:必须已经建立了数据文件操作结果:在数据文件中添加新的纪录若没有建立数据文件则添加失败。6)delete()//删除数据纪录的函数初始条件:必须建立了数据库并且数据文件中含有数据纪录操作结果:删除输入学号的学生的一切相关纪录7)updata()//修改数据纪录的函数初始条件:必须建立了数据库并且数据文件中含有数据纪录操作结果:修改输入的学号相对应的学生的一切信息。如不存在相应的纪录则提示不存在8)output()//输出函数初始条件:数据文件已经建立操作结果:起泡法排序按学号顺序输出记录2本程序包含10个函数:1.主函数main()2.新建数据文件create()3.查询函数serch1()4.查询函数serch2()5.查询函数serch3()6.加数据纪录函数insert()7.删除数据纪录函数delete()8.修改数据纪录函数updata()9.数据文件读取函数readfile()10.查询当前所有纪录冰按学号升序输出的函数output()2各函数间关系:利用主函数调用其他的各个函数,新建数据文件函数create()是其它各个函数的基础,有了它其它函数才能够使用。查询函数insert1.2.3()添加数据纪录函数insert()删除数据纪录函数delete()修改数据纪录函数updata()这些函数都是在同一等级上的函数,是平行关系。查询当前所有纪录的函数output()以学号为关键字查询函数serch1()以姓名为关键字查询函数serch2()以床号为关键字查询函数serch3()以宿舍号)这些函数都是查询函数中的子函数,他们之间是平行的关系。4.功能模块详细设计1.主函数main()通过swich分支构建图形用户界面一次调用其他模块完成总体功能;2新建数据文件create()2.1为节点分配内存2.2创建二进制文件用于存储学生信息2.3通过一个循环一次录入学生信息2.4关闭文件3.查询函数serch1()3.1打开文件3.2遍历整个文件找到与指定姓名匹配的信息3.3输出查询到的信息3.4关闭文件4.查询函数serch2()4.1打开文件4.2遍历整个文件找到与制定学号匹配的信息4.3输出查询到的信息5.4关闭文件5.查询函数serch3()5.1打开文件5.2遍历整个文件找到与制定床号匹配的信息5.3输出查询到的信息5.4关闭文件6.加数据纪录函数insert()6.1打开文件6.2将制定记录插入到文件的末尾6.3关闭文件7.删除数据纪录函数delete()7.1打开文件7.2遍历文件找到与制定姓名匹配的记录并删除7.3关闭文件8.修改数据纪录函数updata()8.1打开文件8.2遍历整个文件找到与制定姓名匹配的记录并修改8.3关闭文件9.数据文件读取函数readfile()9.1打开文件9.2读取文件9.3关闭文件10.查询当前所有纪录冰按学号升序输出的函数output()10.1打开文件10.2遍历文件(嵌套遍历)依次比较学号大小用起泡法进行排序10.3遍历文件依次输出文件中的记录4.1详细设计思想采用模块化编程思想,将程序划分为11个模块,在逐个模块细化编程,最后再将个个模块组装成软件。……………………….4.2源代码#includestdio.h#includestdlib.h#includestring.htypedefstructpnode//结构体定义用于存放学生信息的节点{charname[8];//姓名charxh[16];//学号charfh[30];//房号}personnode;charfilename[20];//文件名FILE*fp;//指向文件的指针voidcreat()//创建新数据文件的函数创建一个二进制文件用于存放学生数据{personnode*person;person=(personnode*)malloc(sizeof(personnode));//为节点分配内存printf(\npleaseenterthefilename:\n);scanf(%s,filename);if((fp=fopen(filename,w+))==NULL){printf(\nyouhavenoenterthefilename,cannotfontthefile);exit(0);}printf(\npleaseenterthename,studentnumbeer(thesamelength)androomnumber,sparewithspace,endwith#\n);scanf(%s,person-name);while(strcmp(person-name,#))//该循环用于控制学生信息的录入当输入#时学生信息录入完毕{scanf(%s%s,person-xh,person-fh);fprintf(fp,%-10s%-20s%-50s\n,person-name,person-xh,person-fh);scanf(%s,person-name);}fclose(fp);}voidreadfile()//文件读取函数用于打开已有的二进制数据文件{printf(\npleaseenterthefileroad:\n);scanf(%s,filename);//此处输入为文件的路径如c:\zhangif((fp=fopen(filename,r+))==NULL){printf(\ncan'topenthefile:\n);exit(0);}fclose(fp);}voidoutput()//输出函数用于输出文件的全部信息{personnode*person;longoffset1,offset2;charname1[8],name2[8],name3[8];charxh1[16],xh2[16],xh3[16];charfh1[30],fh2[30],fh3[30];person=(personnode*)malloc(sizeof(personnode));if((fp=fopen(filename,r))==NULL){printf(\ncan'topenthefile);exit(0);}while(!feof(fp))//此循环用于对文件数据中关键字学号进行从小到大冒泡排序{inta,b,c,d;//a为循环结束判定变量b,c,d用于起泡排序时学号交换的替换if((fp=fopen(filename,r+))==NULL){printf(\ncan'topenthefile);exit(0);}while(!feof(fp))//从文件头开始遍历{while(!feof(fp))//对两组数据进行排序{offset1=ftell(fp);//获取文件内部当前指针位置fscanf(fp,%s%s%s\n,person-name,person-xh,person-fh);strcpy(name1,person-name);strcpy(xh1,person-xh);strcpy(fh1,person-fh);if(feof(fp))break;//文件结束跳出循环offset2=ftell(fp);//获取文件内部下一指针位置fscanf(fp,%s%s%s\n,person-name,person-xh,person-fh);strcpy(name2,person-name);strcpy(xh2,person-xh);strcpy(fh2,person-fh);b=strlen(xh1);c=strlen(xh2);d=strcmp(xh1,xh2);if(b==c&&d0)//如果学号1大于等于学号2怎交换全部数据{strcpy(name3,name1);strcpy(name1,name2);strcpy(name2,name3);strcpy(xh3,xh1);strcpy(xh1,xh2);strcpy(xh2,xh3);strcpy(fh3,fh1);strcpy(fh1,fh2);strcpy(fh2,fh3);fseek(fp,offset1,SEEK_SET);//将文件指针移动offset1个字节strcpy(person-name,name1);strcpy(person-xh,xh1);strcpy(person-fh,fh1);fprintf(fp,%-10s%-20s%-50s\n,person-name,person-xh,person-fh);//排序后写入文件strcpy(person-name,name2);strcpy(person-xh,xh2);strcpy(person-fh,fh2);fprintf(fp,%-10s%-20s%-50s\n,person-name,person-xh,person-fh);//排序后写入文件}fseek(fp,offset2,SEEK_SET);///将文件位置指针从文件头向前移动offset2个字节}rewind(fp);//指向头文件while(!feof(fp))//此循环用于判断学号是否有序{offset1=ftell(fp);fscanf(fp,%s%s%s\n,person-name,person-xh,person-fh);strcpy(xh1,person-xh);if(feof(fp)){a=1;break;}offset2=ftell(fp);fscanf(fp,%s%s%s\n,person-name,person-xh,person-fh);strcpy(xh2,person-xh);b=strlen(xh1);c=strlen(xh2);d=strcmp(xh1,xh2);if(b==c&&d=0)a=1;//若a为1则有序else{a=0;//a为0怎无序break;}fseek(fp,offset2,SEEK_SET);}if(a)break;//a为1说明学号已经有序跳出循环rewind