溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法

發(fā)布時(shí)間:2022-03-17 08:57:34 來(lái)源:億速云 閱讀:247 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法”,在日常操作中,相信很多人在C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

一、問(wèn)題陳述

宿舍對(duì)于大學(xué)生在校生活來(lái)說(shuō)相當(dāng)于家的存在,而宿舍管理又是學(xué)校后勤管理的重要環(huán)節(jié),如何直觀的了解宿舍的入住情況和每位同學(xué)的住宿位置是提高工作效率的重要課題,根據(jù)我們所學(xué)的C語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)課程中有關(guān)鏈表的內(nèi)容,為宿舍管理人員編寫宿舍管理查詢軟件,就可以輕松滿足實(shí)現(xiàn)上述需求。

任務(wù):

1、為宿舍管理人員編寫一個(gè)宿舍管理查詢軟件, 程序設(shè)計(jì)要求:
1)、采用交互工作方式
2)、可按關(guān)鍵字(姓名、學(xué)號(hào)、房號(hào))進(jìn)行排序

2、查詢菜單: (用二分查找實(shí)現(xiàn)以下操作)
1)、按姓名查詢
2)、按學(xué)號(hào)查詢
3)、按房號(hào)查詢

3、打印任一查詢結(jié)果(可以連續(xù)操作)

二、概要設(shè)計(jì)

2.1 概要簡(jiǎn)述

根據(jù)系統(tǒng)要求,即本系統(tǒng)具有信息的錄入,顯示,排序顯示、查找,插入、刪除、結(jié)束程序等功能,先設(shè)計(jì)出詳細(xì)的系統(tǒng)流程圖,然后將源代碼輸入程序,進(jìn)行編譯調(diào)試即可。
程序總體分10個(gè)項(xiàng)目:輸入記錄、顯示記錄、按姓名排序并顯示、按房間號(hào)排序并顯示 、按學(xué)號(hào)排序并顯示 、按姓名查找并顯示 、按房間號(hào)查找并顯示 、按學(xué)號(hào)查找并顯示、插入一條記錄按學(xué)號(hào)排序并顯示以及結(jié)束程序。

2.2 線性表存儲(chǔ)結(jié)構(gòu)表示

typedef struct {
    char name[20];
    int num;            //學(xué)號(hào)和房號(hào)都為整型
    int room;
} stu;

typedef struct {
    int length; //當(dāng)前長(zhǎng)度
    stu *elem;  //存儲(chǔ)空間基址
    int listsize;  //當(dāng)前分配的存儲(chǔ)容量
} linklist;

2.3 詳細(xì)設(shè)計(jì)

2.3.1 系統(tǒng)流程圖

C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法

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 折半插入排序(按學(xué)號(hào)排序)

//按學(xué)號(hào)排序(采用折半插入排序)
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 簡(jiǎn)單選擇排序(按房號(hào)排序)

//按房號(hào)排序(采用簡(jiǎn)單選擇排序)
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 search2(linklist &L) { 
    if (L.length == 0) {
        printf("已無(wú)學(xué)生記錄!\n");
        Ret();
        Menu();
    } else {
        int low = 0, high = L.length, mid, flag = 0;
        printf("\n");
        printf("按姓名查找-->請(qǐng)輸入要查找的姓名:");
        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("查找成功-->該學(xué)生信息為:\n");
            printf("姓名       學(xué)號(hào)    房號(hào)\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("該學(xué)生不存在!");
            if (Select())    search2(L);
            else {
                system("cls");
                Menu();
            }
        }
    }
}

三、測(cè)試與運(yùn)行

3.1 系統(tǒng)界面

C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法

3.2 新建宿舍名單

C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法

3.3 排序(以姓名排序?yàn)槔?/p>

C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法

3.4 查詢(以學(xué)號(hào)查詢?yōu)槔?/p>

C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法

3.5 插入學(xué)生信息

C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法

3.6 刪除學(xué)生信息

C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法

四、代碼實(shí)現(xiàn)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define N 40 //線性表存儲(chǔ)空間的初始分配量
#define increase 10 //線性表存儲(chǔ)空間的分配量增量
int choice;  //定義全局變量
typedef struct {
    char name[20];
    int num;            //學(xué)號(hào)和房號(hào)都為整型
    int room;
} stu;
stu stud;
typedef struct {
    int length; //當(dāng)前長(zhǎng)度
    stu *elem;  //存儲(chǔ)空間基址
    int listsize;  //當(dāng)前分配的存儲(chǔ)容量
} linklist;

//線性表初始化
void Init(linklist &L) { 
    L.length = 0;
    L.elem = (stu *)malloc(N * sizeof(stu));
    L.listsize = N;
}

