、实验目的
掌握运用数据结构两种基本运算查找和排序,并能通过其能解决应用问题。
二、实验软硬件要求
1、VC++ 6.0
三、实验预习
查找排序相关算法
四、实验内容(实验步骤、测试数据等)
为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式,其流程如下:
开 始
建立数据文件
数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、快速等任选一种)
查询菜单: (用二分查找实现以下操作)
1.按姓名查询
2.按学号查询
3.按房号查询
打印任一查询结果(可以连续操作)
运行结果:
实验体会
(可以记录C语言中薄弱的部分,便于课后复习巩固,每次实验体会需要写两行。)
该章节上课掌握不够牢固,学习和理解的冒泡排序法的基本思想和运用,对其的熟练程度还不高,需要进一步的强化。
六、源代码或重要代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef int KeyType;
typedef char InfoType[32];
typedef struct
{
KeyType key;
InfoType name;
int number;
int house_number;
}NodeType;
typedef struct
{
NodeType data[MAX];
int length;
}SqList;
int pr(SqList R,int mid)
{
putchar('\n');
printf("学号\t 姓名 \t 房号 \t \n");
printf("%d \t %s \t %d \t",R.data[mid].number,R.data[mid].name,R.data[mid].house_number);
putchar('\n');
return 0;
}
void Sort_name(SqList &R)
{
int i,j;
NodeType temp;
for(i=0;i<R.length-1;i++)
for(j=i+1;j<R.length;j++)
if(strcmp(R.data[i].name,R.data[j].name)>0)
{
temp=R.data[i];
R.data[i]=R.data[j];
R.data[j]=temp;
}
}
void Sort_number(SqList &R)
{
int i,j;
NodeType temp;
for(i=0;i<R.length-1;i++)
for(j=i+1;j<R.length;j++)
if(R.data[i].number>R.data[j].number)
{
temp=R.data[i];
R.data[i]=R.data[j];
R.data[j]=temp;
}
}
void Sort_house_number(SqList &R)
{
int i,j;
NodeType temp;
for(i=0;i<R.length-1;i++)
for(j=i+1;j<R.length;j++)
if(R.data[i].house_number>R.data[j].house_number)
{
temp=R.data[i];
R.data[i]=R.data[j];
R.data[j]=temp;
}
}
int BinSearch(SqList &R)
{
int low,high,mid,t,flag;
char name_search[32];
int number_search,house_number_search;;
do{
printf("\n查询菜单\n");
printf("1.按姓名查询 \n");
printf("2.按学号查询 \n");
printf("3.按房号查询\n");
printf("0.退出查询\n");
scanf("%d",&t);
flag=0;
low=0,high=R.length-1;
switch(t)
{
case 1:
printf("请输入要查询的姓名:");
scanf("%s",name_search);
Sort_name(R);
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(R.data[mid].name,name_search)==0)
{
pr(R,mid);
flag=1;
break;
}
if(strcmp(R.data[mid].name,name_search)>0)
high=mid-1;
else low=mid+1;
}
if(flag==0)
printf("\n未找到该信息\n");break;
case 2:
printf("请输入要查询的学号:");
scanf("%d",&number_search);
Sort_number(R);
while(low<=high)
{
mid=(low+high)/2;
if(R.data[mid].number==number_search)
{
pr(R,mid);
flag=1;
break;
}
if(R.data[mid].number>number_search)
high=mid-1;
else low=mid+1;
}
if(flag==0)
printf("\n未找到该信息\n");break;
case 3:
printf("请输入要查询的床号:");
scanf("%d",&house_number_search);
Sort_house_number(R);
while(low<=high)
{
mid=(low+high)/2;
if(R.data[mid].house_number==house_number_search)
{
pr(R,mid);
flag=1;
low=mid+1;
}
if(R.data[mid].house_number>house_number_search)
high=mid-1;
else low=mid+1;
}
if(flag==0)
printf("\n未找到该信息\n");break;
case 0:
printf("\退出查询\n");break;
default :
printf("\n ERROR \n");break;
}
}while(t!=0);
return 0;
}
void create(SqList &R)
{
int number,house_number;
char name[32];
printf("\n添加数据\n");
printf("学号 \t,姓名 \t,房号 \t \n");
scanf("%d %s %d",&number,&name,&house_number);
R.data[R.length].number=number;
strcpy(R.data[R.length].name,name);
R.data[R.length].house_number=house_number;
R.length++;
}
void show(SqList &R)
{
int i;
printf("学号 \t姓名 \t房号 \t");
for(i=0;i<R.length;i++)
{
putchar('\n');
printf("%d \t %s \t %d \t",R.data[i].number,R.data[i].name,R.data[i].house_number);
}
}
void choose()
{
printf("\n1.添加数据\n");
printf("2.展示数据\n");
printf("3.查找数据\n");
printf("0.退出\n");
}
void order(SqList &R)
{
int n;
choose();
printf("请问你想选择的功能\n");
scanf("%d",&n);
switch(n)
{
case 1: create(R);order(R);break;
case 2: show(R);order(R);break;
case 3: BinSearch(R);order(R);break;
case 0: exit(0);break;
default:order(R);
}
order(R);
}
int main()
{
SqList R;
R.length=0;
order(R);
return 0;
}