您好,登錄后才能下訂單哦!
這篇文章主要介紹“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í)吧!
宿舍對(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ù)操作)
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)流程圖
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(); } } } }
3.1 系統(tǒng)界面
3.2 新建宿舍名單
3.3 排序(以姓名排序?yàn)槔?/p>
3.4 查詢(以學(xué)號(hào)查詢?yōu)槔?/p>
3.5 插入學(xué)生信息
3.6 刪除學(xué)生信息
#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í)用的文章!
免責(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)容。