数据结构课设——宿舍管理查询软件(文件读取与查找排序)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DEAR_CXN/article/details/86556155

问题描述

任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求:

(1)采用交互工作方式

(2)可以增加、删除、修改信息

(3)建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序(选择、快速排序、堆排序等任选一种)

(4)查询: a.按姓名查询 ;b.按学号查询 ;c按房号查询

(5)打印任一查询结果(可以连续操作)

算法思想

从文件中读入信息到结构体;根据学号查找学生信息使用折半查找,它的前提是序列有序,所以要在函数中调用按学号排序函数;根据姓名查找学生信息使用设置监视哨的顺序查找,设置第0个元素为哨兵,从后往前进行查找;根据房号查找学生信息采用从后往前顺序查找的方法;根据学号排序采用的是冒泡排序,用一个变量标记某一趟排序是否发生交换,不断进行比较和交换,直到不需要交换为止;根据姓名排序采用堆排序,沿key值较大的孩子结点向下筛选,将其建成升序的大根堆;根据房号排序采用直接插入排序,记录逐个后移,直到找到插入位置;增加学生信息即是直接输入新的信息,加到结构体数组的最后面;删除学生信息为找到该学生,后面的学生信息往前移一个;修改学生信息为找到该学生在数组中的位置,然后重新输入该位置的学生信息。

算法设计

1、菜单void menu()——输出功能选择。

2、打印全部信息void Allprint(Student &Stu)。

3、读信息void Read(Student &Stu)——从文件中读入信息到结构体。

4、按学号排序void NumSort(Student &Stu)——冒泡排序,用一个变量标记某一趟排序是否发生交换,不断进行比较和交换,直到不需要交换为止。

5、调整堆void HeapAdjust(Student &Stu,int s,int m)——将堆调整成大根堆。

6、建初堆void CreatHeap(Student &Stu)——调用调堆函数,调成大根堆。

7、按姓名排序void NameSort(Student &Stu)——堆排序,不断地把堆顶元素和未经排序子序列中最后一个元素做交换。

8、按房号排序void Housesort(Student &Stu)——直接插入排序,记录逐个后移,直到找到插入位置。

9、根据姓名查找void NameSearch(Student &Stu)——使用设置监视哨的顺序查找,设置第0个元素为哨兵,从后往前进行查找。

10、根据学号查找void NumSearch(Student &Stu)——折半查找的前提是序列有序,所以要在函数中调用按学号排序函数。

11、根据房号查找void HouseSearch(Student &Stu)——从后往前顺序查找。

12、增加学生信息void AddStu(Student &Stu)——即是直接输入新的信息,加到结构体数组的最后面。

13、删除学生信息void DeleteStu(Student &Stu)——找到该学生,后面的学生信息往前移一个。

14、修改学生信息void ChangeStu(Student &Stu)——找到该学生在数组中的位置,然后重新输入该位置的学生信息。

15、主函数int main()——使用while循环和switch对功能进行调用,使用清屏函数,使界面更美观。

代码实现