//操作菜單
void Menu() { 
    printf( "**************************************\n" );
    printf( "***       歡迎進(jìn)入宿舍管理系統(tǒng)     ***\n" );
    printf( "**************************************\n" );
    printf( "*        1.  新建宿舍名單            *\n" );
    printf( "*        2.  排序宿舍信息            *\n" );
    printf( "*        3.  查詢宿舍信息            *\n" );
    printf( "*        4.  插入宿舍信息            *\n" );
    printf( "*        5.  刪除宿舍信息            *\n" );
    printf( "*        0.  退出系統(tǒng)                *\n" );
    printf( "**************************************\n" );
    printf("請(qǐng)輸入菜單(0-5):");
    scanf("%d", &choice);
    if (choice<0 || choice>5) {
        system("cls");
        printf("輸入數(shù)字不對(duì),請(qǐng)重新!\n");
        printf("\n");
        Menu();
    }

}

//打印學(xué)生信息
void Display(linklist &L) { 
    int i;
    printf("姓名       學(xué)號(hào)    房號(hào)\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("請(qǐng)按任意鍵進(jìn)入主界面:");
    scanf("%c", &c);
    system("cls");
}

//創(chuàng)建學(xué)生信息表
void Create(linklist &L) { 
    if (L.length >= L.listsize) { //判斷學(xué)生的人數(shù)是否超過(guò)初值,如果超過(guò),則重新分配
        stu *newbase;
        newbase = (stu*)realloc(L.elem, (N + increase) * sizeof(stu));
        L.elem = newbase;
        L.listsize += increase;
    }
    int i = 2;
    char ch;
    printf("********開始創(chuàng)建學(xué)生信息**********\n");
    printf("\n");
    printf("請(qǐng)輸入第1個(gè)學(xué)生的信息\n");
    printf("請(qǐng)輸入姓名:");
    fflush(stdin);      // 清空輸入緩沖區(qū),得到正確的輸入數(shù)據(jù)
    gets(stud.name);    //輸入一行字符串(姓名)
    printf("請(qǐng)輸入學(xué)號(hào):");
    scanf("%d", &stud.num);
    printf("請(qǐng)輸入房號(hào):");
    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("是否繼續(xù)輸入?<y/n>:");
    scanf("%c", &ch);
    printf("\n");
    while (ch == 'y') {
        printf("請(qǐng)輸入第%d個(gè)學(xué)生的信息\n", i);
        printf("請(qǐng)輸入姓名:");
        fflush(stdin);      // 清空輸入緩沖區(qū),得到正確的輸入數(shù)據(jù)
        gets(stud.name);    //輸入一行字符串(姓名)
        printf("請(qǐng)輸入學(xué)號(hào):");
        scanf("%d", &stud.num);
        printf("請(qǐng)輸入房號(hào):");
        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("是否繼續(xù)輸入?<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;
            }
}

//按學(xué)號(hào)排序(采用折半插入排序)
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;
        }
    }
}

//按房號(hào)排序(采用簡(jiǎn)單選擇排序)
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;
        }
    }
}
//排序函數(shù)
void Sort(linklist &L) { 
    int c;
    printf("請(qǐng)輸入排序的方式(1:按名字排序,2:按學(xué)號(hào)排序,3:按房號(hào)排序):");
    scanf("%d", &c);
    switch (c) {
        case 1:
            sort1(L);
            if (L.length == 0) {
                printf("已無(wú)學(xué)生記錄!\n");
                Ret();
                Menu();
            } else {
                printf("按姓名排序:\n");
                Display(L);
                Ret();  //調(diào)用返回主界面
                Menu();
            }
            break;
        case 2:
            sort2(L);
            if (L.length == 0) {
                printf("已無(wú)學(xué)生記錄!\n");
                Ret();
                Menu();
            } else {
                printf("按學(xué)號(hào)排序:\n");
                Display(L);
                Ret();  //調(diào)用返回主界面
                Menu();
            }
            break;
        case 3:
            sort3(L);
            if (L.length == 0) {
                printf("已無(wú)學(xué)生記錄!\n");
                Ret();
                Menu();
            } else {
                printf("按房號(hào)排序:\n");
                Display(L);
                Ret();  //調(diào)用返回主界面
                Menu();
            }
            break;
        default:
            break;
    }
}

//選擇是否繼續(xù)查找
int Select() { 
    char ch;
    scanf("%c", &ch);
    printf("是否繼續(xù)查找?<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("已無(wú)學(xué)生記錄!\n");
        Ret();
        Menu();
    } else {
        int low = 0, high = L.length, mid, flag = 0;
        printf("\n");
        printf("按姓名查找-->請(qǐng)輸入要查找的姓名:");
        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("查找成功-->該學(xué)生信息為:\n");
            printf("姓名       學(xué)號(hào)    房號(hào)\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("該學(xué)生不存在!");
            if (Select())    search2(L);
            else {
                system("cls");
                Menu();
            }
        }
    }
}

