文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言实现学生宿舍信息管理系统的方法

2023-06-29 13:24

关注

这篇文章主要介绍“C语言实现学生宿舍信息管理系统的方法”,在日常操作中,相信很多人在C语言实现学生宿舍信息管理系统的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言实现学生宿舍信息管理系统的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、问题陈述

宿舍对于大学生在校生活来说相当于家的存在,而宿舍管理又是学校后勤管理的重要环节,如何直观的了解宿舍的入住情况和每位同学的住宿位置是提高工作效率的重要课题,根据我们所学的C语言和数据结构课程中有关链表的内容,为宿舍管理人员编写宿舍管理查询软件,就可以轻松满足实现上述需求。

任务:

为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求:
1)、采用交互工作方式
2)、可按关键字(姓名、学号、房号)进行排序

查询菜单: (用二分查找实现以下操作)
1)、按姓名查询
2)、按学号查询
3)、按房号查询

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

二、概要设计

2.1 概要简述

根据系统要求,即本系统具有信息的录入,显示,排序显示、查找,插入、删除、结束程序等功能,先设计出详细的系统流程图,然后将源代码输入程序,进行编译调试即可。
程序总体分10个项目:输入记录、显示记录、按姓名排序并显示、按房间号排序并显示 、按学号排序并显示 、按姓名查找并显示 、按房间号查找并显示 、按学号查找并显示、插入一条记录按学号排序并显示以及结束程序。

2.2 线性表存储结构表示

