当前位置首页 > 学术论文 > 其它论文相关文档
搜柄,搜必应! 快速导航 | 使用教程

数据结构课程设计——宿舍管理查询软件要点

文档格式:DOCX| 26 页|大小 254.27KB|2025-03-16 发布|举报 | 版权申诉
第1页
第2页
第3页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 26
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 秦皇岛分校NorthEastern University At QinHuangDao数据结构课程设计宿舍管理查询软件班级学号班学生姓名提交日期2015年7月24日成 绩计算机与通信工程学院一、需求分析1、程序设计任务为宿舍管理人员编写一个宿舍管理查询软件①程序设计要求:A.采用交互工作方式B.建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序 (冒泡、选择、插入排序等任选一种) ②查询菜单:(用二分查找实现以下操作 )A.按姓名查询B.按学号查询C.按房号查询③打印任一查询结果(可以连续操作)2、功能①要实现交互工作方式,各项操作结束后均应返回主菜单;②系统本无任何信息数据, 要建立数据文件,需开发一个信息录入功能, 即首先创建一个学员线性表,同时我们可以将数据暂时保存在内存中,所以我们未开发信息存盘功能;③信息录入后都保存在内存中, 用户看不到,需要设计一个信息显示功能, 信息的显示应该便于查阅,所以需具备按各种关键字显示的功能;④本系统按关键字(姓名、学号、房号)进行冒泡排序,采用二分查找方式分别实现按关键字(姓名、学号、房号)查询功能;⑤由于有些同学因为不同原因而离校,所以设计了删除功能;⑥由于有新同学入校,所以设计了插入功能;⑦当用户操作完毕需要退出时, 我们提供了退出选项,便于使用者退出交互式工作系统。

    3、功能模块图4、流程图开始退出输入学牛信氢♦l<=f^=8▼ T T ♦HRUA5、输入和输出①输入的形式1)开始创建线性表:按先后顺序输入姓名 (20个字以内),学号(整型),房号(整型)2)根据用户所选择的操作键,然后再根据程序的相应提示进行输入选择操作键1 (按姓名排序):无输入;选择操作键2 (按学号排序):无输入;选择操作键3 (按房号排序):无输入;选择操作键4 (按姓名查找):输入要查找的姓名;选择操作键 选择操作键 选择操作键 选择操作键(按学号查找)(按房号查找)(按学号插入)(按学号删除)输入要查找的学号;输入要查找的房号;按照提示顺序输入要插入的学生姓名,学号,房号;输入要删除学生的学号②输出的形式及范围根据用户选择的不同,会有不同的输出选择操作键 选择操作键 选择操作键 选择操作键 出该学生不存在;选择操作键 出该学生不存在;选择操作键 出该学生不存在选择操作键选择操作键 的所有学生信息按姓名排序) (按学号排序) (按房号排序 (按姓名查找)(按学号查找)(按房号查找)(按学号插入)(按学号删除):输出以姓名首字母排序的所有学生信息;:输出按学号从小到大排列的所有学生信息;):输出按房号从小到大排列的所有学生信息;:若查找成功,则输出相应学生信息,:若查找成功,则输出相应学生信息,:若查找成功,则输出相应学生信息,若不成功,则输若不成功,则输若不成功,则输:输出插入后的所有学生信息;:输出所需删除的学生信息,确认删除后,输出删除后开始录入的数据:姓名学号房号刘备1102孙权6231周瑜312466、测试数据正确输入:查找的数据:正确输出:孙权二、 详细设计(按学号)2311、数据结构typedef struct // {char name[20];int num;int room;}stu;stu stud;typedef struct{定义结构体成员//学号和房号都为整型int length;stu *elem;int listsize;}linklist;2、数据int f ;//////当前长度存储空间基址当前分配的存储容量f 为全局变量,指选择的操作键数char name[20] ;name 为姓名 int num ; num 为学号int room ; room 为房号 int length; length 为线性表的当前长度 stu *elem; elem 指示线性表的基地址 int listsize;listsize 为当前分配的存储容量 char c ; c 为进入主界面的任意键char ch;ch 为判断字符 y 或 nint i,j;在冒泡排序中, i 为外层循环次数, j 为内层循环次数int i ;在打印学生信息时, i 作为循环变量int m;int n;int a;m,n,a 在二分查找中分别代表房号,学号,姓名int i,j,k;i,j,k 在按学号插入中作为循环变量int i,j,k=-1;i,j,k 在按学号删除中作为循环变量3、函数调用具体函数如下:void init(linklist &l)void create(linklist &l)void sort3(linklist &l)void sort2(linklist &l)void sort1(linklist &l)void chazhao3(linklistvoid chazhao2(linklistvoid chazhao1(linklistvoid print1(linklist &l)void print2(linklist &l,int mid) 数实现。

    用于线性表初始化,通过调用 C语言文件操作函数来实现用于创建学生信息表,通过线性表来实现用于按房号排序,通过采用冒泡排序的算法来实现用于按学号排序,通过采用冒泡排序的算法来实现用于按姓名排序,通过采用冒泡排序的算法来实现l)&l)&l)用于按房号从小到大查找, 用于按学号从小到大查找, 用于按姓名从小到大查找,通过采用二分查找的算法来实现通过采用二分查找的算法来实现通过采用二分查找的算法来实现用于打印学生信息,通过调用文件操作函数实现用于打印查找到的学生信息,通过调用文件查找函int panduan2(char ch) :用于如果学生不存在 , 判断是否继续查找,通过 if 语句,文件操作函数实现void panduan3() :用于如果已无学生记录则返回主界面,通过调用其他函数和文件操作函数实现 void disp() :用于返回主界面,通过调用 menu() 函数实现void menu(): 用于列出操作菜单,通过输入输出语句实现void main() :程序操作的入口,是程序的主函数,可以按照已定义的函数调用子函数4、主程序:int main() // 主函数{linklist l; // 定义线性表 linit(l); // 调用初始化函数char ch;system("color a"); printf("\n");printf("*************************欢迎进入宿舍管理查询系统*************************\n");printf("\n");printf(" 请按任意键开始操作 :");scanf("%c",&ch);system("cls");// 将屏幕先前显示的内容清理掉create(l); // 调用线性表创建函数system("cls");t=1;menu(); // 调用主菜单函数while(f!=0){system("cls");switch(f){case 1: sort1(l); // 调用按姓名排序函数printf("\n");if(l.length==0){printf(" 已无学生记录 \n");printf("\n");disp();menu();}else{printf(" 按姓名排序 :\n");print1(l);disp(); // 调用返回主界面menu(); }break;case 2: sort2(l); // 调用按学号排序函数 printf("\n");if(l.length==0){printf(" 已无学生记录 \n");printf("\n");disp();menu();}else{printf(" 按学号排序 :\n");print1(l);disp();menu();}break;case 3: sort3(l); // 调用按房号排序函数printf("\n");if(l.length==0){printf(" 已无学生记录 \n");printf("\n");disp();menu();}else{printf(" 按房号排序 :\n");print1(l);disp();menu();先调用按姓名排序函数进行排序再调用按姓名查找函数进行(二分)查找先调用按学号排序函数进行排序再调用按学号查找函数进行(二分)查找先调用按房号排序函数进行排序 再调用按房号查找函数进行(二分)查找}break;case 4:sort1(l); //chazhao1(l); // break;case 5: sort2(l); // chazhao2(l); // break;case 6: sort3(l); // chazhao3(l); // break;case 7: sort2(l); // 调用插入函数 insert(l);system("cls");printf(" 显示插入后的学生信息 :\n");print1(l);disp();menu();break;case 8: Delete(l); // 调用删除函数if(l.length==0){printf("\n");printf(" 学生记录已被删除完 \n");printf("\n");disp();menu();} else{printf(" 显示删除后的学生信息 :\n");print1(l);disp();menu(); }break;}}}三、调试分析①为了避免繁琐、 改进算法, 在一些函数中调用了其它的函数。

    如: 在按 (姓名、 学号、房号)查找中都调用了 panduan1(ch) 和 panduan2(ch) 函数②在插入和删除模块中,显示学生的信息的下面总是有主界面,经过调试,运用system("cls") 函数清屏后,显示的只有学生的信息了,再按键即可返回主界面③本程序多次运用了 disp() 、 menu() 、 system("cls") 、 fflush(stdin) 等函数,经过多次调试,已经很好的控制了显示的学生信息与主界面的转换④通过本次课程设计,对线性表、冒泡排序、二分查找的应用有了更深入的了解 四、用户手册首先, 运行程序进入 “欢迎进入宿舍管理查询系统” 界面, 然后进入线性表创建界面中,输入学生的信息,创建好学生信息以后单击任意键则进入操作界面(主界面) ,然后可按键进行操作单击数字键“ 1”,则为按姓名排序 单击数字键“ 3”,则为按房号排序 单击数字键“ 5”,则为按学号查找 单击数字键“ 7”,则为按学号插入 系统中有如下关键词:单击数字键“ 2”,则为按学号排序 单击数字键“ 4”,则为按姓名查找 单击数字键“ 6”,则为按学号查找 单击数字键“ 8”,则为按学号删除提示:当输入的数字键为 。

    时,退出操作;请输入数字键(1~8为操作键);请按任意键进入主界面五、测试结果(1)欢迎界面I "丸我的塞科库VDoCurnents'CFrwVFEE pkhengjaj.ticc-'IHHHfIWHHHHHWHHHHHHHttHHWHHf欢迎进入 盾舌管理查询 系g充■ = «蕾・『有M■产餐有・・修・・・・¥・・ 请按任意键开始操作n(2)按任意键进入线性表的创建界面,并输入数据,开始创建*****1**************1******?^ 始创 建线’性表例修苴 * “防百例片有词 * MiWX * MMX MME Bi Mi生#学浏:1:10 S名口于手 第普看 为入AJn否批纸怖大(3)按操作键选择操作♦ " 生若南 DocnmBnfs'i 匚-FKee\Tennp\c heng 想白法”*************** 请技键途择操作 *****»«•»■»*»*■»■***■1按姓名排序3按信号排序5技学号查找7按学号插入Z按学号排序4按姓名查找6按房号查找6按学号删除退出操作半.(4)按姓名排序匕,找的黄科1军'LAocuEEntsTL -卜『亡七* I rmpXchengxu.EKe按姓名排序;姓名学号房号1102孙叔6231周瑜3124上按任意键进入主界面:(5)按学号排序B .口 科我更懂 Af?\Uccu rrrenta^'lhrMXl EmpVcJiengxu.eKe''技学号排序;姓名 学号 房号划章 1 102同趟 3 124a枚 6 231请按任意键进入主界面:(6)按房号排序U: \UOCU menT5\L-rreeyi em p-\cnengxu.exe按房号排序:姓名 学号 房号刘备 1 182周瑜 2 谑4他权 G g1请按任意摧进入主界面:(7)按姓名查找■ "D:\fi^S^I&.DD£:ijrnent5,,LC-Free\TenipliLcherigxLisexefe按姓名查找一一-〉请输入要查找的姓名:刘备查找成功——> 谩学生信息为■隹名 孚号 房号包董 1 102是否雏续查找?:(8)按学号查找■ 廊\Uocument、\L -卜「ee\ I emp\crergxui.exe,,学号查找请输入要查找的学号:6 始找成功一一一'谈学生信息为:区名 孚号 虑号忸卜权 6 231是苦继续查找?3nx(9)按房号查找技房号查找一一-〉请输入要查找的房号:124找成一翳生抽周瑜 3 124是否继续查找"¥公〉二(10)按学号插入■ 5 e〜%uuku「T*ii -n evh i cinp ua m ig 用人名曾可 标姓"L十房(11)按学号删除 懒嬲料T刘备 1 102是否健续删除? #include #include#define N 40 //线性表存储空间的初始分配量#define increase 10 //线性表存储空间的分配量增量int f,t=0; 〃定义全局变量typedef struct{char name[20];int num; 〃学号和房号都为整型int room;}stu;stu stud;typedef struct{int length; //当前长度stu *elem; 〃存储空间基址int listsize; 〃当前分配的存储容量}linklist;void init(linklist &l)// 线性表初始化{l.length=0;l.elem=(stu *)malloc(N*sizeof(stu));l.listsize=N;}void menu()〃操作菜单printf("\n"); printf("***************请按键选择操作****************\n");2按学号排序\n");printf("\n");printf("\n");printf(" 1按姓名排序printf("\n");printf("3按房号排序4按姓名查找\n");printf("\n");printf(" 5 按学号查找 6 按房号查找 \n");printf("\n");printf(" 7 按学号插入 8 按学号删除 \n");printf("\n"); printf("\n"); printf("\n"); printf("\n");printf(" 提示 :当输入的数字键为 0 时,退出操作 \n");if(t==1){printf(" 请输入数字键 (1~8 为操作键 ):");//1~8 为有效数字操作键scanf("%d",&f);if(f<0||f>9){system("cls");printf("\n");printf(" 输入数字不对 ,请在原处重输 !\n"); printf("\n");menu();}}}void disp() //返回主界面{char c;fflush(stdin);printf("\n");printf(" 请按任意键进入主界面 :");scanf("%c",&c);system("cls");}void panduan3() //如果已无学生记录则返回主界面{printf("\n");printf(" 已无学生记录 \n");printf("\n");disp();menu();}void shuru(linklist l) //输入学生的信息{printf(" 请输入姓名 :");fflush(stdin); // 清空输入缓冲区,得到正确的输入数据gets(stud.name); //输入一行字符串(姓名) printf(" 请输入学号 :");scanf("%d",&stud.num);printf(" 请输入房号 :");scanf("%d",&stud.room);}void create(linklist &l)// 创建学生信息表{if(l.length>=l.listsize) //判断学生的人数是否超过初值,如果超过,则重新分配{stu *newbase;newbase=(stu*)realloc(l.elem,(N+increase)*sizeof(stu ));l.elem=newbase;l.listsize+=increase;}int i=2;char ch;printf("\n");printf("**************************开始创建线性表***************************\n");printf("\n");printf(" 请输入第 1 个学生的信息 \n");shuru(l); //调用输入函数ch=getchar();strcpy(l.elem[l.length].name,stud.name);l.elem[l.length].num=stud.num;l.elem[l.length].room=stud.room;l.length++;printf("\n");printf(" 是否继续输入 ?:");scanf("%c",&ch);printf("\n");printf("\n");while(ch=='y'){printf(" 请输入第 %d 个学生的信息 \n",i);shuru(l);strcpy(l.elem[l.length].name,stud.name);l.elem[l.length].num=stud.num;l.elem[l.length].room=stud.room;l.length++;i++;ch=getchar(); printf("\n");printf(" 是否继续输入 ?:");scanf("%c",&ch);printf("\n");printf("\n");}if(ch=='n') system("cls");}void sort3(linklist &l)// 按房号排序(采用冒泡排序){int i,j;stu temp;for(i=0;il.elem[j].room){temp=l.elem[i];l.elem[i]=l.elem[j];l.elem[j]=temp;}}void sort2(linklist &l)// 按学号排序(采用冒泡排序){int i,j;stu temp;for(i=0;il.elem[j].num){temp=l.elem[i];l.elem[i]=l.elem[j];l.elem[j]=temp;}}void sort1(linklist &l)// 按姓名排序(采用冒泡排序){int i,j;stu temp;for(i=0;i0){temp=l.elem[i]; l.elem[i]=l.elem[j];l.elem[j]=temp;}}void print1(linklist &l)// 打印学生信息{int i;printf("\n");printf(" 姓名 学号 房号 \n");printf("\n");for(i=0;i 该学生信息为 :\n");printf(" 姓名 学号 房号 \n");printf("\n");printf("%-15s %-5d %-5d\n",l.elem[mid].name,l.elem[mid].num,l.elem[mid].room);}int panduan1(char ch) //判断是否继续查找{scanf("%c",&ch);printf(" 是否继续查找 ?:");fflush(stdin);scanf("%c",&ch);if(ch=='y'){system("cls");return(1);}elsereturn 0;}int panduan2(char ch) //如果学生不存在 ,判断是否继续查找{scanf("%c",&ch);printf(" 该学生不存在 ,是否继续查找 ?:");fflush(stdin);scanf("%c",&ch);if(ch=='y')system("cls");return(1);}else return 0;}void chazhao3(linklist &l)// 按房号从小到大查找(采用二分查找){if(l.length==0) panduan3(); //此函数功能为:返回主界面else{int low=0,high=l.length,mid,flag=0;//flag 作为标志符, 为 1 则表示查找成功, 否则没 有所要查找的学生int m;char ch;printf("\n");printf("\n");printf(" 按房号查找 > 请输入要查找的房号 :");scanf("%d",&m);printf("\n"); while(low<=high) {mid=(low+high)/2;if(m==l.elem[mid].room) {flag=1; break;}else if(m>l.elem[mid].room) low=mid+1;else high=mid-1;} if(flag==1){print2(l,mid);if(panduan1(ch)) // 调用判断函数 1chazhao3(l);else {system("cls");menu();}else{if(panduan2(ch)) //调用判断函数 2chazhao3(l); else{ system("cls"); menu();}}}}void chazhao2(linklist &l)// 按学号从小到大查找(采用二分查找){if(l.length==0) panduan3();else{int low=0,high=l.length,mid,flag=0;int n;char ch;printf("\n");printf("\n");printf(" 按学号查找 > 请输入要查找的学号 :");scanf("%d",&n);printf("\n");while(low<=high){mid=(low+high)/2;if(n==l.elem[mid].num){flag=1; break;}else if(n>l.elem[mid].num)low=mid+1;elsehigh=mid-1;}if(flag==1){print2(l,mid);if(panduan1(ch))chazhao2(l);else{ system("cls"); menu();}}else{ if(panduan2(ch)) chazhao2(l);else{ system("cls"); menu();}}}}void chazhao1(linklist &l)// 按姓名从小到大查找(采用二分查找){if(l.length==0) panduan3();else{int low=0,high=l.length,mid,flag=0;printf("\n");printf("\n");printf(" 按姓名查找 > 请输入要查找的姓名 :");char a[15],ch;scanf("%s",a);printf("\n");while(low<=high){mid=(low+high)/2;if(strcmp(a,l.elem[mid].name)==0){flag=1; break;}else if(strcmp(a,l.elem[mid].name)>0) low=mid+1;elsehigh=mid-1;}if(flag==1){print2(l,mid); //打印查找到的学生的信息 if(panduan1(ch)) chazhao1(l); else {system("cls"); menu();}}else{ if(panduan2(ch)) chazhao1(l); else{ system("cls");menu();}}}}void insert(linklist &l)// 按学号从小到大插入该学生{int i,j,k;char ch;printf("\n");printf(" 插入的学生信息为 :\n");printf(" 姓名 :");fflush(stdin);// 清空输入缓冲区,得到正确的输入数据 gets(stud.name);printf(" 学号 :"); scanf("%d",&stud.num);printf(" 房号 :"); scanf("%d",&stud.room);if(l.length==0){strcpy(l.elem[l.length].name,stud.name); l.elem[l.length].num=stud.num;l.elem[l.length].room=stud.room;}for(i=0;ik;j--)l.elem[j]=l.elem[j-1];strcpy(l.elem[k].name,stud.name);l.elem[k].num=stud.num;l.elem[k].room=stud.room; break;} else{strcpy(l.elem[l.length].name,stud.name);l.elem[l.length].num=stud.num;l.elem[l.length].room=stud.room; }}l.length++;fflush(stdin);printf("\n");printf(" 是否继续插入 ?:");scanf("%c",&ch);if(ch=='y') insert(l);else system("cls");}void Delete(linklist &l)// 按学号删除该学生 {int i,j,k=-1;char ch;printf("\n");printf("\n");printf(" 请输入要删除学生的学号 :");scanf("%d",&stud.num);for(i=0;i=l.length) printf(" 该学生不存在 \n");if(k>=0)l.length--;fflush(stdin);printf("\n");printf(" 是否继续删除 ?:");scanf("%c",&ch);system("cls");if(ch=='y') Delete(l);else system("cls");}int main() //主函数{linklist l; //定义线性表 linit(l); //调用初始化函数char ch;system("color a");printf("\n");printf("*************************欢迎进入宿舍管理查询系统*************************\n");printf("\n");printf(" 请按任意键开始操作 :");scanf("%c",&ch);system("cls");// 将屏幕先前显示的内容清理掉create(l); // 调用线性表创建函数system("cls");t=1;menu(); //调用主菜单函数while(f!=0){system("cls");switch(f){case 1: sort1(l); // 调用按姓名排序函数printf("\n");if(l.length==0){printf(" 已无学生记录 \n");printf("\n");disp();menu();} else{printf(" 按姓名排序 :\n");print1(l);disp(); //调用返回主界面menu();} break;case 2: sort2(l); // 调用按学号排序函数 printf("\n");if(l.length==0){printf(" 已无学生记录 \n");printf("\n");disp(); menu();}else{printf(" 按学号排序 :\n");print1(l);disp();menu();}break;case 3: sort3(l); //调用按房号排序函数printf("\n");if(l.length==0){printf(" 已无学生记录 \n");printf("\n");disp();menu();}else{printf(" 按房号排序 :\n");print1(l);disp();menu();}break;case 4:sort1(l); //先调用按姓名排序函数进行排序chazhao1(l); //再调用按姓名查找函数进行二分)查找 break;case 5: sort2(l); //先调用按学号排序函数进行排序chazhao2(l); //再调用按学号查找函数进行二分)查找break; case 6: sort3(l); // 先调用按房号排序函数进行排序 chazhao3(l); //再调用按房号查找函数进行二分)查找break;case 7: sort2(l); // 调用插入函数insert(l);system("cls");printf(" 显示插入后的学生信息 :\n");print1(l);disp();menu();break;case 8: Delete(l); //调用删除函数if(l.length==0){printf("\n");printf(" 学生记录已被删除完 \n");printf("\n");disp();menu();} else{printf(" 显示删除后的学生信息 :\n");print1(l);disp();menu();} break;}}}七、参考文献1、《C++程序设计(第2版)》,谭浩强编著,清华大学出版社, 2013年11月。

    2、《数据结构 C 语言版) 》 ,严蔚敏、吴伟民编著,清华大学出版社, 2013 年 4 月。

    点击阅读更多内容
    卖家[上传人]:飞天仙子
    资质:实名认证
    相关文档
    正为您匹配相似的精品文档