C语言实现学生宿舍信息管理系统课程设计

本文实例为大家分享了C语言实现学生宿舍信息管理系统的具体代码,供大家参考,具体内容如下

一、问题陈述

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

任务:

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

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

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 详细设计

2.3.1 系统流程图

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

2.3.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.3.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.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.3.2.4 二分查找法(以按姓名查找为例)

//按姓名从小到大查找(采用二分查找)
void search1(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())
                search1(L);
            else {
                system("cls");
                Menu();
            }
        } else {
            printf("该学生不存在!");
            if (Select())    search1(L);
            else {
                system("cls");
                Menu();
            }
        }
    }
}

三、测试与运行

3.1 系统界面

3.2 新建宿舍名单

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

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

3.5 插入学生信息

3.6 删除学生信息

四、代码实现

#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 search1(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())
                search1(L);
            else {
                system("cls");
                Menu();
            }
        } else {
            printf("该学生不存在!");
            if (Select())    search1(L);
            else {
                system("cls");
                Menu();
            }
        }
    }
}

//按学号从小到大查找(采用二分查找)
void search2(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())
                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;//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
                search3(L);
            else {
                system("cls");
                Menu();
            }
        } else {
            printf("该学生不存在!");
            if (Select())  //调用判断函数2
                search3(L);
            else {
                system("cls");
                Menu();
            }
        }
    }
}

//查找函数
void Search(linklist &L) { 
    int c;
    printf("请输入查找的方式(1:按名字查找,2:按学号查找,3:按房号查找):");
    scanf("%d", &c);
    switch (c) {
        case 1:
            sort1(L);
            search1(L);
            break;//先进行二分查找排序
        case 2:
            sort2(L);
            search2(L);
            break;
        case 3:
            sort3(L);
            search3(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;
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言数组实现学生信息管理系统设计

    概述 单纯只用多个数组管理学生成绩信息,不使用结构体,该程序最主要的难点是依据学号或总成绩对学生信息进行排序,借助了临时数组来标记排好序的下标. 运行结果如下: 输入数据: 打印数据: 根据学号对信息进行排序: 根据总成绩对信息进行排序: 根据学号删除某一信息: 代码如下: #include <stdio.h> #include <stdlib.h> //exit函数头文件 #include <string.h> //字符串相关操作头文件 #define MAX_STU

  • C语言职工信息管理系统源码

    本文实例为大家分享了C语言职工信息管理系统的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> struct worker { char ID[20];//工号 char name[20];//姓名 char sex[5];//性别 char born[20];//生日 char edu[20];//学历 char po

  • C语言学生信息管理系统小项目

    本文为大家分享了C语言学生信息管理系统小项目,供大家参考,具体内容如下 /* 运行环境:我是在linux里面用gcc编译的,在windows里应该也能运行,用的一些文件库函数都是c标准库,没有用linux的系统调用(纠正一下:system("clear")这个系统调用是linux的,windows里面用system("cls") ) (1)问题描述 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等.试设计一学生信息管理系统,使之能提供以下功

  • C语言学生信息管理系统设计与实现

    本文实例为大家分享了C语言学生信息管理系统的具体代码,供大家参考,具体内容如下 #include"stdio.h" //标准的输入输出函数文件头部说明 #include"math.h" // 数学函数头部说明 #include"string.h" #include"stdlib.h" //通过该函数头部里的函数,改变控制台的背景和颜色 #include"windows.h" //头文件声明,下文用到了改变控

  • C语言实现学生信息管理系统(单链表)

    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 /*copyright(c)2016.烟台大学计算机学院 * All rights reserved, * 文件名称:text.Cpp * 作者:吴敬超 * 完成日期:2016年7月1日 * 版本号:codeblock * * 问题描述: 学生信息管理系统 * 输入描述: * 程序输出: 输出结果 */ #include <stdio.h> #include <stdlib.h> #include

  • 学生信息管理系统C语言版

    C语言学生信息管理系统包括以下功能: 1.学生信息的整体注册 2.学生信息的修改 3.学生成绩信息的录入 4.学生信息的添加 5.恢复误删的学生信息 6.学生信息的删除 7.密码修改保存函数 8.学生信息的查询 9.密码修改函数 10.学生信息管理系统的菜单函数 #include "stdio.h" #include "malloc.h" #include "string.h" #include "stdlib.h" #inc

  • c语言实现的货物管理系统实例代码(增加删除 查找货物信息等功能)

    复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>        /*屏幕操作函数库*/ /*主管权限数据格式化*/#define HEADER1_zg "-----------------------------货物管理系统(主管)--------------------------------\n"#define H

  • C语言数据结构之学生信息管理系统课程设计

    本文实例为大家分享了学生信息管理系统设计的具体代码,供大家参考,具体内容如下 建立一个动态链表,链表中每一结点包括:学号.姓名.性别.年龄.成绩.程序能实现以下功能: 建立链表      显示链表      查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示"无此记录!"的信息.      删除链表中指定学号的结点.      在链表中指定的位置插入一个新结点(学号不能和其他结点重复). 要求:程序运行中,先显示实现以上功能所构成的菜单,然后根据选项调用相应程序

  • C语言单链表版学生信息管理系统

    本文实例为大家分享了C语言学生信息管理系统的具体代码,供大家参考,具体内容如下 代码: //以单链表作为存储结构,设计和实现课程成绩管理的完整程序. //程序包括如下功能. //1.建立学生成绩表,包含学生的学号.姓名和成绩. //2.可以显示所有学生成绩. //3.可以计算学生的总数. //4.可以按学号和序号查找学生. //5.可以在指定位置插入学生成绩数据. //6.可以删除指定位置的学生数据. //7.可以把学生成绩按从高到低的顺序排序. //作者: yinlinqvan //操作系统:

  • C语言实现歌曲信息管理系统

    本文实例为大家分享了C语言实现歌曲信息管理系统的具体代码,供大家参考,具体内容如下 系统功能:该系统以菜单方式工作,歌曲信息包括:歌名.演唱者.作词.作曲.所属专辑.出版时间.出版公司.试设计一歌厅歌曲管理系统,使之能提供以下功能:歌曲信息录入.修改.插入.删除功能:歌曲排序浏览功能:按歌名查询.按演唱者查询等功能. 完整的实现代码如下: #include "stdio.h" #include "stdlib.h" #include "string.h&q

随机推荐