C语言——宿舍管理查询系统设计

数据结构——宿舍管理查询系统设计

算法实现:

宿舍管理查询系统设计
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")函数,是这次设计中的一个意外学习到函数,它可以改变运行界面的背景颜色和字体颜色,对程序运行没有太大影响,但改变了以往运行界面黑底白字的结果,使得运行界面颜色更加丰富

求助大佬:

程序运行后功能基本都能实现,但只有学生姓名为两个字时才能正确运行程序,出现正确的结果,试过将名字定为三个字,但程序就出现问题

 

 


猜你喜欢

转载自blog.csdn.net/qq_41079666/article/details/79906929
今日推荐