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



《数据结构课程设计——宿舍管理查询软件要点》由会员分享,可在线阅读,更多相关《数据结构课程设计——宿舍管理查询软件要点(26页珍藏版)》请在装配图网上搜索。
1、 秦皇岛分校 NorthEastern University At QinHuangDao 数据结构课程设计 宿舍管理查询软件 班级学号 班 学生姓名 提交日期 2015年7月24日 成 绩 计算机与通信工程学院 一、需求分析 1、程序设计任务 为宿舍管理人员编写一个宿舍管理查询软件。 ①程序设计要求: A.采用交互工作方式 B.建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序 (冒泡、选择、插入 排序等任选一种) ②查询菜单:(用二分查找实现以下操作 ) A.按姓名查询 B.按学
2、号查询 C.按房号查询 ③打印任一查询结果(可以连续操作) 2、功能 ①要实现交互工作方式,各项操作结束后均应返回主菜单; ②系统本无任何信息数据, 要建立数据文件,需开发一个信息录入功能, 即首先创建一 个学员线性表,同时我们可以将数据暂时保存在内存中,所以我们未开发信息存盘功能; ③信息录入后都保存在内存中, 用户看不到,需要设计一个信息显示功能, 信息的显示 应该便于查阅,所以需具备按各种关键字显示的功能; ④本系统按关键字(姓名、学号、房号)进行冒泡排序,采用二分查找方式分别实现按 关键字(姓名、学号、房号)查询功能; ⑤由于有些同学因为不同原因而离校,所以设计了
3、删除功能; ⑥由于有新同学入校,所以设计了插入功能; ⑦当用户操作完毕需要退出时, 我们提供了退出选项,便于使用者退出交互式工作系统。 3、功能模块图 4、流程图 开始 退出 输入学牛信氢 ♦ l<=f^=8 ▼ T T ♦ HR UA 5、输入和输出 ①输入的形式 1)开始创建线性表:按先后顺序输入姓名 (20个字以内),学号(整型),房号(整型)。 2)根据用户所选择的操作键,然后再根据程序的相应提示进行输入。 选择操作键1 (按姓名排序):无输入; 选择操作键2 (按学号排序):无输入; 选择操作键3 (按房号排序
4、):无输入; 选择操作键4 (按姓名查找):输入要查找的姓名; 选择操作键 选择操作键 选择操作键 选择操作键 (按学号查找) (按房号查找) (按学号插入) (按学号删除) 输入要查找的学号; 输入要查找的房号; 按照提示顺序输入要插入的学生姓名,学号,房号; 输入要删除学生的学号。 ②输出的形式及范围 根据用户选择的不同,会有不同的输出。 选择操作键 选择操作键 选择操作键 选择操作键 出该学生不存在; 选择操作键 出该学生不存在; 选择操作键 出该学生不存在。 选择操作键 选择操作键 的所有学生信息。 (按姓名排序) (按学号排序) (按房号排序 (按
5、姓名查找) (按学号查找) (按房号查找) (按学号插入) (按学号删除) :输出以姓名首字母排序的所有学生信息; :输出按学号从小到大排列的所有学生信息; ):输出按房号从小到大排列的所有学生信息; :若查找成功,则输出相应学生信息, :若查找成功,则输出相应学生信息, :若查找成功,则输出相应学生信息, 若不成功,则输 若不成功,则输 若不成功,则输 :输出插入后的所有学生信息; :输出所需删除的学生信息,确认删除后,输出删除后 开始录入的数据:姓名 学号 房号 刘备 1 102 孙权 6 231 周瑜 3 124 6 6、测试
6、数据 正确输入:查找的数据: 正确输出:孙权 二、 详细设计 (按学号) 231 1、数据结构 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
7、 name[20] ; name 为姓名 int num ; num 为学号 int room ; room 为房号 int length; length 为线性表的当前长度 stu *elem; elem 指示线性表的基地址 int listsize; listsize 为当前分配的存储容量 char c ; c 为进入主界面的任意键 ch
8、ar ch; ch 为判断字符 y 或 n int 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 &
9、l) void sort2(linklist &l) void sort1(linklist &l) void chazhao3(linklist void chazhao2(linklist void chazhao1(linklist void print1(linklist &l) void print2(linklist &l,int mid) 数实现。 :用于线性表初始化,通过调用 C语言文件操作函数来实现。 :用于创建学生信息表,通过线性表来实现。 :用于按房号排序,通过采用冒泡排序的算法来实现。 :用于按学号排序,通过采用冒泡排序的算法来实现。 :用于按姓
10、名排序,通过采用冒泡排序的算法来实现。 &l) &l) &l) 用于按房号从小到大查找, 用于按学号从小到大查找, 用于按姓名从小到大查找, 通过采用二分查找的算法来实现。 通过采用二分查找的算法来实现。 通过采用二分查找的算法来实现。 :用于打印学生信息,通过调用文件操作函数实现。 :用于打印查找到的学生信息,通过调用文件查找函 int panduan2(char ch) :用于如果学生不存在 , 判断是否继续查找,通过 if 语句,文件操 作函数实现 void panduan3() :用于如果已无学生记录则返回主界面,通过调用其他函数和文件操作函 数实现。
11、 void disp() :用于返回主界面,通过调用 menu() 函数实现。 void menu(): 用于列出操作菜单,通过输入输出语句实现。 void main() :程序操作的入口,是程序的主函数,可以按照已定义的函数调用子函数。 4、主程序: int main() // 主函数 { linklist l; // 定义线性表 l init(l); // 调用初始化函数 char ch; system("color a"); printf("\n"); printf(" ************************* 欢迎进入宿舍管理查询系统 *******
12、***************** *\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) { p
13、rintf(" 已无学生记录 \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");
14、 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(); 先调用按姓名排序函数进行排序 再调用按姓名查找函数进行(二分)查找 先调用按学号排序函数进行排序 再调用按学号查找函数进行(二分)查找
15、 先调用按房号排序函数进行排序 再调用按房号查找函数进行(二分)查找 }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;
16、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) 和 panduan
17、2(ch) 函数。 ②在插入和删除模块中,显示学生的信息的下面总是有主界面,经过调试,运用 system("cls") 函数清屏后,显示的只有学生的信息了,再按键即可返回主界面。 ③本程序多次运用了 disp() 、 menu() 、 system("cls") 、 fflush(stdin) 等函数,经过 多次调试,已经很好的控制了显示的学生信息与主界面的转换。 ④通过本次课程设计,对线性表、冒泡排序、二分查找的应用有了更深入的了解。 四、用户手册 首先, 运行程序进入 “欢迎进入宿舍管理查询系统” 界面, 然后进入线性表创建界面中, 输入学生的信息,创建好学生信息以后单击任意
18、键则进入操作界面(主界面) ,然后可按键 进行操作。 单击数字键“ 1”,则为按姓名排序 单击数字键“ 3”,则为按房号排序 单击数字键“ 5”,则为按学号查找 单击数字键“ 7”,则为按学号插入 系统中有如下关键词: 单击数字键“ 2”,则为按学号排序 单击数字键“ 4”,则为按姓名查找 单击数字键“ 6”,则为按学号查找 单击数字键“ 8”,则为按学号删除 提示:当输入的数字键为 。时,退出操作; 请输入数字键(1~8为操作键); 请按任意键进入主界面。 五、测试结果 (1)欢迎界面 I "。丸我的塞科库VDoCurnents'CFrwVFEE pkhengj
19、aj.ticc-' IHHHfIWHHHHHWHHHHHHHttHHWHHf欢迎进入 盾舌管理查询 系g充■ = «蕾・『有M■产餐有・・修・・・・¥・・ 请按任意键开始操作n (2)按任意键进入线性表的创建界面,并输入数据,开始创建 *****1**************1******?^ 始创 建线’性表例修苴 * “防百例片有词 * MiWX * MMX MME Bi Mi 生# 学浏:1:10 S名口于手 第普看 为入AJ n 否批纸怖大 (3)按操作键选择操作 ♦ " 生若南 DocnmBnfs'i 匚-FKee\Tennp\c heng 想白法”
20、*************** 请技键途择操作 *****»«•»■»*»*■»■***■ 1按姓名排序 3按信号排序 5技学号查找 7按学号插入 Z按学号排序 4按姓名查找 6按房号查找 6按学号删除 退出操作 半. (4)按姓名排序 匕,找的黄科1军'LAocuEEntsTL -卜『亡七* I rmpXchengxu.EKe 按姓名排序; 姓名 学号 房号 1 102 孙叔 6 231 周瑜 3 124 上按任意键进入主界面: (5)按学号排序 B .口 科
21、我更懂 Af?\Uccu rrrenta^'lhrMXl EmpVcJiengxu.eKe'' 技学号排序; 姓名 学号 房号 划章 1 102 同趟 3 124 a枚 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 按姓名查找一一
22、-〉请输入要查找的姓名:刘备 查找成功——> 谩学生信息为■ 隹名 孚号 房号 包董 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 用
23、
人名曾可 标姓"L十房
(11)按学号删除
懒嬲料T
刘备 1 102
是否健续删除?
24、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(" *************** 请按键选择操作 *****
25、********** *\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(" 提示 :当输
26、入的数字键为 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(" 请按任意键进入主界面 :");
27、 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(" 请输入学号 :"); sc
28、anf("%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;
29、 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++;
30、
printf("\n");
printf(" 是否继续输入 ?
31、("\n");
printf(" 是否继续输入 ?
32、i]=l.elem[j];
l.elem[j]=temp;
}
}
void sort2(linklist &l)// 按学号排序(采用冒泡排序)
{
int i,j;
stu temp;
for(i=0;i
33、nt i,j;
stu temp;
for(i=0;i 34、;i++)
printf("%-15s %-3d %5d\n",l.elem[i].name,l.elem[i].num,l.elem[i].room);
}
void print2(linklist &l,int mid) //打印查找到的学生信息
{
printf(" 查找成功 > 该学生信息为 :\n");
printf(" 姓名 学号 房号 \n");printf("\n");
printf("%-15s %-5d %-5d\n",l.elem[mid].name,l.elem[mid].num,l.elem[mid].room);
}
int panduan1(c 35、har ch) //判断是否继续查找
{
scanf("%c",&ch);
printf(" 是否继续查找 ? 36、);
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( 37、" 按房号查找 > 请输入要查找的房号 :");
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)) // 调用判断函数 1
chazhao3(l);
else {
system("cls") 38、;
menu();
}
else
{
if(panduan2(ch)) //调用判断函数 2
chazhao3(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(" 按学号查找 > 39、请输入要查找的学号 :");
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;
else
high=mid-1;
}
if(flag==1)
{
print2(l,mid);
if(panduan1(ch))
chazhao2(l);
else
{ system("cls"); menu();
}
}
el 40、se
{ 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);
41、
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;
else
high=mid-1;
}
if(flag==1)
{
print2(l,mid); //打印查找到的学生的信息 if(panduan1(ch)) chazhao1(l); else {
system("cls"); menu();
}
}
el 42、se
{ 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);
43、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;i 44、].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(" 是否继续插入 ? 45、'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 46、%7d\n",l.elem[i].name,l.elem[i].num,l.elem[i].room); k=i;
for(j=k;j 47、'y') Delete(l);
else system("cls");
}
int main() //主函数
{
linklist l; //定义线性表 l
init(l); //调用初始化函数
char ch;
system("color a");
printf("\n");
printf("
*************************
欢迎进入宿舍管理查询系统
************************
*\n");
printf("\n");
printf(" 请按任意键开始操作 :");
scanf("%c",&ch);
syste 48、m("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");
pr 49、int1(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 50、==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: 51、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 月。
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专题党课讲稿:以高质量党建保障国有企业高质量发展
- 廉政党课讲稿材料:坚决打好反腐败斗争攻坚战持久战总体战涵养风清气正的政治生态
- 在新录用选调生公务员座谈会上和基层单位调研座谈会上的发言材料
- 总工会关于2025年维护劳动领域政治安全的工作汇报材料
- 基层党建工作交流研讨会上的讲话发言材料
- 粮食和物资储备学习教育工作部署会上的讲话发言材料
- 市工业园区、市直机关单位、市纪委监委2025年工作计划
- 检察院政治部关于2025年工作计划
- 办公室主任2025年现实表现材料
- 2025年~村农村保洁员规范管理工作方案
- 在深入贯彻中央8项规定精神学习教育工作部署会议上的讲话发言材料4篇
- 开展深入贯彻规定精神学习教育动员部署会上的讲话发言材料3篇
- 在司法党组中心学习组学习会上的发言材料
- 国企党委关于推动基层党建与生产经营深度融合工作情况的报告材料
- 副书记在2025年工作务虚会上的发言材料2篇