#include<stdio.h>//宿舍管理查询软件
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
typedef struct{
    char num[4];
    char name[10];
    char house[4];
}StuType;//学生信息结构体
typedef struct{
    StuType S[15];
    int stunum;
}Student;//学生信息表
void menu(){//菜单
    cout<<"***************学生信息管理系统***************"<<endl;
    cout<<"               1、根据学号查找学生"<<endl;
    cout<<"               2、根据姓名查找学生"<<endl;
    cout<<"               3、根据房号查找学生"<<endl;
    cout<<"               4、根据学号排序输出"<<endl;
    cout<<"               5、根据姓名排序输出"<<endl;
    cout<<"               6、根据房号排序输出"<<endl;
    cout<<"               7、增加信息"<<endl;
    cout<<"               8、删除信息"<<endl;
    cout<<"               9、修改信息"<<endl;
    cout<<"               10、退出"<<endl;
    cout<<"**********************************************"<<endl;
    cout<<"请选择...\n";
}
void Allprint(Student &Stu){//打印全部信息
    printf("学号\t姓名\t房号\n");
    for (int i =1;i<=Stu.stunum;i++)
	{
        printf("%s\t%s\t%s\n",Stu.S[i].num,Stu.S[i].name,Stu.S[i].house);
	}
}
void Read(Student &Stu){//从文件中读入信息到结构体
    FILE *fp=fopen("C:\\Users\\chenxianning\\Documents\\c c++\\数据结构课设\\宿舍管理.txt","rb");
    if(fp==NULL){//判断文件是否可以打开
        cout<<"can not open the file"<<endl;
        exit(0);
    }
    for(int i=1;;i++){
        int n=fscanf(fp,"%s%s%s",Stu.S[i].num,Stu.S[i].name,Stu.S[i].house);
        if(n==-1){//文件读入结束
            Stu.stunum=i-1;
            fclose(fp);
            break;
        }
    }
    fclose(fp);//关闭文件
}
void NumSort(Student &Stu){ //冒泡排序
    int m=Stu.stunum;
    int flag=1;//标记某一趟排序是否发生交换
    int j;
    StuType t;
    while((m>0)&&(flag==1)){//flag置为0,如果本次没有发生交换,就不会执行下一趟
        flag=0;
        for(j=1;j<m;j++)
            if(strcmp(Stu.S[j].num,Stu.S[j+1].num)>0)
            {
                flag=1;
                t=Stu.S[j];//交换前后记录
                Stu.S[j]=Stu.S[j+1];
                Stu.S[j+1]=t;
            }
        --m;
    }

}
void HeapAdjust(Student &Stu,int s,int m){//调整堆
    StuType rc=Stu.S[s];
    for(int j=2*s;j<=m;j*=2){//沿key值较大的孩子结点向下筛选
        if(j<m&&strcmp(Stu.S[j].name,Stu.S[j+1].name)<0)++j;//j为key值较大的记录的下标
        if(strcmp(rc.name,Stu.S[j].name)>=0)break;//rc应插在位置s上
        Stu.S[s]=Stu.S[j];
        s=j;
    }
    Stu.S[s]=rc;//插入
}
void CreatHeap(Student &Stu){//建初堆
    int n=Stu.stunum;//建成大根堆
    for(int i=n/2;i>0;--i)
        HeapAdjust(Stu,i,n);
}
void NameSort(Student &Stu){//堆排序
    CreatHeap(Stu);
    StuType t;
    for(int i=Stu.stunum;i>1;--i){
        t=Stu.S[1];//把堆顶元素和未经排序子序列中最后一个元素做交换
        Stu.S[1]=Stu.S[i];
        Stu.S[i]=t;
        HeapAdjust(Stu,1,i-1);
    }
    Allprint(Stu);
}
void Housesort(Student &Stu){//直接插入排序
    int i,j;
    for(i=2;i<=Stu.stunum;++i){
        if(strcmp(Stu.S[i].house,Stu.S[i-1].house)<0)
        {
            Stu.S[0]=Stu.S[i];
            Stu.S[i]=Stu.S[i-1];
            for(j=i-2;strcmp(Stu.S[0].house,Stu.S[j].house)<0;--j)
                Stu.S[j+1]=Stu.S[j];
            Stu.S[j+1]=Stu.S[0];
        }
    }
    Allprint(Stu);
}
void NameSearch(Student &Stu){//设置监视哨的顺序查找
    cout<<"请输入该学生的姓名:";
    char key[4];
    cin>>key;
    int nn,i;
    strcpy(Stu.S[0].name,key);//哨兵
    for(i=Stu.stunum;;--i)//从后往前找
        if(strcmp(Stu.S[i].name,Stu.S[0].name)==0)
           {
                nn=i;
                break;
           }
    nn=i;
    if(i==0)
    {
         cout<<"查无此人!"<<endl;
         return;
    }
    cout<<"查询成功!"<<endl;
    cout<<"学号:"<<Stu.S[nn].num<<"  姓名:"<<Stu.S[nn].name<<"  房号:"<<Stu.S[nn].house<<endl;
}
void NumSearch(Student &Stu){//折半查找
    NumSort(Stu);
    cout<<"请输入该学生的学号:";
    char key[4];
    cin>>key;
    int nn=0;
    int low,high,mid;
    low=1;//置查找区间初值
    high=Stu.stunum;
    while(low<=high)
    {
        mid=(high+low)/2;
        if(strcmp(key,Stu.S[mid].num)==0)//找到待查元素
        {
            nn=mid;
            break;
        }
        else if(strcmp(key,Stu.S[mid].num)<0)//继续在前一子表进行查找
            high=mid-1;
        else//继续在后一子表进行查找
            low=mid+1;
    }
    cout<<"查询成功!"<<endl;
    cout<<"学号:"<<Stu.S[nn].num<<"  姓名:"<<Stu.S[nn].name<<"  房号:"<<Stu.S[nn].house<<endl;
    return;
}
void HouseSearch(Student &Stu){//顺序查找
    cout<<"请输入该学生的房号:";
    char key[4];
    cin>>key;
    int nn,i;
    for(i=Stu.stunum;;--i)//从后往前找
        if(strcmp(Stu.S[i].house,key)==0)
           {
                nn=i;
                break;
           }
    nn=i;
    if(i==0)
    {
         cout<<"查无此人!"<<endl;
         return;
    }
    cout<<"查询成功!"<<endl;
    cout<<"学号:"<<Stu.S[nn].num<<"  姓名:"<<Stu.S[nn].name<<"  房号:"<<Stu.S[nn].house<<endl;
}
void AddStu(Student &Stu){
    cout<<"请依次输入该学生的学号、姓名、房号:";
    char num[4];
    char name[10];
    char house[4];
    cin>>num>>name>>house;
    Stu.stunum++;
    strcpy(Stu.S[Stu.stunum].num,num);
    strcpy(Stu.S[Stu.stunum].name,name);
    strcpy(Stu.S[Stu.stunum].house,house);
    cout<<"添加成功!"<<endl;
}
void DeleteStu(Student &Stu){
    cout<<"请输入该学生的学号:";
    char key[4];
    cin>>key;
    int nn,i;
    strcpy(Stu.S[0].num,key);//哨兵
    for(i=Stu.stunum;;--i)//从后往前找
        if(strcmp(Stu.S[i].num,Stu.S[0].num)==0)
           {
                nn=i;
                break;
           }
    nn=i;
    if(i==0)
    {
         cout<<"查无此人!"<<endl;
         return;
    }
    cout<<"学号:"<<Stu.S[nn].num<<"  姓名:"<<Stu.S[nn].name<<"  房号:"<<Stu.S[nn].house<<endl;
    cout<<"确定删除请按1,放弃删除请按0..."<<endl;
    int q;
    cin>>q;
    if(q==0)
        return;
    else
        for(int i=nn;i<Stu.stunum;i++)
            Stu.S[i]=Stu.S[i+1];
    Stu.stunum--;
    cout<<"删除成功!"<<endl;
}
void ChangeStu(Student &Stu){
    cout<<"请输入该学生的学号:";
    char key[4];
    cin>>key;
    int nn,i;
    strcpy(Stu.S[0].num,key);//哨兵
    for(i=Stu.stunum;;--i)//从后往前找
        if(strcmp(Stu.S[i].num,Stu.S[0].num)==0)
           {
                nn=i;
                break;
           }
    nn=i;
    if(i==0)
    {
         cout<<"查无此人!"<<endl;
         return;
    }
    cout<<"请依次输入该学生修改后的学号、姓名、房号:";
    cin>>Stu.S[nn].num>>Stu.S[nn].name>>Stu.S[nn].house;
    cout<<"修改成功!"<<endl;
}
int main(){
    Student Stu;
    Read(Stu);
    int m;
    while(m)
    {
        menu();
        cin>>m;
        switch(m){
        case 1:
            NumSearch(Stu);
            break;
        case 2:
            NameSearch(Stu);
            break;
        case 3:
            HouseSearch(Stu);
            break;
        case 4:
            NumSort(Stu);
            Allprint(Stu);
            break;
        case 5:
            NameSort(Stu);
            break;
        case 6:
            Housesort(Stu);
            break;
        case 7:
            AddStu(Stu);
            break;
        case 8:
            DeleteStu(Stu);
            break;
        case 9:
            ChangeStu(Stu);
            break;
        case 10:
            cout<<"感谢使用!"<<endl;
            return 0;
        default:
            cout<<"没有该选项!"<<endl;
            break;
        }
        system("pause");
        system("cls");
    }
    return 0;
}
展开阅读全文

没有更多推荐了,返回首页