(原创) 学生宿舍管理系统(简易版) C语言
生活随笔
收集整理的這篇文章主要介紹了
(原创) 学生宿舍管理系统(简易版) C语言
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
學生宿舍管理系統
- 實現功能
- 一、功能結構
- 二、代碼實現
- 1.頭文件聲明需要使用的函數名
- 2.打印各個選項菜單函數
- 3.選擇選項函數
- 4.判斷打開文件是否成功
- 5.創建結構體
- 6.宿管錄入學生信息函數
- 7.宿管修改學生信息函數
- 8.宿管刪除已錄入學生信息
- 9.宿管瀏覽已錄入學生信息
- 10.宿管搜索已錄入學生信息
- 11.學生注冊函數
- 12.學生登錄函數
- 13.學生操作函數
- 14.主函數
- 總結
實現功能
1.學生登錄注冊
2.宿管錄入、修改、刪除、查詢學生信息
一、功能結構
二、代碼實現
1.頭文件聲明需要使用的函數名
代碼入下:
//Main.h #pragma once #include<stdio.h> #include<stdlib.h> #include<string.h> void PrimaryMenu(); void secondMenu(); void stuMenu(); void admMenu(); void revise(); void Stu_Rev_Menu(); void File_Readable(); int Choice(); struct user Student_Login(void); void Inf_Rev(); void Stu_Rev1(Stu_ID); void Stu_Rev2(Stu_ID); void Qurey(); void Search_infor1(); void Search_infor2(); void Search_infor3(); void getInform(); void Register(); void Delet_Infor(); void Rev_Class();2.打印各個選項菜單函數
代碼如下:
//PrimaryMenu.c #include<stdio.h> #include<stdlib.h> #include<string.h> void PrimaryMenu() {printf("-----歡迎使用學生宿舍管理系統-----\n");printf("------------您的身份--------------\n");printf("-------------1.學生---------------\n");printf("-------------2.宿管---------------\n");printf("-------------0.退出---------------\n");printf("----------------------------------\n"); }; void secondMenu() {printf("-------------1.登錄---------------\n");printf("-------------2.注冊---------------\n");printf("-------------0.返回---------------\n"); } void stuMenu() {printf("------您的操作------\n");printf("-------1.請假-------\n");printf("-------2.報修-------\n");printf("-------0.返回-------\n");printf("--------------------\n"); };void admMenu() {printf("------您的操作------\n");printf("---1.查詢學生信息---\n");printf("---2.搜索學生信息---\n");printf("---3.錄入學生信息---\n");printf("---4.修改學生信息---\n");printf("---5.刪除學生信息---\n");printf("---0.返回-----------\n"); };void revise() {printf("------修改信息------\n");printf("-------1.姓名-------\n");printf("-------2.班級-------\n");printf("------3.宿舍號------\n");printf("-------4.床位-------\n");printf("-------5.報修-------\n");printf("-------6.請假-------\n"); }void Stu_Rev_Menu() {printf("-------1.報修-------\n");printf("-------2.請假-------\n"); }void Rev_Class() {printf("------分類查詢------\n");printf("-------1.學號-------\n");printf("------2.宿舍號------\n");printf("-------3.班級-------\n"); }3.選擇選項函數
代碼入下:
//operate.c #include<stdio.h>int Choice() {int choice;printf("請執行操作:");scanf("%d", &choice);//這里可以加入判定輸入選擇的限制,例如只能輸入1-6數字return choice; };4.判斷打開文件是否成功
代碼入下:
#include<stdio.h> #include<stdlib.h> #include<string.h>void File_Readable() {FILE* fp;if ((fp = fopen("Register.txt", "rb+")) == NULL) //打開文件出錯時,fopen() 將返回一個空指針,也就是 NULL{printf("ERROR:FILE CAN'T OPEN");exit(0);};if ((fp = fopen("StuInform.txt", "rb+")) == NULL){printf("ERROR:FILE CAN'T OPEN");exit(0);};fclose(fp); }5.創建結構體
創建存儲學生賬號密碼與學生信息的結構體
代碼入下:
6.宿管錄入學生信息函數
#StuInform.txt存放錄入學生的信息
代碼入下:
效果如下:
7.宿管修改學生信息函數
代碼如下:
#include"Main.h" #define N 9void Inf_Rev() {int i = 0,ii=0,y=0;char stand_in[N];//需要修改學號int choice_num;//選擇修改內容char name[N];char num[N]; //學號char class[N]; //班級char dorm[N]; //宿舍號char bednum[N]; //床位int Report_Repair; //報修int Leave;//請假FILE* fp;fp = fopen("StuInform.txt", "rb+");STU a[10];while (1){if (!feof(fp))//foef函數會在文件最后一個結構體的下一個返回1,所以fread會多讀一個空的結構體,這點很重要,所以i要減一,防止內存越界。{fread(&a[i], sizeof(STU), 1, fp);i++;}else break;};int n = i - 1;//記錄文件中有多少個結構體,即有多少已注冊的學生,后面全是這種方法記錄結構體數量,不再贅述。fclose(fp);printf("請輸入修改學生的學號:");scanf("%s", stand_in);for (ii ; ii < n; ii++)//循環找到需要修改的結構體的下標{if (!strcmp(a[ii].num, stand_in)){printf("姓名 班級 學號 宿舍號 床位 請假 報修\n");printf("%s %s %s %s %s %d %d\n", a[ii].name, a[ii].class, a[ii].num, a[ii].dorm,a[ii].bednum, a[ii].Report_Repair, a[ii].Leave);break; //打印修改前信息 }if (ii == n-1){printf("該學生不存在\n");return;//找不到則退出函數}}revise();//找到需要修改的學生信息,則打印修改菜單printf("請輸入修改內容:");scanf("%d", &choice_num);switch (choice_num){case 1: {do {printf("請輸入修改后學生姓名:");scanf("%s", name);if ((strspn(name, "abcdefghijklmnopqrstuvwxyz") != strlen(name)) || strlen(name) >= 20) //判斷是否全是字母printf("輸入錯誤,請重新輸入");else break;} while (1); strcpy(a[ii].name, name);//覆蓋結構體數組中的原數據break;}case 2: {do {printf("請輸入修改后班級:");scanf("%s", class);if ((strspn(class, "0123456789") != strlen(class)) || strlen(class) != 6)printf("輸入錯誤,請重新輸入");else break;} while (1);strcpy(a[ii].class, class); break;}case 3: {do {printf("請輸入修改后宿舍號:");scanf("%s", dorm);if ((strspn(dorm, "0123456789NS") != strlen(dorm)) || strlen(dorm) != 5)printf("輸入錯誤,請重新輸入");else break;} while (1);strcpy(a[ii].dorm, dorm); break;}case 4: {do {printf("請輸入修改后床位:");scanf("%s", bednum);if ((strspn(bednum, "123456") != strlen(bednum)) || strlen(bednum) != 1)printf("輸入錯誤,請重新輸入\n");else break;} while (1); strcpy(a[ii].bednum, bednum); break;}case 5: {if (a[ii].Report_Repair == 0)a[ii].Report_Repair = 1;elsea[ii].Report_Repair = 0;}case 6: {if (a[ii].Leave == 0)a[ii].Leave = 1;elsea[ii].Leave = 0;}; break;}printf("姓名 班級 學號 宿舍號 床位 請假 報修\n");printf("%s %s %s %s %s %d %d\n", a[ii].name, a[ii].class, a[ii].num, a[ii].dorm,a[ii].bednum, a[ii].Report_Repair, a[ii].Leave);//打印修改后的信息fp = fopen("StuInform.txt", "wb+");for (int x = 0; x < n; x++){fwrite(&a[x], sizeof(STU), 1, fp);}fclose(fp);printf("-----修改成功-----\n");}效果如下:
8.宿管刪除已錄入學生信息
代碼如下:
#include"Main.h"void Delet_Infor() {FILE* fp;fp = fopen("StuInform.txt", "r");STU a[10];int i = 0;int j = 0;int x = 0;int m = 0;char DeletNum[N];while (1){if (!feof(fp)){fread(&a[i], sizeof(STU), 1, fp);i++;}else break;};int n = i - 1;fclose(fp);printf("---------刪除學生信息-----------\n");printf("請輸入刪除學生學號:");scanf("%s", DeletNum);for (j; j < n; j++){if (!strcmp(a[j].num, DeletNum)){fp = fopen("StuInform.txt", "w+");for (x; x < n; x++){if (x != j)fwrite(&a[x], sizeof(STU), 1, fp);}fclose(fp);printf("-----------刪除成功---------\n");}if (strcmp(a[j].num, DeletNum))m++;}if (j == m - 1)printf("該學生不存在,無法刪除\n"); };效果如下:
刪除后:
9.宿管瀏覽已錄入學生信息
#將錄入的學生信息全部打印瀏覽
代碼如下:
效果如下:
10.宿管搜索已錄入學生信息
按班級、宿舍號、學號查找
代碼如下:
效果如下:
11.學生注冊函數
#使用Register.txt文件儲存注冊的賬號密碼信息,賬號即學號
代碼如下:
效果如下:
12.學生登錄函數
代碼如下:
#include"Main.h"struct user Student_Login()//建立可以返回結構體的函數,在進行學生操作時會使用到 {int x = 1;int i = 0;int j = 0;FILE* fp;fp = fopen("Register.txt", "r");USER a[10],b;while (1){if (!feof(fp)){fread(&a[i], sizeof(STU), 1, fp);i++;}else break;};int n = i - 1;fclose(fp);fp = fopen("Register.txt", "r");while (1){printf("----登錄----\n");printf("請輸入學號:");scanf("%s", b.username);if ((strspn(b.username, "0123456789") != strlen(b.username)) || strlen(b.username) != 8)printf("學號不存在,請重新輸入\n");else break;};printf("請輸入密碼:");scanf("%s", b.password);for (j =0 ; j < i; j++){fread(&a[j], sizeof(USER), 1, fp);if (!strcmp(a[j].username, b.username)){if (!strcmp(a[j].password, b.password)){printf("登錄成功\n");fclose(fp);return b;//函數結束}elsecontinue;}elsecontinue;}printf("賬號或密碼錯誤\n");//若循環結束,則沒有在文件中找到輸入的賬號和密碼Student_Login();//重新登錄 };效果如下:
13.學生操作函數
在文件中,以0、1表示學生是否請假或報修
代碼入下:
效果如下:
14.主函數
代碼入下:
#include "Main.h"void main() {int choice = 1;int choice1 = 1;int choice2 = 1;int choice3 = 1;int Test_Num;char Stu_ID[20];struct user x;char* y;File_Readable();do{ //do while 循環實現返回上一級的功能PrimaryMenu();//選擇身份,1學生2宿管choice = Choice();switch (choice){case 1:do//學生{secondMenu();choice1 = Choice();switch (choice1){case 1://登錄{x = Student_Login();strcpy(Stu_ID, x.username);//登錄成功,接收登陸時輸入的學號do {stuMenu();//打開學生操作目錄choice2 = Choice();switch (choice2)//執行學生可執行的操作{case 1:Stu_Rev1(Stu_ID); break;case 2:Stu_Rev2(Stu_ID); break;case 0:Test_Num = 1; break;default:break;}} while (choice2 != 0);}; break;case 2: {Register(); //注冊x = Student_Login();strcpy(Stu_ID, x.username);//注冊成功后登錄do {stuMenu();//打開學生操作目錄choice2 = Choice();switch (choice2)//執行學生可執行的操作{case 1:Stu_Rev1(Stu_ID); break;case 2:Stu_Rev2(Stu_ID); break;case 0:; break;default:break;};} while (choice2 != 0); break;case 0:break;default:break;}; break;}} while (choice1 != 0); break;case 2: do { //宿管admMenu();choice2 = Choice();switch (choice2){case 1:Qurey(); break;//查詢case 2: {Rev_Class();choice3 = Choice();switch (choice3) {case 1:Search_infor1(); break;case 2:Search_infor2(); break;case 3:Search_infor3(); break;}}; break;//搜索case 3:getInform(); break;//錄入case 4:Inf_Rev(); break;//修改case 5:Delet_Infor(); break;//刪除case 0:break;default:break;};} while (choice2 != 0); break;case 0:exit(0); break;default:break;}} while (choice != 0); };總結
這個系統比較簡陋,宿管功能沒有人員使用限制,學生信息瀏覽沒有自動排序,輸入信息的限制比較少(學號可以錄入重復的等等,但是注冊我加了判斷重復的功能)。總的來說,代碼重復度很高,實現得比較復雜,但是這是我初學C語言寫的第一個系統,還望海涵,希望能給其他小伙伴帶來幫助,如需交流,可私信謝謝~~~~~源代碼下載可訪問https://github.com/TiAmo-one/Student-dormitory-management-system
總結
以上是生活随笔為你收集整理的(原创) 学生宿舍管理系统(简易版) C语言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑马程序员软件测试面试宝典
- 下一篇: 数据库系统和文件系统的区别