//按學(xué)號(hào)從小到大查找(采用二分查找)
void search3(linklist &L) { 
    if (L.length == 0) {
        printf("\n");
        printf("已無(wú)學(xué)生記錄!\n");
        Ret();
        Menu();
    } else {
        int low = 0, high = L.length, mid, flag = 0;
        int n;
        char ch;
        printf("\n");
        printf("按學(xué)號(hào)查找-->請(qǐng)輸入要查找的學(xué)號(hào):");
        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("查找成功----->該學(xué)生信息為:\n");
            printf("姓名       學(xué)號(hào)    房號(hào)\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("該學(xué)生不存在!");
            if (Select())
                search3(L);
            else {
                system("cls");
                Menu();
            }
        }
    }
}

//按房號(hào)從小到大查找(采用二分查找)
void search4(linklist &L) { 
    if (L.length == 0) { //此函數(shù)功能為:返回主界面
        printf("\n");
        printf("已無(wú)學(xué)生記錄!\n");
        Ret();
        Menu();
    } else {
        int low = 0, high = L.length, mid, flag = 0;//flag作為標(biāo)志符,為1則表示查找成功,否則沒(méi)有所要查找的學(xué)生
        int m;
        char ch;
        printf("\n");
        printf("按房號(hào)查找-->請(qǐng)輸入要查找的房號(hào):");
        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("查找成功-->該學(xué)生信息為:\n");
            printf("姓名       學(xué)號(hào)    房號(hào)\n");
            printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);
            if (Select())    //調(diào)用判斷函數(shù)1
                search4(L);
            else {
                system("cls");
                Menu();
            }
        } else {
            printf("該學(xué)生不存在!");
            if (Select())  //調(diào)用判斷函數(shù)2
                search4(L);
            else {
                system("cls");
                Menu();
            }
        }
    }
}

//查找函數(shù)
void Search(linklist &L) { 
    int c;
    printf("請(qǐng)輸入查找的方式(1:按名字查找,2:按學(xué)號(hào)查找,3:按房號(hào)查找):");
    scanf("%d", &c);
    switch (c) {
        case 1:
            sort1(L);
            search2(L);
            break;//先進(jìn)行二分查找排序
        case 2:
            sort2(L);
            search3(L);
            break;
        case 3:
            sort3(L);
            search4(L);
            break;
        default:
            break;
    }
}

//按學(xué)號(hào)從小到大插入該學(xué)生
void Insert(linklist &L) { 
    int i, j, k;
    char ch;
    printf("\n");
    printf("插入的學(xué)生信息為:\n");
    printf("姓名:");
    fflush(stdin);// 清空輸入緩沖區(qū),得到正確的輸入數(shù)據(jù)
    gets(stud.name);
    printf("學(xué)號(hào):");
    scanf("%d", &stud.num);
    printf("房號(hào):");
    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("是否繼續(xù)插入?<y/n>:");
    scanf("%c", &ch);
    if (ch == 'y') Insert(L);
    else system("cls");
}

//按學(xué)號(hào)刪除該學(xué)生
void Delete(linklist &L) { 
    int i, j, k = -1;
    char ch;
    printf("\n");
    printf("\n");
    printf("請(qǐng)輸入要?jiǎng)h除學(xué)生的學(xué)號(hào):");
    scanf("%d", &stud.num);
    for (i = 0; i<L.length; i++) {
        if (stud.num == L.elem[i].num) {
            printf("該學(xué)生的信息為:\n");
            printf("姓名:%s \n學(xué)號(hào):%d \n房號(hào):%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("該學(xué)生不存在\n");
    if (k >= 0)L.length--;
    fflush(stdin);
    printf("\n");
    printf("是否繼續(xù)刪除操作?<y/n>:");
    scanf("%c", &ch);
    system("cls");
    if (ch == 'y') Delete(L);
    else system("cls");
}

//主函數(shù)
int main() {  
    linklist L;    //定義線性表 L
    Init(L);
    Menu();        //調(diào)用主菜單函數(shù)
    while (choice != 0) {
        system("cls");
        switch (choice) {
            case 1:
                Create(L);    //調(diào)用線性表創(chuàng)建函數(shù)
                Menu();
                break;
            case 2:
                Sort(L);
                break;//調(diào)用排序函數(shù)
            case 3:
                Search(L);
                break;//調(diào)用查找函數(shù)進(jìn)行(二分)查找
            case 4:
                sort2(L);      //調(diào)用學(xué)號(hào)排序函數(shù)
                Insert(L);        //按學(xué)號(hào)序列插入
                system("cls");
                printf("插入后的學(xué)生信息:\n");
                Display(L);
                Ret();
                Menu();
                break;
            case 5:
                Delete(L);    //調(diào)用刪除函數(shù)
                if (L.length == 0) {
                    printf("\n");
                    printf("學(xué)生記錄已被刪除完!\n");
                    Ret();
                    Menu();
                } else {
                    printf("顯示刪除后的學(xué)生信息:\n");
                    Display(L);
                    Ret();
                    Menu();
                }
                break;
        }
    }
}

到此,關(guān)于“C語(yǔ)言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)的方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI