C语言学生宿舍管理系统
dream_it_ 人气:0实现简单的学生宿舍基本信息管理,宿舍的基本信息包括楼号、房间号、面积、所容纳人数、已入住人数等,系统以文本菜单形式工作。
登录时:用户名为asd 密码任意
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <ctype.h> #include <malloc.h> #include <windows.h> #define N sizeof(struct Student) typedef struct Student { int buildnum; //宿舍楼栋号 int roomnum; //房间号 int brnum; //宿舍楼栋号+房间号 float area; //宿舍房间面积 int rnanum; //所容纳人数 char xy[100]; //学院 int bj; // 班级 int num; //学号 char name[20]; //姓名 char sex[10]; //性别 int date; //日期 struct Student *next; }Stu,*stu; int a[1000000];//记录寝室入住人数 void save_stu(stu p); void login() { system("cls"); system("color 4E"); printf("\n\n\n\n\n\n\n############################~欢迎进入学生宿舍管理系统~##########################\n"); printf("\n\n\n\t\t\t\t ★ ★ ★ ★ ★"); printf("\n\n\n\n\t\t\t\t\t\tLoading"); for(int i=0;i<6;i++) { Sleep(400); printf("."); } system("cls"); char username[10]; char password; int p=0; system("color 6E"); printf("\n\n\n ==============================欢迎使用=================================\n"); for(int i = 0; i < 3; i++) { printf("\n\n\n\t\t请输入用户名:[ ]\b\b\b\b\b\b\b\b\b\b\b\b"); scanf("%s",username); if (strcmp(username,"asd") == 0) { printf("\t\t请输入密码: [ ]\b\b\b\b\b\b\b\b\b\b\b\b"); while((password=getch()) != '\r')//判断是否是回车 { p++; if(password == 8)//实现backspace键的功能,其中backspace键的ascii码是8 { putchar('\b'); putchar(' '); putchar('\b'); if(p>0) //最多只能删到没有字符 p--; } if(!isdigit(password)&&!isalpha(password))//判断是否是数字或字符 continue; putchar('*'); //在屏幕上打印星号 } printf("\n\n\n ===============================登陆成功================================="); Sleep(600); return; system("pause"); } else { if(i<2) printf("用户名错误,请重新输入"); else { printf("\n 您已连续3次将用户名或密码输错,系统将退出!"); exit(0); //关闭所有文件,终止正在执行的进程 } } } } int menu_select() //主菜单选项 { int a; do { system("cls"); system("color 3E"); printf("\n\n\t======================学生宿舍管理系统※※※※※※※※※※※※\n\n"); printf("\t◆◆ 1. 添加学生信息 ◆◆\n\n"); printf("\t◆◆ 2. 显示学生信息 ◆◆\n\n"); printf("\t◆◆ 3. 对学生信息进行排序 ◆◆\n\n"); printf("\t◆◆ 4. 查找学生信息 ◆◆\n\n"); printf("\t◆◆ 5. 修改学生信息 ◆◆\n\n"); printf("\t◆◆ 6. 删除学生信息 ◆◆\n\n"); printf("\t◆◆ 0. 退出系统 ◆◆\n\n"); printf("\t※※※※※※※※※※※※※※※================================\n"); printf("\t请选择您要运行的选项按(0-6):"); scanf("%d",&a); }while(a<0 || a>6); return a; } stu ss() //将文件中的内容读出到链表中,返回值为表头地址 { FILE *fp; //文件指针 int n = 0; stu head = NULL; stu p1,p,pr = NULL; fp=fopen("student","ab+"); //以只读的方式打开文件 if(fp == NULL) { printf("文件打开失败 !\n"); } else { while(!feof(fp)) //判断文件位置标志是否移动到文件末尾 { n++; p = (stu)malloc(N); //向内存申请一段空间 fread(p,N,1,fp); //将fp所指向的文件中的内容赋给p if(n == 1) { head = p; p1 = p; } else //创建链表 { pr = p1; p1->next = p; p1 = p; } } } if(pr != NULL) pr->next = NULL; else head = NULL; fclose(fp); //关闭文件 return head; //返回头指针 } Student *input(int n) { int i; stu head,p,q; if(n <= 0) return NULL; p = (stu)malloc(sizeof(Stu)); printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 楼栋房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期\n"); printf("--------------------------------------------------------------------------------\n"); scanf("%d%d%d%f%d%s%d%d%s%s%d",&p->buildnum,&p->roomnum,&p->brnum,&p->area,&p->rnanum,&p->xy,&p->bj,&p->num,&p->name,&p->sex,&p->date); a[p->brnum]++; if(a[p->brnum] == p->rnanum) printf("\n该寝室已入住满,请安排后面的学生到其它空余寝室入住\n"); head = p; save_stu(p); for(i = 1;i < n; i++) { q = (stu)malloc(sizeof(Stu)); printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 楼栋房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期\n"); printf("--------------------------------------------------------------------------------\n"); scanf("%d%d%d%f%d%s%d%d%s%s%d",&q->buildnum,&q->roomnum,&q->brnum,&q->area,&q->rnanum,&q->xy,&q->bj,&q->num,&q->name,&q->sex,&q->date); printf("\n"); a[q->brnum]++; if(a[q->brnum] == q->rnanum) { printf("\n该寝室已入住满,请安排后面的学生到其它空余寝室入住\n"); Sleep(300); } save_stu(q); p->next = q; p = q; } p->next=NULL; return head; } void save_stu(stu p) //将p中内容写入文件 { FILE *fp; //文件指针 fp = fopen("student","ab"); //以追加的方式打开名字为student的二进制文件 if(fp == NULL) { printf("文件打开失败 !"); } if(fwrite(p,N,1,fp) != 1) //将p所指向的一段大小为N的内容存入fp所指向的文件中 { printf("写入错误 !"); } fclose(fp); //关闭文件 } void output(stu head) //输出学生信息 { printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期 已住人数 \n"); printf("--------------------------------------------------------------------------------\n"); stu p,q; int n=0; head = ss(); p = head; if(head == NULL) { printf("\n\t\t\t学生信息为空 !\n"); } else { for(p = head ;p != NULL ;p = p->next) { for(q = head;q != NULL ;q=q->next) { if(p->brnum == q->brnum) n++; } a[p->brnum]=n; printf("%3d %5d %.1f %5d %10s %4d %4d %6s %3s %4d %3d\n",p->buildnum,p->roomnum,p->area,p->rnanum,p->xy,p->bj,p->num,p->name,p->sex,p->date, n); n=0; } } } int sort_menu() //排序选择菜单 { int a; do { system("cls"); printf("\n\n\t\t------------------------------------------------------------\n\n"); printf("\t\t\t ▲▲ 1. 按照宿舍房间号排序\n\n"); printf("\t\t\t ▲▲ 2. 按照学号排序\n\n"); printf("\t\t\t ▲▲ 0. 返回到主菜单\n\n"); printf("\t\t------------------------------------------------------------\n"); printf("\t\t请选择您要运行的选项按(0-2):"); scanf("%d",&a); } while(a<0 || a>2); return a; } int sort(stu head,int n) //排序 { FILE *fp; head = ss(); stu p,q; int buildnum; //宿舍楼栋号 int roomnum; //房间号 int brnum; //宿舍楼栋号+房间号 float area; //宿舍房间面积 int rnanum; //所容纳人数 char xy[100]; //学院 int bj; // 班级 int num; //学号 char name[20]; //姓名 char sex[10]; //性别 int date; //日期 switch(n) { case 1: system("cls"); for(p = head; p != NULL; p = p->next) { for(q = p->next; q != NULL; q = q->next) { if(p->brnum > q->brnum) { buildnum = q->buildnum; roomnum = q->roomnum; brnum = q->brnum; area = q->area; rnanum = q->rnanum; strcpy(xy,q->xy); bj = q->bj; num = q->num; strcpy(name,q->name); strcpy(sex,q->sex); date = q->date; q->buildnum = p->buildnum; q->roomnum = p->roomnum; q->brnum = p->brnum; q->area = p->area; strcpy(q->xy,p->xy); q->bj = p->bj; q->num = p->num; strcpy(q->name,p->name); strcpy(q->sex,p->sex); q->date = p->date; p->buildnum = buildnum; p->roomnum = roomnum; p->brnum = brnum; p->area = area; strcpy(p->xy,xy); p->bj = bj; p->num = num; strcpy(p->name,name); strcpy(p->sex,sex); p->date = date; } } } fp = fopen("student","wb"); if(fp == NULL) { printf("文件打开失败 !"); } if(fwrite(head,N,1,fp) != 1) { printf("写入错误 !"); } fclose(fp); if(head != NULL) { p = head->next; fp = fopen("student","ab"); if(fp == NULL) { printf("文件打开失败 !"); } while(p != NULL) { if(fwrite(p,N,1,fp) != 1) { printf("写入错误 !"); } p = p->next; } fclose(fp); } output(head); system("pause"); return 1; case 2: system("cls"); for(p = head; p != NULL; p = p->next) { for(q = p->next;q != NULL; q = q->next) { if(p->num > q->num) { buildnum = q->buildnum; roomnum = q->roomnum; brnum = q->brnum; area = q->area; strcpy(xy,q->xy); bj = q->bj; num = q->num; strcpy(name,q->name); strcpy(sex,q->sex); date = q->date; q->buildnum = p->buildnum; q->roomnum = p->roomnum; q->brnum = p->brnum; q->area = p->area; strcpy(q->xy,p->xy); q->bj = p->bj; q->num = p->num; strcpy(q->name,p->name); strcpy(q->sex,p->sex); q->date = p->date; p->buildnum = buildnum; p->roomnum = roomnum; p->brnum = brnum; p->area = area; strcpy(p->xy,xy); p->bj = bj; p->num = num; strcpy(p->name,name); strcpy(p->sex,sex); p->date = date; } } } fp = fopen("student","wb"); if(fp == NULL) { printf("文件打开失败 !"); } if(fwrite(head,N,1,fp) != 1) { printf("写入错误 !"); } fclose(fp); if(head != NULL) { p = head->next; fp = fopen("student","ab"); if(fp == NULL) { printf("文件打开失败 !"); } while(p != NULL) { if(fwrite(p,N,1,fp) != 1) { printf("写入错误 !"); } p = p->next; } fclose(fp); } output(head); system("pause"); return 1; case 0: system("pause"); return 0; } } int find_menu() //查找菜单 { int a; do { system("cls"); printf("\n\n\t\t------------------------------------------------------------\n\n"); printf("\t\t\t ▲▲ 1. 按照楼栋房间号查找(查找同一寝室人员)\n\n"); printf("\t\t\t ▲▲ 2. 按照学院查找(查找同一学院人员)\n\n"); printf("\t\t\t ▲▲ 3. 按照班级查找(查找同一班级人员)\n\n"); printf("\t\t\t ▲▲ 4. 按照学号查找\n\n"); printf("\t\t\t ▲▲ 5. 按照姓名查找\n\n"); printf("\t\t\t ▲▲ 0. 返回到主菜单\n\n"); printf("\t\t------------------------------------------------------------\n"); printf("\t\t请选择您要运行的选项按(0-5):"); scanf("%d",&a); }while(a<0 || a>5); return a; } int find(stu head,int n) //查找选择菜单 { stu p; head = ss(); switch(n) { case 1: system("cls"); int sou; printf("\n\t\t\t要查找的宿舍房间号为:"); scanf("%d",&sou); printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期 已住人数 \n"); printf("--------------------------------------------------------------------------------\n"); for(p = head ;p != NULL ;p = p->next) { if(p->brnum == sou) printf("%3d %5d %.1f %5d %10s %4d %4d %6s %3s %4d %3d\n",p->buildnum,p->roomnum,p->area,p->rnanum,p->xy,p->bj,p->num,p->name,p->sex,p->date,a[p->brnum]); } system("pause"); return 1; case 2: system("cls"); p = head; char d[30]; printf("\n\t\t\t要查找的学院为:"); scanf("%s",&d); printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期 已住人数 \n"); printf("--------------------------------------------------------------------------------\n"); for(p = head ;p != NULL ;p = p->next) { if(strcmp(p->xy,d) == 0) printf("%3d %5d %.1f %5d %10s %4d %4d %6s %3s %4d %3d\n",p->buildnum,p->roomnum,p->area,p->rnanum,p->xy,p->bj,p->num,p->name,p->sex,p->date,a[p->brnum]); } system("pause"); return 1; case 3: system("cls"); int cl; printf("\n\t\t\t要查找的班级为:"); scanf("%d",&cl); printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期 已住人数 \n"); printf("--------------------------------------------------------------------------------\n"); for(p = head ;p != NULL ;p = p->next) { if(p->bj == cl) printf("%3d %5d %.1f %5d %10s %4d %4d %6s %3s %4d %3d\n",p->buildnum,p->roomnum,p->area,p->rnanum,p->xy,p->bj,p->num,p->name,p->sex,p->date,a[p->brnum]); } system("pause"); return 1; case 4: system("cls"); int f; printf("\n\t\t\t要查找的学号为:"); scanf("%d",&f); printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期 已住人数 \n"); printf("--------------------------------------------------------------------------------\n"); for(p = head ;p != NULL ;p = p->next) { if(p->num == f) printf("%3d %5d %.1f %5d %10s %4d %4d %6s %3s %4d %3d\n",p->buildnum,p->roomnum,p->area,p->rnanum,p->xy,p->bj,p->num,p->name,p->sex,p->date,a[p->brnum]); } system("pause"); return 1; case 5: system("cls"); char g[20]; printf("\n\t\t\t要查找的姓名为:"); scanf("%s",g); printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期 已住人数 \n"); printf("--------------------------------------------------------------------------------\n"); for(p = head ;p != NULL ;p = p->next) { if(strcmp(p->name, g) == 0) printf("%3d %5d %.1f %5d %10s %4d %4d %6s %3s %4d %3d\n",p->buildnum,p->roomnum,p->area,p->rnanum,p->xy,p->bj,p->num,p->name,p->sex,p->date,a[p->brnum]); } system("pause"); return 1; case 0: system("pause"); return 0; } } int alter(stu head) //修改学生信息 { FILE *fp; int y; printf("\n\t\t\t请输入将要修改的学生的学号:"); scanf("%d",&y); stu p; head = ss(); p = head; while(p != NULL) { if(y == p->num) { printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期 已住人数 \n"); printf("--------------------------------------------------------------------------------\n"); printf("%3d %5d %.1f %5d %10s %4d %4d %6s %3s %4d %3d\n",p->buildnum,p->roomnum,p->area,p->rnanum,p->xy,p->bj,p->num,p->name,p->sex,p->date,a[p->brnum]); printf("\n\t\t对信息进行修改:\n"); printf("--------------------------------------------------------------------------------\n"); printf("楼栋号 房间号 宿舍房间号 房间面积 容纳数 学院 班级 学号 姓名 性别 日期\n"); printf("--------------------------------------------------------------------------------\n"); scanf("%d%d%d%f%d%s%d%d%s%s%d",&p->buildnum,&p->roomnum,&p->brnum,&p->area,&p->rnanum,&p->xy,&p->bj,&p->num,&p->name,&p->sex,&p->date); a[p->brnum]++; if(a[p->brnum] == p->rnanum) printf("\n该寝室已入住满,请安排后面的学生到其它空余寝室入住\n"); printf("\n"); } p = p->next; } fp = fopen("student","wb"); //以只写的方式打开名为student的二进制文件,打开的同时清空文件中的内容 if(fp == NULL) { printf("文件打开失败 !"); } if(fwrite(head,N,1,fp) != 1) //将head写入fp所指向的文件中 { printf("写入错误 !"); } fclose(fp); //关闭文件 if(head != NULL) //如果head不为空 { p = head->next; //让p指向第二个结点 fp = fopen("student","ab"); //以追加的方式打开文件 if(fp == NULL) { printf("文件打开失败 !"); } while(p != NULL) { if(fwrite(p,N,1,fp) != 1)//将p写入fp所指向的文件中 { printf("写入错误 !"); } p = p->next; } fclose(fp); } Sleep(500); } int del_menu() { int a; do { system("cls"); printf("\n\n\t\t------------------------------------------------------------\n\n"); printf("\t\t\t ▲▲ 1.删除某个学生信息\n\n"); printf("\t\t\t ▲▲ 2.删除全部学生信息\n\n"); printf("\t\t\t ▲▲ 0. 返回到主菜单\n\n"); printf("\t\t------------------------------------------------------------\n"); printf("\t\t请选择您要运行的选项按(0-2):"); scanf("%d",&a); } while(a<0 || a>2); return a; } int del(stu head,int g) //删除学生信息 { FILE *fp; stu p,q; head = ss(); p = head; q = NULL; switch(g) { case 1: system("cls"); int x,y; printf("\n\t\t\t请输入将要删除学生的学号:"); scanf("%d",&y); while(p != NULL && p->num != y) { q = p; p = p->next; x = p->brnum; } if(p != NULL) { if(q == NULL) { head = head->next; } else if(p->next!=NULL) { q->next = p->next; } else q->next=NULL; } free(p); printf("\n\t\t\t删除成功 !\n"); a[x]--; fp = fopen("student","wb"); if(fp == NULL) { printf("文件打开失败 !"); } if(fwrite(head,N,1,fp) != 1) { printf("写入错误 !"); } fclose(fp); if(head != NULL) { p = head->next; fp = fopen("student","ab"); if(fp == NULL) { printf("文件打开失败 !"); } while(p != NULL) { if(fwrite(p,N,1,fp) != 1) { printf("写入错误 !"); } p = p->next; } fclose(fp); } system("pause"); return 1; case 2: system("cls"); head = NULL; printf("\n\t\t\t删除成功 !\n"); fp=fopen("student","wb"); fclose(fp); system("pause"); return 1; case 0: return 0; } } int main() { int m,n,x,y,g; login(); stu head = NULL; for(;;) { switch(menu_select()) { case 1: system("cls"); printf("\t\t输入学生的个数和数据(以回车结束):"); scanf("%d",&n); if(n <= 0) { printf("\n\t\t\t请输入正确的人数 !"); Sleep(500); break; } else { head = input(n); break; } case 2: system("cls"); system("color 5E"); output(head); system("pause"); break; case 3: do { x = sort(head,sort_menu()); }while(x != 0); break; case 4: system("cls"); do { y = find(head,find_menu()); }while(y != 0); break; case 5: system("cls"); alter(head); printf("\n\t\t\t修改成功 !\n"); system("pause"); break; case 6: system("cls"); do { g = del(head,del_menu()); }while(g != 0); system("pause"); break; case 0: system("cls"); printf("\t\t∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷\n"); printf("\t\t\t\\(^V^)メ(^V^)/ "); printf("\t谢谢使用 !\n"); printf("\t\t∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷\n"); Sleep(2000); system("cls"); exit(0); } } }
加载全部内容