typedef struct {    char name[20];    int num;            //学号和房号都为整型    int room;} stu;typedef struct {    int length; //当前长度    stu *elem;  //存储空间基址    int listsize;  //当前分配的存储容量} linklist;

2.3 详细设计

1 系统流程图

C语言实现学生宿舍信息管理系统的方法

2 三种排序方法及二分查找法

2.1 冒泡排序(按姓名排序)

//按姓名排序(采用冒泡排序)void sort1(linklist &L) {     int i, j;    stu temp;    for (i = 0; i<L.length - 1; i++)        for (j = 0; j<L.length-1-i; j++)            if (strcmp(L.elem[j].name, L.elem[j+1].name)>0) {                temp = L.elem[j];                L.elem[j] = L.elem[j+1];                L.elem[j+1] = temp;            }}

2.2 折半插入排序(按学号排序)

//按学号排序(采用折半插入排序)void sort2(linklist &L) {     int i, j, mid, low, high;    stu temp;    for (i = 1; i < L.length; i++) {        if(L.elem[i].num<L.elem[i-1].num) {            temp = L.elem[i];            low = 0;            high = i-1;            while (low <= high) {                mid = (low + high) / 2;                if (temp.num < L.elem[mid].num)                    high = mid - 1;                else                    low = mid + 1;            }            for (j = i - 1; j >= high+1; j--)                L.elem[j+1]=L.elem[j];            L.elem[high+1]=temp;        }    }}

2.3 简单选择排序(按房号排序)

//按房号排序(采用简单选择排序)void sort3(linklist &L) {     int i,j,k;    stu temp;    for(i=0; i<L.length-1; i++) {        k=i;        for(j=i+1; j<L.length; j++)            if(L.elem[j].room<L.elem[k].room)                k=j;        if(k!=i){            temp = L.elem[i];            L.elem[i] = L.elem[k];            L.elem[k] = temp;        }    }}

2.4 二分查找法(以按姓名查找为例)

//按姓名从小到大查找(采用二分查找)void search2(linklist &L) {     if (L.length == 0) {        printf("已无学生记录!\n");        Ret();        Menu();    } else {        int low = 0, high = L.length, mid, flag = 0;        printf("\n");        printf("按姓名查找-->请输入要查找的姓名:");        char a[15], ch;        scanf("%s", a);        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) {            printf("查找成功-->该学生信息为:\n");            printf("姓名       学号    房号\n");            printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);            if (Select())                search2(L);            else {                system("cls");                Menu();            }        } else {            printf("该学生不存在!");            if (Select())    search2(L);            else {                system("cls");                Menu();            }        }    }}

三、测试与运行

1 系统界面

C语言实现学生宿舍信息管理系统的方法

2 新建宿舍名单

C语言实现学生宿舍信息管理系统的方法

3 排序(以姓名排序为例)

C语言实现学生宿舍信息管理系统的方法

4 查询(以学号查询为例)

C语言实现学生宿舍信息管理系统的方法

5 插入学生信息

C语言实现学生宿舍信息管理系统的方法

6 删除学生信息

C语言实现学生宿舍信息管理系统的方法

四、代码实现

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>#define N 40 //线性表存储空间的初始分配量#define increase 10 //线性表存储空间的分配量增量int choice;  //定义全局变量typedef struct {    char name[20];    int num;            //学号和房号都为整型    int 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( "***       欢迎进入宿舍管理系统     ***\n" );    printf( "**************************************\n" );    printf( "*        1.  新建宿舍名单            *\n" );    printf( "*        2.  排序宿舍信息            *\n" );    printf( "*        3.  查询宿舍信息            *\n" );    printf( "*        4.  插入宿舍信息            *\n" );    printf( "*        5.  删除宿舍信息            *\n" );    printf( "*        0.  退出系统                *\n" );    printf( "**************************************\n" );    printf("请输入菜单(0-5):");    scanf("%d", &choice);    if (choice<0 || choice>5) {        system("cls");        printf("输入数字不对,请重新!\n");        printf("\n");        Menu();    }}//打印学生信息void Display(linklist &L) {     int i;    printf("姓名       学号    房号\n");    for (i = 0; i<L.length; i++)        printf("%-10s %-2d %5d\n", L.elem[i].name, L.elem[i].num, L.elem[i].room);}//返回主界面void Ret() {        char c;    fflush(stdin);    printf("\n");    printf("请按任意键进入主界面:");    scanf("%c", &c);    system("cls");}//创建学生信息表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;    printf("********开始创建学生信息**********\n");    printf("\n");    printf("请输入第1个学生的信息\n");    printf("请输入姓名:");    fflush(stdin);      // 清空输入缓冲区,得到正确的输入数据    gets(stud.name);    //输入一行字符串(姓名)    printf("请输入学号:");    scanf("%d", &stud.num);    printf("请输入房号:");    scanf("%d", &stud.room);    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++;    printf("\n");    printf("是否继续输入?<y/n>:");    scanf("%c", &ch);    printf("\n");    while (ch == 'y') {        printf("请输入第%d个学生的信息\n", i);        printf("请输入姓名:");        fflush(stdin);      // 清空输入缓冲区,得到正确的输入数据        gets(stud.name);    //输入一行字符串(姓名)        printf("请输入学号:");        scanf("%d", &stud.num);        printf("请输入房号:");        scanf("%d", &stud.room);        strcpy(L.elem[L.length].name, stud.name);        L.elem[L.length].num = stud.num;        L.elem[L.length].room = stud.room;        i++;        L.length=i-1;        ch = getchar();        printf("\n");        printf("是否继续输入?<y/n>:");        scanf("%c", &ch);        printf("\n");    }    if (ch == 'n')        system("cls");}//按姓名排序(采用冒泡排序)void sort1(linklist &L) {     int i, j;    stu temp;    for (i = 0; i<L.length - 1; i++)        for (j = 0; j<L.length-1-i; j++)            if (strcmp(L.elem[j].name, L.elem[j+1].name)>0) {                temp = L.elem[j];                L.elem[j] = L.elem[j+1];                L.elem[j+1] = temp;            }}//按学号排序(采用折半插入排序)void sort2(linklist &L) {     int i, j, mid, low, high;    stu temp;    for (i = 1; i < L.length; i++) {        if(L.elem[i].num<L.elem[i-1].num) {            temp = L.elem[i];            low = 0;            high = i-1;            while (low <= high) {                mid = (low + high) / 2;                if (temp.num < L.elem[mid].num)                    high = mid - 1;                else                    low = mid + 1;            }            for (j = i - 1; j >= high+1; j--)                L.elem[j+1]=L.elem[j];            L.elem[high+1]=temp;        }    }}//按房号排序(采用简单选择排序)void sort3(linklist &L) {     int i,j,k;    stu temp;    for(i=0; i<L.length-1; i++) {        k=i;        for(j=i+1; j<L.length; j++)            if(L.elem[j].room<L.elem[k].room)                k=j;        if(k!=i){            temp = L.elem[i];            L.elem[i] = L.elem[k];            L.elem[k] = temp;        }    }}//排序函数void Sort(linklist &L) {     int c;    printf("请输入排序的方式(1:按名字排序,2:按学号排序,3:按房号排序):");    scanf("%d", &c);    switch (c) {        case 1:            sort1(L);            if (L.length == 0) {                printf("已无学生记录!\n");                Ret();                Menu();            } else {                printf("按姓名排序:\n");                Display(L);                Ret();  //调用返回主界面                Menu();            }            break;        case 2:            sort2(L);            if (L.length == 0) {                printf("已无学生记录!\n");                Ret();                Menu();            } else {                printf("按学号排序:\n");                Display(L);                Ret();  //调用返回主界面                Menu();            }            break;        case 3:            sort3(L);            if (L.length == 0) {                printf("已无学生记录!\n");                Ret();                Menu();            } else {                printf("按房号排序:\n");                Display(L);                Ret();  //调用返回主界面                Menu();            }            break;        default:            break;    }}//选择是否继续查找int Select() {     char ch;    scanf("%c", &ch);    printf("是否继续查找?<y/n>:");    fflush(stdin);    scanf("%c", &ch);    if (ch == 'y') {        system("cls");        return 1;    } else        return 0;}//按姓名从小到大查找(采用二分查找)void search2(linklist &L) {     if (L.length == 0) {        printf("已无学生记录!\n");        Ret();        Menu();    } else {        int low = 0, high = L.length, mid, flag = 0;        printf("\n");        printf("按姓名查找-->请输入要查找的姓名:");        char a[15], ch;        scanf("%s", a);        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) {            printf("查找成功-->该学生信息为:\n");            printf("姓名       学号    房号\n");            printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);            if (Select())                search2(L);            else {                system("cls");                Menu();            }        } else {            printf("该学生不存在!");            if (Select())    search2(L);            else {                system("cls");                Menu();            }        }    }}//按学号从小到大查找(采用二分查找)void search3(linklist &L) {     if (L.length == 0) {        printf("\n");        printf("已无学生记录!\n");        Ret();        Menu();    } else {        int low = 0, high = L.length, mid, flag = 0;        int n;        char ch;        printf("\n");        printf("按学号查找-->请输入要查找的学号:");        scanf("%d", &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) {            printf("查找成功----->该学生信息为:\n");            printf("姓名       学号    房号\n");            printf("%-1s0 %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);            if (Select())                search3(L);            else {                system("cls");                Menu();            }        } else {            printf("该学生不存在!");            if (Select())                search3(L);            else {                system("cls");                Menu();            }        }    }}//按房号从小到大查找(采用二分查找)void search4(linklist &L) {     if (L.length == 0) { //此函数功能为:返回主界面        printf("\n");        printf("已无学生记录!\n");        Ret();        Menu();    } else {        int low = 0, high = L.length, mid, flag = 0;//flag作为标志符,为1则表示查找成功,否则没有所要查找的学生        int m;        char ch;        printf("\n");        printf("按房号查找-->请输入要查找的房号:");        scanf("%d", &m);        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) {            printf("查找成功-->该学生信息为:\n");            printf("姓名       学号    房号\n");            printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);            if (Select())    //调用判断函数1                search4(L);            else {                system("cls");                Menu();            }        } else {            printf("该学生不存在!");            if (Select())  //调用判断函数2                search4(L);            else {                system("cls");                Menu();            }        }    }}//查找函数void Search(linklist &L) {     int c;    printf("请输入查找的方式(1:按名字查找,2:按学号查找,3:按房号查找):");    scanf("%d", &c);    switch (c) {        case 1:            sort1(L);            search2(L);            break;//先进行二分查找排序        case 2:            sort2(L);            search3(L);            break;        case 3:            sort3(L);            search4(L);            break;        default:            break;    }}//按学号从小到大插入该学生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);    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<L.length; i++) {        if (stud.num<L.elem[i].num) {            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].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("是否继续插入?<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.num);    for (i = 0; i<L.length; i++) {        if (stud.num == L.elem[i].num) {            printf("该学生的信息为:\n");            printf("姓名:%s \n学号:%d \n房号:%d\n", L.elem[i].name, L.elem[i].num, L.elem[i].room);            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");}//主函数int main() {      linklist L;    //定义线性表 L    Init(L);    Menu();        //调用主菜单函数    while (choice != 0) {        system("cls");        switch (choice) {            case 1:                Create(L);    //调用线性表创建函数                Menu();                break;            case 2:                Sort(L);                break;//调用排序函数            case 3:                Search(L);                break;//调用查找函数进行(二分)查找            case 4:                sort2(L);      //调用学号排序函数                Insert(L);        //按学号序列插入                system("cls");                printf("插入后的学生信息:\n");                Display(L);                Ret();                Menu();                break;            case 5:                Delete(L);    //调用删除函数                if (L.length == 0) {                    printf("\n");                    printf("学生记录已被删除完!\n");                    Ret();                    Menu();                } else {                    printf("显示删除后的学生信息:\n");                    Display(L);                    Ret();                    Menu();                }                break;        }    }}

到此,关于“C语言实现学生宿舍信息管理系统的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