数据结构——宿舍管理查询系统设计
算法实现:
宿舍管理查询系统设计
1) 任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求:
A. 采用交互工作方式
B. 建立数据文件 ,数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、插入排序等任选一种)
2) 查询菜单: (用二分查找实现以下操作)
A. 按姓名查询
B. 按学号查询
C. 按房号查询
3) 打印任一查询结果(可以连续操作)
程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //使用字符串
#define X 40 //现性表存储空间的初始分配量
#define increase 10 //现性表存储空间的分配量增量
int f,t=0; //定义全局变量
typedef struct
{
int xuehao;
int fanghao;
char name[20]; //字符串存放姓名
}stu;
stu stud;
typedef struct
{
int length; //长度
int listsize; //占用内存空间
stu*elem; //引用对象stu的数据成员elem
}linklist;
//线性表初始化
void init(linklist & l) //&指针应用,取变量地址
{
l.length=0;
l.listsize=X;
l.elem=(stu*)malloc(X*sizeof(stu)); //指针使用要前初始化
}
//操作菜单
void caozuo()
{
printf(" 请选择操作:\n\n");
printf("\n");
printf(" 1.姓名排序 2.学号排序 3.房号排序 \n\n");
printf(" 4.姓名查找 5.学号查找 6.房号查找 \n\n");
printf(" 7.学号插入 8.学号删除 \n\n ");
printf(" 输入0,退出操作\n");
if(t==1)
{
printf("输入数字:\n");
scanf("%d",&f);
if(f<0 && f>9)
{
system("cls"); //清除屏幕上之前显示内容
printf("\n");
printf("重新输入:\n");
caozuo();
}
}
}
//返回主界面
void disp()
{
char c;
fflush(stdin);
printf("\n按任意键进入主界面:");
scanf("%c",&c);
system("cls");
}
//无学生记录返回主界面
void panduan3()
{
printf("无学生记录\n");
disp();
caozuo();
}
//输入学生信息
void shuru(linklist l)
{
printf("输入姓名:\n");
fflush(stdin); //清除数据,得到正确的输入数据
gets(stud.name);
printf("输入学号:\n");
fflush(stdin);
scanf("%d",&stud.xuehao);
printf("输入房号:\n");
scanf("%d",&stud.fanghao);
}
//创建学生类信息表
void chuangjian(linklist & l)
{
if(l.length>=l.listsize) //判断是否超过初始值,超过,另行分配
{
stu*newbase;
newbase=(stu*)realloc(l.elem,(X+increase)*sizeof(stu));
l.elem=newbase;
l.listsize+=increase;
}
int i=2;
char ch;
printf("\n");
printf("输入第一个学生信息\n");
shuru(l);
ch=getchar();
strcpy(l.elem[l.length].name,stud.name);
l.elem[l.length].xuehao=stud.xuehao;
l.elem[l.length].fanghao=stud.fanghao;
l.length++;
printf("是否继续Y/N:");
scanf("%c",&ch);
printf("\n");
while(ch=='Y')
{
printf("输入第%d个学生信息\n",i);
shuru(l);
strcpy(l.elem[l.length].name,stud.name);
l.elem[l.length].xuehao=stud.xuehao;
l.elem[l.length].fanghao=stud.fanghao;
l.length++;
i++;
ch=getchar();
printf("\n是否继续:Y/N:");
scanf("%c",&ch);
printf("\n");
}
if(ch=='N')system("cls");
}
//房号排序
void sort3(linklist & l)
{
int i,j;
stu temp;
for(i=0;i<l.length-1;i++)
for(j=i+1;j<l.length;j++)
if(l.elem[i].fanghao>l.elem[j].fanghao)
{
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;i<l.length-1;i++)
for(j=i+1;j<l.length;j++)
if(l.elem[i].xuehao>l.elem[j].xuehao)
{
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;i<l.length-1;i++)
for(j=i+1;j<l.length;j++)
if(l.elem[i].name>l.elem[j].name)
{
temp=l.elem[i];
l.elem[i]=l.elem[j];
l.elem[j]=temp;
}
}
//打印学生信息
void print1(linklist & l)
{
int i;
printf("\n");
printf("姓名 学号 房号\n");
for(i=0;i<l.length ;i++)
printf("%-7s %10d %10d\n",l.elem[i].name,l.elem[i].xuehao,l.elem[i].fanghao);
}
//打印找到的学生的信息
void print2(linklist & l,int mid)
{
printf("查找成功 学生信息为\n");
printf("姓名 学号 房号\n");
printf("%-7s %10d %10d\n",l.elem[mid].name,l.elem[mid].xuehao,l.elem[mid].fanghao);
}
//判断是否继续查找
int panduan1(char ch)
{
scanf("%c",&ch);
printf("是否继续<Y/N>:");
scanf("%c",&ch);
if(ch=='Y')
{
system("cls");
return(1);
}
else
return 0;
}
//判断不存在是否继续查找
int panduan2(char ch)
{
scanf("%c",&ch);
printf("学生不存在,是否继续<Y/N>:");
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;
printf("\n按房号查找 输入房号:");
scanf("%d",&m);
printf("\n");
while(low<=high)
{
mid=(low+high)/2;
if(m==l.elem[mid].fanghao)
{
flag=1;
break;
}
else if(m>l.elem[mid].fanghao)
low=mid+1;
else
high=mid-1;
}
if(flag==1)
{
print2(l,mid);
if(panduan1(1)) //调用判断函数
chazhao3(l);
else
{
system("cls");
caozuo();
}
}
else
{
if(panduan2(1))
chazhao3(l);
else
{
system("cls");
caozuo();
}
}
}
}
//按学号查找
void chazhao2(linklist & l)
{
if(l.length==0)
{
printf("无学生记录\n");
disp();
caozuo();
}
else
{
int low=0,high=l.length,mid,flag=0; //flag=1 查找成功
int n;
printf("\n按学号查找 输入学号:");
scanf("%d",&n);
printf("\n");
while(low<=high)
{
mid=(low+high)/2;
if(n==l.elem[mid].xuehao)
{
flag=1;
break;
}
else if(n>l.elem[mid].xuehao)
low=mid+1;
else
high=mid-1;
}
if(flag==1)
{
print2(l,mid);
if(panduan1(1))
chazhao2(l);
else
{
system("cls");
caozuo();
}
}
else
{
if(panduan2(1))
chazhao3(l);
else
{
system("cls");
caozuo();
}
}
}
}
//按姓名查找
void chazhao1(linklist & l)
{
if(l.length==0)
panduan3();
else
{
int low=0,high=l.length,mid,flag=0; //flag=1 查找成功
printf("\n按姓名查找 输入姓名:");
char a[15];
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;
else
high=mid-1;
}
if(flag==1)
{
print2(l,mid);
if(panduan1(1))
chazhao1(l);
else
{
system("cls");
caozuo();
}
}
else
{
if(panduan2(1))
chazhao1(l);
else
{
system("cls");
caozuo();
}
}
}
}
//按学号插入
void insert(linklist & l)
{
int i,j,k;
char ch;
printf("\n插入学生信息为:");
printf("\n姓名:");
fflush(stdin);
gets(stud.name);
printf("学号");
fflush(stdin);
scanf("%d",&stud.xuehao);
printf("输入房号\n");
scanf("%d",&stud.fanghao);
if(l.length==0)
{
strcpy(l.elem[l.length].name,stud.name);
l.elem[l.length].xuehao=stud.xuehao;
l.elem[l.length].fanghao=stud.fanghao;
}
for(i=0;i<l.length;i++)
{
if(stud.xuehao<l.elem[i].xuehao)
{
k=i;
for(j=l.length;j>k;j--)
l.elem[j]=l.elem[j-1];
strcpy(l.elem[k].name,stud.name);
l.elem[k].xuehao=stud.xuehao;
l.elem[k].fanghao=stud.fanghao;
break;
}
else
{
strcpy(l.elem[l.length].name,stud.name);
l.elem[l.length].xuehao=stud.xuehao;
l.elem[l.length].fanghao=stud.fanghao;
}
}
l.length++;
fflush(stdin);
printf("\n是否继续插入:Y/N");;
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.xuehao);
for(i=0;i<l.length;i++)
{
if(stud.xuehao==l.elem[i].xuehao)
{
printf("该学生的信息为:\n");
printf("\n");
printf("%-15s %-3d %7d\n",l.elem[i].name,l.elem[i].xuehao,l.elem[i].fanghao);
k=i;
for(j=k;j<l.length-1;j++)
l.elem[j]=l.elem[j+1];
printf("\n");
break;
}
}
if(i>=l.length) printf("该学生不存在\n");
if(k>=0)l.length--;
fflush(stdin);
printf("\n");
printf("是否继续删除?<Y/N>:");
scanf("%c",&ch);
system("cls");
if(ch=='y') Delete(l);
else system("cls");
}
//主函数
void main()
{
linklist l; //线性表定义
init(l); //调用初始化函数
char ch;
system("color fa");
printf("\n 欢迎进入界面\n\n\n");
printf("请按任意键进行操作");
scanf("%c",&ch);
system("cls");
chuangjian(l); //调用创建线性表函数
system("cls");
t=1;
caozuo(); //调用主菜单函数
while(f!=0)
{
system("cls");
switch(f)
{
case 1:
sort1(l); //调用按姓名排序函数
printf("\n");
if(l.length==0)
{
printf("已无学生记录\n");
printf("\n");
disp();
caozuo();
}
else
{
printf("按姓名排序:\n");
print1(l);
disp(); //调用返回主界面
caozuo();
}
break;
case 2:
sort2(l); //调用按学号排序函数
printf("\n");
if(l.length==0)
{ printf("已无学生记录\n");
printf("\n");
disp();
caozuo();
}
else
{
printf("按学号排序:\n");
print1(l);
disp();
caozuo();
}
break;
case 3:
sort3(l); //调用按房号排序函数
printf("\n");
if(l.length==0)
{
printf("已无学生记录\n");
printf("\n");
disp();
caozuo();
}
else
{
printf("按房号排序:\n");
print1(l);
disp();
caozuo();
}
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();
caozuo();
break;
case 8:
Delete(l); //调用删除函数
if(l.length==0)
{
printf("\n");
printf("学生记录已被删除完\n");
printf("\n");
disp();
caozuo();
}
else
{
printf("显示删除后的学生信息:\n");
print1(l);
disp();
caozuo();
}
break;
}
}
}
总结:
这是一个比较繁琐的程序,将很多的知识糅杂在一起:
1.交互工作:程序全部运行后可选择继续运行还是结束运行,可以给一个指令进行一个操作,实现连续操作。
2.建立数据文件:程序中未给信息数据,所以要编写具有信息输入功能的模块,在这里运用线性表来存储信息数据。
3.将数据文件按关键字(姓名 学号 房号)进行冒泡排序。
4.运用二分查找实现姓名查询、学号查询、和房号查询。
5.打印:(1)对输入信息数据的打印显示
(2)对进行操作后的数据信息的打印显示
6.在设计过程中考虑有学生离校,设计了删除功能。
7.可能有新同学入校,所以设计了插入功能
8.新学到的函数:
(1)system(“cls”)它是一个清除屏幕显示内容的函数,有了这个函数才使得屏幕只显示自己所需要的信息,而不是所有操作步骤、信息都显示,提高了运行结果显示的美观性。
(2)fflush(stdin)函数,有清空输入的作用。在输入信息时起到了巨大作用,保证了后续信息的正确输入存储。
system("color fa")函数,是这次设计中的一个意外学习到函数,它可以改变运行界面的背景颜色和字体颜色,对程序运行没有太大影响,但改变了以往运行界面黑底白字的结果,使得运行界面颜色更加丰富
求助大佬:
程序运行后功能基本都能实现,但只有学生姓名为两个字时才能正确运行程序,出现正确的结果,试过将名字定为三个字,但程序就出现问题