实现简单的学生宿舍基本信息管理,宿舍的基本信息包括楼号、房间号、面积、所容纳人数、已入住人数等,系统以文本菜单形式工作。
登录时:用户名为asd 密码任意
#include
#include
#include
#include
#include
#include
#include
#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);
}
}
}