C语言初学者的第一个系统:宿舍管理系统
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct USER{
char user[21];
char passage[21];
}USER;
typedef struct STU{
int lou;
int suse;
int chuang;
char number[21];
char name[21];
char phone[21];
struct STU* before;
struct STU* next;
}STU , *link;
STU z[1];//暂时(z)
char user[21];
char passage[21];
char temp[21];
//宿舍的规模
int lou = 5;
int cen = 7;
int sushe = 15;
int chuangNum = 8;
void enter();//进入主界面
//-------------------------楼长账号管理部分--------------------------------
void LOUZH();//楼长账号登录
void LOUGN();//功能方向选择
void LOUZHGL();//管理所有账号信息
void creat();//创建宿管账号
void LOUDEL();//删除宿管账号
//int UserSeek(USER a[] , int n );//宿管账号的检索,公用部分已声明
void RELOU();//重设楼长的账号和密码
void RESET();//宿管密码的重设
//-------------------------楼长学生信息管理部分--------------------------------
void XXGL();//学生住宿信息管理
/*公用处已经声明过了
void FindStu(int first , int twice);//查询某一学生住宿信息
int StuSeek(link head , int n , int first , int twice);//查询办法
void StuPrint();//浏览所有学生住宿信息
*/
void AddStu();//添加学生信息
void XXDel();//删除学生信息
void OneDel(char b[]);//一键删除功能
void ReALL();//删除所有学生信息
void ReStu();//更新学生信息
link Studel(link head,int x);//删除学生信息的方法
//-------------------------楼长部分--------------------------------
//-------------------------公用部分--------------------------------
void Return(int a , int b);//返回某一选择界面
void AddSecurity(char a[]);//加密
void DeSecurity(char a[]);//解密
void PassageSet(int a , int b);//密码设置时的二次检查
int P(STU a, STU b);//学生住宿位置的“前后”比较
void PassageHide(char a[]);//隐藏输入密码
void StringGet(char a[]);//防止出现空串
int UserSeek(USER a[] , int n );//宿管账号的检索
void FindStu(int first , int twice);//查询某一学生住宿信息
int StuSeek(link head , int n , int first , int twice);//查询办法
void StuPrint();//浏览所有学生住宿信息
void StuOutE();
//a在原点b的哪个方位,前则返回-1,相等返回0,后则返回1
link StuFread(FILE* fp , int n);//学生信息的文件读入,为与输入函数区别写成Fread,实际使用的是fscanf
void StuFwrite(link head , int n);//学生信息的文件写出
link StuScanf(int n , link HHead);//学生信息的添加输入
link StuSort(link head , link p , int* add);//学生信息的排序
//-------------------------公用部分--------------------------------
//-------------------------宿管部分--------------------------------
void UserFread(FILE* fp ,USER a[] , int n);//宿管账号的读入
void UserFwrite(FILE* fp , USER a[] ,int n);//宿管账号的写出
int UserLogin(FILE* fp , USER a[] ,int n);//宿管账号登录时的检查
void SUGZH();//宿管登录界面
void SUG(USER a[] , int n);//宿管功能选择界面
/*公用处已经声明过了
void FindStu(int first , int twice);//查询某一学生住宿信息
int StuSeek(link head , int n , int first , int twice);//查询办法
void StuPrint();//浏览所有学生住宿信息
*/
void SpareNum();//统计空余床位数量
int SpareChuang(link now);//统计数量的方法
void SpareSeek();//查找空余床位的位置
int SpareCP(link now);//输出具体空余床位
//-------------------------宿管部分--------------------------------
void BeginSet();//系统所有文件初始化的方法
int main(){
enter();
return 0;
}
void enter(){
int sort;
//void debug(){
printf ("\t\t----------欢迎来到学生宿舍管理系统----------\t\t\n\n\n\n");
system("color 0e");//0黑 1深蓝 2绿 3天蓝 4砖红 5暗紫 6暗黄 7亮灰 8暗灰 9蓝
printf ("\t\t请登录您的账号\n\n\n");//a草绿 b青 c淡国旗红 d恶心紫 e浅亮黄色 f白色
//}
//debug();只使用作用域无法达到单独区块赋色
printf ("\t\t\t1.楼长账号\n\n\n\n");
printf ("\t\t\t2.宿管账号\n\n\n\n");
printf ("\t\t(系统初始化后才能使用,若要初始化请与软件开发者联系)\n\n");
printf ("\t\t\t(若想创建账号请与楼长联系)\t\t\n\n");
printf ("\t\t\t(0/非数字字符 退出系统)\t\t\n\n");
printf ("\t\t请选择账号类型(1/2):");
for(int flag = 0; ;){
scanf ("%d" , &sort);
getchar();
switch (sort){
case 812:
BeginSet();
break;
case 2:
SUGZH();
flag++;
break;
case 1:
LOUZH();
flag++;
break;
case 0:
printf("\n\n\n\t\t\t谢谢配合,期待与你下次相见 ^_^\n\n");
exit(0);
default:
printf ("\n\t\t请正确输入,多谢配合:");
}
if(flag){
break;
}
}
}
//-------------------------楼长账号管理部分--------------------------------
void LOUZH(){
system("cls");
int i = 0;
USER pe;
FILE* fp = fopen("楼长账号.txt" ,"ab+");
fread (pe.user , sizeof(user) , 1, fp);
DeSecurity(pe.user);
fread (pe.passage , sizeof(user), 1 , fp);
DeSecurity(pe.passage);
fclose(fp);
printf("\t\t\t楼长账号\n\n");
for(; ;){
printf ("\n\n\t\t账号:");
StringGet(user);
if(strcmp(pe.user , user) != 0){
i++;
if(i != 3){
printf ("\n\n\t\t账号错误请重新输入!");
}else{
printf ("\n\n\t\t错误三次,即将返回主界面(若遗忘请联系软件管理员)\n\n\t\t");
system("pause");
Return(0 , 0);
}
}else{break;}
}
i = 0;
for(; ;){
printf ("\n\n\t\t密码:");
PassageHide(passage);
if(strcmp(pe.passage , passage) != 0){
i++;
if(i == 3){
printf("\n\n\t\t密码错误三次,即将返回主界面(若遗忘请联系软件管理员)\n\n");
system("pause");
Return(0 , 0);
}else{
printf ("\n\n\t\t密码错误,请重新输入!");
}
}else{break;}
}
LOUGN();
}
void LOUGN (){
system("cls");
printf("\t\t请选择以下操作:\n\n\n\t\t\t");
printf("1.账号管理\n\n\n\n\t\t\t");
printf("2.学生信息\n\n\n\n\t\t\t\t");
printf ("9.返回上级界面\n\n\t\t\t\t");
printf("0.退出系统\n\n\t\t");
printf ("请输入:");
int i;
for(int flag = 0; ;){
scanf("%d" , &i);
getchar();//以防意外
switch(i){
case 1:
LOUZHGL();
flag++;
break;
case 2:
XXGL();
flag++;
break;
case 9:
Return(0,0);
break;
case 0:
exit(0);
default:
printf ("\n\t\t请正确输入选项:");
}
if(flag){break;}
}
}
void LOUZHGL(){
USER pe;
FILE* fp = fopen("楼长账号.txt" ,"ab+");
fread (pe.user , sizeof(user) , 1, fp);
DeSecurity(pe.user);
fread (pe.passage , sizeof(user), 1 , fp);
DeSecurity(pe.passage);
fclose(fp);
system("cls");
printf ("\t\t您可以进行的操作\n\n\n\t\t\t");
printf ("1.创建宿管账号\n\n\n\n\t\t\t");
printf ("2.删除宿管账号\n\n\n\n\t\t\t");
printf ("3.重设宿管密码\n\n\n\n\t\t\t");
printf ("4.重设您的用户名和密码\n\n\n\n\t\t\t\t");
printf ("9.返回上级界面\n\n\t\t\t\t");
printf ("0.退出系统\n\n\t\t");
printf ("请选择:");
int i;
for(int flag = 0; ;){
scanf ("%d" , &i);
getchar();//以防万一
switch (i){
case 1:
creat(pe.passage);
flag++;
break;
case 2:
LOUDEL(pe.passage);
flag++;
break;
case 3:
RESET(pe.passage);
flag++;
break;
case 4:
RELOU(pe.passage);
flag++;
break;
case 9:
Return(1 , 0);
break;
case 0:
exit(0);
default :
printf ("\n\t\t请正确输入选项:");
}
if(flag){break;}
}
}
void creat(char b[]){
system("cls");
printf ("\t\t\t创建宿管账号\n\n");
int flag = 0;
int n;
for(; ;){
printf ("\n\n\t\t请输入您的密码:");
PassageHide(temp);
if(strcmp(temp , b) == 0){
char temp[3] = "-1";
system("cls");
printf ("\t\t\t创建宿管账号\n\n");
printf ("\n\n\t\t(一次注册最多不超过100个用户)");
printf ("\n\n\n\n\t\t请输入您要创建多少个账号(0 返回上层):");
for(; ;){
scanf ("%d" , &n);
getchar();
if(n < 0){
printf ("\n\t\t创建数需为正,请重新输入:");
}else if(n == 0){
Return(1,1);
}else if(n <= 100){
FILE* fpA = fopen ("宿管账号.txt" , "ab+");
int sum ;
fread(&sum, sizeof(int) , 1 , fpA );
n += sum;
USER a[n];
UserFread(fpA , a , sum);
fclose(fpA);
for(int i = sum;i < n;i++){
int back = 0;
printf("\n\n\t\t\t这是第%d个创建的账号\n", i-sum+1);
printf ("\n\t\t创建账号名(20个字符以下 -1重置上个账号):");
for(; ;){
StringGet(user);
if(strcmp(user , temp) == 0){
back++;
if(i != sum){
i-=2;
break;
}else{
i--;
printf("\n\n\t\t\t没有上一个啦!");
break;
}
}
int j = UserSeek(a , sum);
if(j == -1){
break;
}else{
printf ("\n\t\t账号已存在,请重新输入:");
}
}
if(back){continue;}
printf("\n\n\t\t第一次输入0将返回上层并取消所有输入\n");
PassageSet(1,1);
strcpy(a[i].user , user);//前面是接收的
//类似于赋值
strcpy(a[i].passage , passage);
}
FILE* fpB = fopen("宿管账号.txt" , "w+");
UserFwrite(fpB , a , n);
fclose(fpB);
Return(1,1);
}else{
printf ("\n\n\t\t一次性创建数不可超过100,请重新输入:");
}
}
}else{
flag++;
if(flag == 3){
printf ("\n\t\t\t密码错误三次,退出系统!");
exit(0);
}else{
printf ("\n\t\t密码错误,请重新输入");
}
}
}
}
void LOUDEL(char b[]){
system("cls");
printf ("\t\t\t宿管账号删除\n\n");
FILE* fp = fopen("宿管账号.txt" , "ab+");
int n, flag = 0;
fread (&n , sizeof(int) , 1 , fp );
USER a[n];
UserFread(fp , a , n);
fclose(fp);
for(; ;){
printf ("\n\n\t\t请输入您的密码:");
PassageHide(temp);
if(strcmp(temp , b) == 0){
system("cls");
printf ("\t\t\t宿管账号删除\n\n");
printf ("\n\n\t\t\t要删除的账号:");
StringGet(user);
int x = UserSeek(a , n);
if(x == -1){
printf("\n\n\n\t\t\t未找到符合账号,返回上层!\n\n\t\t");
system("pause");
}else{
printf("\n\n\n\t\t\t请确认您是否要删除该账号");
printf("\n\n\t\t\t1.确认删除 9.取消操作");
int flag;
scanf("%d" , &flag);
if(flag == 9){Return(1,1);}
for (;x < n - 1;x++){
a[x] = a[x+1];
}
n--;
FILE* fpA = fopen("宿管账号.txt" , "wb+");
UserFwrite(fpA ,a ,n);
fclose(fpA);
printf("\n\n\n\t\t\t成功删除,即将返回上层!\n\n\t\t");
system("pause");
}
Return(1,1);
}else{
flag++;
if(flag == 3){
printf ("\n\n\t\t密码错误三次,返回主界面!\n\n\t\t");
system("pause");
Return(0 , 0);
break;
}
}
}
}
void RELOU(char b[]){
system("cls");
printf ("\t\t\t楼长账号重设\n\n");
char temp[21];
int flag = 0;
for(; ;){
printf ("\n\n\t\t请输入您的旧密码:");
PassageHide(temp);
if(strcmp(temp , b) == 0){
system("cls");
printf ("\t\t\t楼长账号重设\n\n");
printf("\n\n\t\t(若要返回请在新密码处输入数字0)");
printf ("\n\n\t\t请设置新的账号:");
StringGet(user);
PassageSet(1,1);
FILE* fpB = fopen("楼长账号.txt", "wb+");
AddSecurity(user);
AddSecurity(passage);
fwrite (user ,sizeof(user) , 1 , fpB );
fwrite (passage ,sizeof(user) , 1 , fpB );
fclose(fpB);
Return(1 , 1);
break;
}else{
flag++;
if(flag == 3){
printf ("\n\n\t\t密码错误三次,返回主界面!\n\n\t\t");
system("pause");
Return(0 , 0);
break;
}
}
}
}
void RESET(char b[]){
system("cls");
printf("\t\t\t宿管密码重置\n\n");
FILE* fp = fopen("宿管账号.txt" , "ab+");
int n;
int flag = 0;
int flagA = 0;
fscanf (fp , "%d" , &n);
USER a[n];
UserFread(fp , a , n);
for(; ;){
printf ("\n\n\t\t请输入您的密码确认身份:");
PassageHide(temp);
if(strcmp(temp , b) == 0){
system("cls");
printf("\t\t\t宿管密码重置\n\n");
printf ("\n\n\t\t需更改密码的账号:");
for(; ;){
StringGet(user);
int x = UserSeek(a , n);
if(x == -1){
flag++;
if(flag == 3){
printf ("\n\n\t\t三次输入错误,返回上层!\n\n\t\t");
system("pause");
Return(1,1);
break;
}
printf ("\n\n\n\t\t\t您输入的账号不存在,请重新输入!");
printf ("\n\n\t\t账号:");
}else{
printf("\n\n\t\t(若要返回请在新密码处输入数字0)");
PassageSet(1 , 1);
strcpy(a[x].passage , passage);
fclose(fp);
FILE* fpA = fopen("宿管账号.txt" , "wb+");
UserFwrite(fpA ,a ,n);
fclose(fpA);
Return(1,1);
break;
}
}
}else{
flagA++;
if(flagA == 3){
printf ("\n\n\t\t密码错误三次,返回主界面!\n\n\t\t");
system("pause");
Return(0 , 0);
break;
}else{
printf ("\n\t\t密码错误,请重新输入");
}
}
}
}
//-------------------------楼长学生信息管理部分--------------------------------
void XXGL(){
USER pe;
FILE* fp = fopen("楼长账号.txt" ,"ab+");
fread (pe.user , sizeof(user) , 1, fp);
DeSecurity(pe.user);
fread (pe.passage , sizeof(user), 1 , fp);
DeSecurity(pe.passage);
fclose(fp);
system("cls");
printf ("\t\t您可以进行的操作\n\n\n");
printf ("\t\t\t1.录入学生住宿信息\n\n\n");
printf ("\t\t\t2.浏览住宿信息\n\n\n");
printf ("\t\t\t3.删除学生住宿信息\n\n\n");
printf ("\t\t\t4.查询某一学生信息\n\n\n");
printf ("\t\t\t5.更新学生信息\n\n\n");
printf ("\t\t\t6.一键删除学生信息\n\n\n");
printf ("\t\t\t7.输出学生信息到EXCEL表格\n\n\n");
printf ("\t\t\t\t9.返回上级界面\n\n");
printf ("\t\t\t\t0.退出系统\n\n");
int i;
for (; ;){
printf ("\t\t请输入:");
scanf ("%d" , &i);
getchar ();
switch(i){
case 0:
printf("\n\n\t\t");
exit(0);
case 9:
Return(1,0);
break;
case 6:
OneDel(pe.passage);
break;
case 1:
AddStu();
break;
case 2:
StuPrint();
Return(1 , 2);
break;
case 3:
XXDel(pe.passage);
break;
case 4:
FindStu(1 , 2);
break;
case 5:
ReStu(pe.passage);
break;
case 7:
StuOutE();
Return(1 , 2);
break;
default:
printf("\n\n\t\t\t请正确选择,谢谢配合\n\n");
}
}
}
void AddStu(){
system("cls");
int add , n;
printf ("\t\t\t创建学生住宿信息\n\n\n");
printf("\t\t若“返回”请输入数字 0 \n\n");
printf("\t\t要新加入的学生个数:");
for(; ;){
scanf ("%d" , &add);
getchar();
if(add < 0){
printf ("\n\n\t\t创建数需为正:");
}else if(add == 0){
Return (1 , 2);
break;
}else{
break;
}
}
FILE* fp = fopen("学生住宿.txt","ab+");
fscanf(fp ,"%d" , &n);
link head = NULL;
if(n != 0){
head = StuFread(fp , n);
}
fclose(fp);
link temp = StuScanf(add , head);
if(n == 0){
head = temp;
head->before = NULL;
}else{
link now = head;
for(int i = 0;i < n-1;i++){
now = now->next;
}
now->next = temp;
temp->before = now;
}
head = StuSort(head , temp , &add);
StuFwrite(head , n+add);
printf("\n\n\n\t\t录入完成,即将返回上层\n\n\t\t");
system("pause");
Return(1 ,2);
}
void XXDel(char b[]){
system("cls");
printf ("\t\t\t信息删除\n\n");
int n;
FILE* fp = fopen("学生住宿.txt","ab+");
fscanf(fp ,"%d" , &n);
link head = StuFread(fp , n);
fclose(fp);
int flag = 0 , del , i;
for(; ;){
printf ("\n\n\t\t请输入您的密码确认身份:");
PassageHide(temp);
if(strcmp(temp , b) == 0){
system("cls");
printf ("\t\t\t信息删除\n\n");
printf ("\n\n\t\t请输入您要删除的住宿信息个数(0 返回上层):");
for(; ;){
scanf ("%d" , &del);
getchar();
if(del < 0){
printf ("\n\n\t\t请输入正数:");
}else if(del+lou*cen*sushe > n){
printf ("\n\n\t\t删除数大于总人数%d,请重新输入:" , n-lou*sushe*cen);
}else{break;}
}
if(del != 0){
for(i = 0; i < del;i++){
system("cls");
printf("\t\t------这是第%d个删除的信息------\n\n",i+1);
int x = StuSeek(head , n , 1 , 2);
n--;
if(x == -1){
printf ("\n\n\n\t\t\t删除数减一!\n\n\t\t");
n++;
system("pause");
continue;
}else if(x == 0){
head = head->next;
}else{
head = Studel(head, x);
}
}
StuFwrite(head, n);
printf ("\n\n\t\t删除完成,即将返回上层!\n\n\t\t");
system("pause");
}
Return(1,2);
break;
}else{
flag++;
if(flag == 3){
printf ("\n\n\n\t\t密码错误三次,返回主界面!\n\n\t\t");
system("pause");
Return(0 , 0);
break;
}else{
printf ("\n\t\t密码错误,请重新输入");
}
}
}
}
void ReALL(){
system("cls");
printf("\t\t\t清空所有学生信息");
printf("\n\n\t\t\t即将清空所有学生信息,请谨慎确认!");
printf("\n\n\n\t\t\t1. 确认清空\t\t9.返回上层");
printf("\n\n\t\t\t请输入:");
int flagA;
for(; ;){
scanf("%d" , &flagA);
if(flagA == 9){
Return(1 , 2);
}else if(flagA == 1){
FILE* fp = fopen("学生住宿.txt", "wb+");
fprintf(fp, "%d\n", lou*cen*sushe);
for(int i = 1; i <= lou; i++)
{
for(int j = 1; j <= cen; j++)
{
for(int x = 1; x <= sushe; x++)
{
fprintf(fp,"%d\t%d\t%d\t%s\t%s\t%s\n", i, j*100+x,0,"0", "0","0");
}
}
}
fclose(fp);
printf("\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t清除完成!即将返回上层");
printf("\n\n\n\n\t\t\t\t");
system("pause");
Return(1 ,2);
}else{
printf("\n\n\t\t\t请正确输入(谢谢配合):");
}
}
}
void OneDel(char b[]){
system("cls");
printf ("\t\t\t一键删除功能\n\n");
int n;
FILE* fp = fopen("学生住宿.txt","ab+");
fscanf(fp ,"%d" , &n);
link head = StuFread(fp , n);
fclose(fp);
link now = head;
int flag = 0 ,flagA;
for(; ;){
printf ("\n\n\t\t请输入您的密码确认身份:");
PassageHide(temp);
if(strcmp(temp , b) == 0){
STU temp;
system("cls");
printf("\t\t\t一键删除功能\n\n");
int sort;
printf("\n\n\t\t请选择范围");
printf("\n\n\t\t\t1.宿舍清空");
printf("\n\n\n\n\t\t\t2.楼层清空");
printf("\n\n\n\n\t\t\t3.整楼清空");
printf("\n\n\n\n\t\t\t4.全部清空清空");
printf("\n\n\n\n\t\t\t\t9.返回上层");
printf("\n\n\t\t\t\t0.退出系统");
printf("\n\n\t\t请输入:");
for(; ;){
scanf("%d" , &sort);
switch (sort){
case 9:
Return(1,2);
break;
case 0:
exit(0);
case 1:
for(; ;){
printf("\n\n\t\t宿舍:");
scanf("%d" , &temp.suse);
if(temp.suse > 0){
int numA = temp.suse/100;
if(numA > 0 && numA <= cen){
int numB = temp.suse%100;
if(numB != 0 && numB <= sushe){
break;
}else{
printf("\n\n\t\t不存在该宿舍!");
}
}else{
printf("\n\n\t\t不存在该楼层!");
}
}else{
printf("\n\n\t\t请输入正数!");
}
}
printf("\n\n\t\t\t即将清空%d宿舍信息,请谨慎确认!",temp.suse);
printf("\n\n\n\t\t\t1. 确认清空\t\t9.返回上层");
printf("\n\n\t\t\t请输入:");
for(; ;){
scanf("%d" , &flagA);
if(flagA == 1){break;}
else if(flagA == 9){Return(1,2);}
else{printf("\n\n\t\t\t请正确输入:");}
}
for(; ;){
if(now == NULL){break;}
if(now->suse == temp.suse && now->chuang != 0){
now->before->next = now->next;
now->next->before = now->before;
n--;
}
now = now->next;
}
StuFwrite(head , n);
printf("\n\n\n成功清空%d宿舍,即将返回上层\n\n\t\t" ,temp.suse);
system("pause");
Return(1,2);
break;
case 2:
for(; ;){
printf("\n\n\t\t楼层:");
scanf("%d" , &temp.suse);
if(temp.suse > 0){
if(temp.suse <= cen){break;}
else{
printf("\n\n\t\t不存在该楼层!");
}
}else{
printf("\n\n\t\t请输入正数!");
}
}
printf("\n\n\t\t\t即将清空第%d楼层信息,请谨慎确认!",temp.suse);
printf("\n\n\n\t\t\t1. 确认清空\t\t9.返回上层");
printf("\n\n\t\t\t请输入:");
for(; ;){
scanf("%d" , &flagA);
if(flagA == 1){break;}
else if(flagA == 9){Return(1,2);}
else{printf("\n\n\t\t\t请正确输入:");}
}
for(; ;){
if(now == NULL){break;}
if(now->suse/100 == temp.suse && now->chuang != 0){
now->before->next = now->next;
now->next->before = now->before;
n--;
}
now = now->next;
}
StuFwrite(head , n);
printf("\n\n\n成功清空第%d楼层,即将返回上层\n\n\t\t" ,temp.suse);
system("pasuse");
Return(1,2);
break;
case 3:
for (; ;){
printf("\n\n\n\t\t楼号:");
scanf("%d" , &temp.lou);
if(temp.lou >= 1 && temp.lou <= lou){break;}
printf("\n\n\t\t楼号为1~%d!" , lou);
}
printf("\n\n\t\t\t即将清空第%d栋楼,请谨慎确认!",temp.lou);
printf("\n\n\n\t\t\t1. 确认清空\t\t9.返回上层");
printf("\n\n\t\t\t请输入:");
for(; ;){
scanf("%d" , &flagA);
if(flagA == 1){break;}
else if(flagA == 9){Return(1,2);}
else{printf("\n\n\t\t\t请正确输入:");}
}
for(; ;){
if(now == NULL){break;}
if(now->lou == temp.lou && now->chuang != 0){
now->before->next = now->next;
now->next->before = now->before;
n--;
}
now = now->next;
}
StuFwrite(head , n);
printf("\n\n\n成功清空第%d栋楼,即将返回上层\n\n\t\t" ,temp.lou);
system("pasuse");
Return(1,2);
break;
case 4:
ReALL();
Return(1,2);
break;
default:
printf("\n\n\t\t\t请正确输入:");
}
}
}else{
flag++;
if(flag == 3){
printf ("\n\n\n\t\t密码错误三次,返回主界面!\n\n\t\t");
system("pause");
Return(0 , 0);
break;
}else{
printf ("\n\t\t密码错误,请重新输入");
}
}
}
}
void ReStu(char b[]){
system("cls");
printf ("\t\t\t信息更新\n\n");
int n;
FILE* fp = fopen("学生住宿.txt","ab+");
fscanf(fp ,"%d" , &n);
link head = StuFread(fp , n);
fclose(fp);
link now = head;
int flag = 0 , re , i;
for(; ;){
printf ("\n\n\t\t请输入您的密码确认身份:");
PassageHide(temp);
if(strcmp(temp , b) == 0){
system("cls");
printf ("\t\t\t信息更新\n\n");
printf ("\n\n\t\t请输入您要更新的住宿信息个数(0 返回上层):");
for(; ;){
scanf ("%d" , &re);
getchar();
if(re < 0){
printf ("\n\n\t\t请输入正数:");
}else if(re+lou*cen*sushe > n){
printf ("\n\n\t\t更新数大于总人数 %d,请重新输入:" , n-lou*cen*sushe);
}else{break;}
}
if(re != 0){
for(i = 0; i < re;i++){
now = head;
system("cls");
printf("\t\t------以下是 第%d个 学生的信息更新------\n\n" , i+1);
int x = StuSeek(head, n , 1 , 2);
if(x == -1){
printf("\n\n\t\t\t更新数减一!\n\n\t\t\t ");
system("pause");
continue;
}
for(int j = 0;j < x;j++){
now = now->next;
}
printf("\n\n\t\t现有的信息为:%d\t %d\t%d\t%s\t\t%s\t%s" , now->lou , now->suse , now->chuang , now->number , now->name , now->phone);
printf("\n\n\n\t\t1.改变位置(前三项)\t2.改变学生(后三项)\t\t0.取消所有更新\t-1.取消本次更新");
printf("\n\n\t\t请选择更新方式: ");
int sort;
STU temp = *now;
for(; ;){
scanf ("%d" , &sort);
getchar();
if (sort == 1){
for(; ;){
printf("\n\n\t\t新楼层:");
scanf("%d" , &temp.lou);
if(temp.lou >= -1 && temp.lou <= lou){break;}
printf("\n\n\t\t楼号为1~%d!" ,lou);
}
for(; ;){
printf("\n\n\t\t新宿舍:");
scanf("%d" , &temp.suse);
if(temp.suse > 0){
int numA = temp.suse/100;
if(numA > 0 && numA <= cen){
int numB = temp.suse%100;
if(numB != 0 && numB <= sushe){
break;
}else{
printf("\n\n\t\t不存在该宿舍!");
}
}else{
printf("\n\n\t\t不存在该楼层!");
}
}else{
printf("\n\n\t\t请输入正数!");
}
}
for(; ;){
printf("\n\n\t\t床位:");
scanf ("%d" , &temp.chuang);
if(temp.chuang <= 0){
printf("\n\n\t\t请输入正数!");
}else if(temp.chuang > chuangNum){
printf("\n\n\t\t最多%d个床位!" , chuangNum);
}else{
break;
}
}
int more = StuCheek(head , &temp ,1);
if(more){
printf("\n\n\t\t请重新选择更新方式:");
continue;
}
*now = temp;
break;
}else if(sort == 2){
printf("\n\n\t\t新学号:");
StringGet(temp.number);
int more = StuCheek(head , &temp ,2);
if(more){
printf("\n\n\t\t请重新选择更新方式:");
continue;
}
printf("\n\n\t\t新姓名:");
StringGet(temp.name);
more = StuCheek(head , &temp ,3);
if(more){
printf("\n\n\t\t请重新选择更新方式:");
continue;
}
printf("\n\n\t\t新电话:");
StringGet(temp.phone);
more = StuCheek(head , &temp ,4);
if(more){
printf("\n\n\t\t请重新选择更新方式:");
continue;
}
*now = temp;
break;
}else if(sort == 0){
Return(1 , 2);
break;
}else if(sort == -1){
printf("\n\n\t\t\t更新数减一!\n\n\t\t\t");
system("pause");
break;
}else{
printf("\n\t\t请正确输入:");
}
}
}
StuFwrite(head, n);
printf ("\n\n\t\t更新完成,即将返回上层!\n\n\t\t");
system("pause");
}
Return(1,2);
break;
}else{
flag++;
if(flag == 3){
printf ("\n\n\n\t\t密码错误三次,返回主界面!\n\n\t\t");
system("pause");
Return(0 , 0);
break;
}else{
printf ("\n\t\t密码错误,请重新输入");
}
}
}
}
link Studel(link head,int x){
link now = head;
if(x == 0){
head = head->next;
}else{
for(int i = 0;i < x;i++){
now = now->next;
}
printf("\n\n\t\t删除的信息为:%d\t%d\t%d\t%s\t\t%s\t%s\n\n\t\t" , now->lou , now->suse , now->chuang , now->number , now->name , now->phone);
if(now->next != NULL){
now->next->before = now->before;
}
now->before->next = now->next;
}
system("pause");
return head;
}
//-------------------------楼长部分--------------------------------
//-------------------------公用部分--------------------------------
void Return(int a , int b){
system("cls");
if(a == 2){
FILE* fp = fopen("宿管账号.txt" , "ab+");
int n;
fread ( &n, sizeof(int) , 1 , fp);
USER a[n];
UserFread(fp , a , n);
fclose(fp);
SUG(a , n);
}else if(a == 0){
enter();
}else{
if(b == 1){
LOUZHGL();
}else if(b == 2){
XXGL();
}else{
LOUGN();
}
}
}
void AddSecurity(char a[]){
for(int i = 0;a[i] != '\0';i++){
a[i] += i*(i-1)+3;
}
}
void DeSecurity(char a[]){
for(int i = 0;a[i] != '\0';i++){
a[i] -= i*(i-1)+3;
}
}
void PassageSet(int a , int b){
char temp[21];
char check[2] = "0";
for(; ;){
printf ("\n\t\t设置新密码:");
PassageHide(passage);
if(strcmp(passage ,check) == 0){
Return(a , b);
}
printf ("\n\t\t确认密码:");
PassageHide(temp);
if(strcmp(passage, temp) == 0 ){
printf("\n\n\t\t\t设置成功\n\n\t\t\t");
system("pause");
break;
}
if(strcmp(temp , passage) != 0){
printf ("\n\n\t\t对不起,两次密码不一致,请重新设置密码,返回首页请输入数字0\n");
}else if(strlen(temp) < 6 || strlen(passage) < 6){
printf ("\t\t密码不能少于六位数! 0 返回上层\n");
}else{break;}
}
}
int P(STU a, STU b){//返回判断a在原点b的方位,如果a在b前 -1 , a==b 0 , a在b后 1
int flag = 0;
if(a.lou == b.lou){
if(a.suse == b.suse){
if(a.chuang < b.chuang){
flag--;
}else if(a.chuang > b.chuang){
flag++;
}
}else if(a.suse < b.suse){
flag--;
}else{
flag++;
}
}else if(a.lou < b.lou){
flag--;
}else{
flag++;
}
return flag;
}
void PassageHide(char a[]){
char temp;
int flag = 0 , i;
for(i = 0;i < 20;i++){
temp = getch();
switch(temp){
case '\r':
if(i!= 0){
a[i] = '\0';
flag++;
}else{i--;}
break;
case '\b':
if(i != 0){
printf("\b \b");
i-=2;
}else{i--;}
break;
default:
printf("*");
a[i] = temp;
}
if(flag){break;}
}
if(flag == 0){
a[i] = '\0';
}
}
void StringGet(char a[]){
char temp;
for(int i = 0;i < 20;i++){
temp = getch();
if(temp == '\r'){
if(i == 0){
i--;
continue;
}else if(i == 1){
if(a[0] == '0'){
printf("\n\n\t\t0是禁用字符,请重新输入:");
i-=2;
continue;
}else{
a[i] = '\0';
break;
}
}else{
a[i] = '\0';
break;
}
}
if(temp == '\b'){
if(i != 0){
printf("\b \b");
i-=2;
}else{i--;}
continue;
}
a[i] = temp;
printf("%c" , temp);
}
}
int UserSeek(USER a[] , int n){
int i;
for (i = 0;i < n;i++){
if(strcmp(user , a[i].user) == 0){
break;
}
}
if(i == n){
i = -1;
}
return i;
}
void FindStu(int first , int twice){
int n;
system("cls");
FILE* fp = fopen("学生住宿.txt","ab+");
fscanf(fp ,"%d" , &n);
link head = StuFread(fp , n);
fclose(fp);
int i = StuSeek(head , n , 1 , 2);
if(i == -1){
printf("\n\n\t\t并未查询到该学生");
}else{
link now = head;
for(int x = 0;x < i;x++){
now = now->next;
}
printf ("\t\t楼号\t");
printf ("宿舍\t" );
printf ("床位\t" );
printf ("学号\t\t" );
printf ("姓名\t" );
printf ("电话\n" );
printf ("\t\t%d\t" , now->lou);
printf ("%d\t" , now->suse);
printf ("%d\t" , now->chuang);
printf ("%s\t\t" , now->number);
printf ("%s\t" , now->name);
printf ("%s\n" , now->phone);
}
printf("\n\n\t\t即将返回上层\n\n\t\t");
system("pause");
Return(first , twice);
}
int StuSeek(link head , int n , int first , int twice){//返回要下移多少次
int x , i , flag = 0 , flagB = 0;
link now = head;
STU temp;
printf ("\n\n\t\t有以下几种锁定方式");
printf ("\n\n\n\n\t\t\t1.居住位置锁定");
printf ("\n\n\n\n\t\t\t2.学号锁定");
printf ("\n\n\n\n\t\t\t3.姓名锁定");
printf ("\n\n\n\n\t\t\t4.电话锁定");
printf ("\n\n\n\n\t\t\t\t9.返回上层,取消所有操作");
for(; ;){
printf ("\n\n\n\n\t\t请选择:");
scanf("%d" , &x);
getchar();
switch (x){
case 1:
printf ("\n\n\t\t请输入所要查找的");
for (; ;){
printf("\n\n\n\t\t楼号:");
scanf("%d" , &temp.lou);
if(temp.lou >= 1 && temp.lou <= lou){break;}
printf("\n\n\t\t楼号为1~%d!" , lou);
}
for(; ;){
printf("\n\n\t\t宿舍号:");
scanf("%d" , &temp.suse);
if(temp.suse > 0){
int numA = temp.suse/100;
if(numA > 0 && numA <= cen){
int numB = temp.suse%100;
if(numB != 0 && numB <= sushe){
break;
}else{
printf("\n\n\t\t不存在该宿舍!");
}
}else{
printf("\n\n\t\t不存在该楼层!");
}
}else{
printf("\n\n\t\t请输入正数!");
}
}
for(; ;){
printf("\n\n\t\t床位:");
scanf ("%d" , &temp.chuang);
if(temp.chuang <= 0){
printf("\n\n\t\t请输入正数!");
}else if(temp.chuang > chuangNum){
printf("\n\n\t\t最多%d个床位!" , chuangNum);
}else{
break;
}
}
for(i = 0;i < n;i++){
if(P(*now , temp) == 0){
x = i;
break;
}
now = now->next;
}
if(i == n){
printf ("\n\n\t\t您输入的位置未有人入住,请检查是否输入错误");
x = -1;
}
flag++;
break;
case 2:
printf ("\n\n\t\t请输入被查找学号:");
StringGet(temp.number);
for(i = 0;i < n;i++){
if(strcmp(now->number , temp.number) == 0){
x = i;
break;
}
now = now->next;
}
if(i == n){
x = -1;
printf ("\n\n\t\t已存数据中不存在该学号,请检查输入是否有多余字符");
}
flag++;
break;
case 3:
printf ("\n\n\t\t请输入被查找姓名:");
StringGet(temp.name);
for(i = 0;i < n;i++){
if(strcmp(now->name , temp.name) == 0){
x = i;
break;
}
now = now->next;
}
if(i == n){
x = -1;
printf ("\n\n\t\t已存数据中不存在该姓名,请检查输入是否有多余字符");
}
flag++;
break;
case 4:
printf ("\n\n\t\t请输入被查找电话:");
StringGet(temp.phone);
for(i = 0;i < n;i++){
if(strcmp(now->phone , temp.phone) == 0){
x = i;
break;
}
now = now->next;
}
if(i == n){
x = -1;
printf ("\n\n\t\t已存数据中不存在该电话,请检查输入是否有多余字符");
}
flag++;
break;
case 9:
Return(first , twice);
flag++;
break;
default:
printf ("\n\n\n\n\t\t\t请正确选择!");
flagB++;
if(flagB == 3){
printf ("\n\n\n\n\t\t\t错误三次,返回上层!\n\n\t\t");
system("pause");
Return(first ,twice);
}
}
if(flag){
break;
}
}
return x;
}
void StuPrint(){
system("cls");
FILE* fp = fopen("学生住宿.txt" , "ab+");
int n ;
fscanf (fp , "%d" , &n);
link head = StuFread(fp, n);
fclose(fp);
printf ("\t\t楼号\t");
printf ("宿舍\t" );
printf ("床位\t" );
printf ("学号\t\t" );
printf ("姓名\t" );
printf ("电话\n" );
link now = head;
for(; ;){
if(now == NULL){break;}
if(now->chuang != 0){
printf ("\t\t%d\t" , now->lou);
printf ("%d\t" , now->suse);
printf ("%d\t" , now->chuang);
printf ("%s\t\t\t" , now->number);
printf ("%s\t" , now->name);
printf ("%s\n\n" , now->phone);
if(now->next != NULL){
if(now->suse != now->next->suse){
printf("\n");
}
}
}
now = now->next;
}
printf("\n\n\n\n\n\n\n\n\t\t即将返回上级\n\n\n\t\t");
system("pause");
}
void StuOutE(){
FILE* fp = fopen("学生住宿.txt" , "ab+");
int n;
fscanf(fp , "%d" , &n);
link head = StuFread(fp , n);
fclose(fp);
fp = fopen("学生住宿.xls" , "w+");
link temp = head;
fprintf (fp , "楼号\t");
fprintf (fp , "宿舍号\t");
fprintf (fp , "床位\t");
fprintf (fp , "学号\t");
fprintf (fp , "姓名\t");
fprintf (fp , "电话号\n");
for(; ;){
if(temp == NULL){break;}
if(temp->chuang != 0){
fprintf (fp , "%d\t" , temp->lou );
fprintf (fp , "%d\t" , temp->suse );
fprintf (fp , "%d\t" , temp->chuang );
fprintf (fp , "%s\t" , temp->number );
fprintf (fp , "%s\t" , temp->name );
fprintf (fp , "%s\n" , temp->phone);
}
temp = temp->next;
}
fclose(fp);
system("cls");
printf("\n\n\n\n\n\n\n\n\n\t\t\t输出完成即将返回上层\n\n\n\n\n\n\n\n\n");
system("pause");
}
int StuCheek(link head ,link now , int sort){
link temp = head;
int flag = 0;
char a[2] = "0";
if(sort == 1){
for(; ;){
if(temp == NULL || temp == now){break;}
if(strcmp(temp->number , a) != 0 && strcmp(now->number , a) != 0){
if(P(*temp,*now) == 0){
flag++;
break;
}
}
temp = temp->next;
}
}else if(sort == 2){
for(; ;){
if(temp == NULL || temp == now){break;}
if(strcmp(temp->number,now->number) == 0){
flag++;
break;
}
temp = temp->next;
}
}else if(sort == 3){
for(; ;){
if(temp == NULL || temp == now){break;}
if(strcmp(temp->name,now->name) == 0){
flag++;
break;
}
temp = temp->next;
}
}else{
for(; ;){
if(temp == NULL || temp == now){break;}
if(strcmp(temp->phone,now->phone) == 0){
flag++;
break;
}
temp = temp->next;
}
}
if(flag){
printf("\n\n您输入的信息已入住,入住人信息为:%d\t%d\t%d\t%s\t%s\t%s\n\n\t\t",temp->lou ,temp->suse,temp->chuang,temp->number , temp->name , temp->phone);
system("pause");
return 1;
}else{return 0;}
}
link StuFread(FILE* fp ,int n){
link head ;
if(n == 0){
head= NULL;
}else{
head = (link)malloc( sizeof(STU) );
head->before = NULL;
link now = head;
for(int i = 0;i < n;i++){
fscanf( fp,"%d%d%d%s%s%s" , &now->lou , &now->suse , &now->chuang , now->number , now->name , now->phone );
if(i == n-1){break;}
now->next = (link)malloc(sizeof(STU));
now->next->before = now;
now = now->next;
}
now->next = NULL;
}
return head;
}
void StuFwrite(link head , int n){
FILE* fp = fopen("学生住宿.txt" , "wb+");
fprintf (fp , "%d\n" , n);
link temp = head;
for(; ;){
if(temp == NULL){break;}
fprintf (fp , "%d\t" , temp->lou );
fprintf (fp , "%d\t" , temp->suse );
fprintf (fp , "%d\t" , temp->chuang );
fprintf (fp , "%s\t" , temp->number );
fprintf (fp , "%s\t" , temp->name );
fprintf (fp , "%s\n" , temp->phone);
temp = temp->next;
}
fclose(fp);
}
link StuScanf(int n , link HHead){
link head = (link)malloc( sizeof(STU) );
head->before = NULL;
link now = head;
for(int i = 0;i < n ;i++){
printf ("\n\n\t\t------第 %d个 新学生的住宿信息------" , i+1);
if(n > 1){
printf("\n\n\t\t(重置上次输入 楼号处填入 -1)");
}
printf("\n\n\t\t(取消所有输入 楼号处填入 0)");
for (; ;){
printf("\n\n\n\t\t楼号:");
scanf("%d" , &now->lou);
if(now->lou >= -1 && now->lou <= lou){break;}
printf("\n\n\t\t楼号为1~%d!" , lou);
}
switch(now->lou){
case -1:
if(i > 0){
i-= 2;
now = now->before;
continue;//测试证明continue和break的作用形式一样效果不一样
}else{
printf("\n\n\n\t\t没有上一个啦!");
i--;
continue;
}
case 0:
Return (1 ,2);
break;
default:
for(; ;){
printf("\n\n\t\t宿舍号:");
scanf("%d" , &now->suse);
if(now->suse > 0){
int numA = now->suse/100;
if(numA > 0 && numA <= cen){
int numB = now->suse%100;
if(numB != 0 && numB <= sushe){
break;
}else{
printf("\n\n\t\t不存在该宿舍!");
}
}else{
printf("\n\n\t\t不存在该楼层!");
}
}else{
printf("\n\n\t\t请输入正数!");
}
}
for(; ;){
printf("\n\n\t\t床位:");
scanf ("%d" , &now->chuang);
if(now->chuang <= 0){
printf("\n\n\t\t请输入正数!");
}else if(now->chuang > chuangNum){
printf("\n\n\t\t最多%d个床位!" , chuangNum);
}else{
break;
}
}
int flagone = StuCheek(HHead , now , 1 );
int flagtwo = StuCheek(head , now , 1 );
if(flagone || flagtwo){
i--;
continue;
}
printf("\n\n\t\t学号:");
StringGet(now->number);
flagone = StuCheek(HHead , now , 2 );
flagtwo = StuCheek(head , now , 2 );
if(flagone || flagtwo){
i--;
continue;
}
printf("\n\n\t\t姓名:");
StringGet(now->name);
flagone = StuCheek(HHead , now , 3 );
flagtwo = StuCheek(head , now , 3 );
if(flagone || flagtwo){
i--;
continue;
}
printf("\n\n\t\t电话:");
StringGet(now->phone);
flagone = StuCheek(HHead , now , 4 );
flagtwo = StuCheek(head , now , 4 );
if(flagone || flagtwo){
i--;
continue;
}
}
if(i == n-1){break;}
now->next = (link)malloc(sizeof(STU));
now->next->before = now;
now = now->next;
}
now->next = NULL;
return head;
}
link StuSort(link head , link p , int* add){
link now = head;
link temp, flag = p;
for(int i = 1; ;i++){
int sign = 0;
if(flag == NULL){
break;
}
temp = flag;
now = head;
for(;now != temp;){
int j = P(*now , *temp);
if(j == 1){
sign++;
flag = flag->next;
if(temp->next != NULL){
temp->next->before = temp->before;
}
temp->before->next = temp->next;
if(now->before != NULL){
now->before->next = temp;
}else{
head = temp;
}
temp->next = now;
temp->before = now->before;
now->before = temp;
break;
}
now = now->next;
}
if(sign == 0){flag = flag->next;}
}
return head;
}
//-------------------------公用部分--------------------------------
//-------------------------宿管部分--------------------------------
void UserFread(FILE* fp ,USER a[] , int n){
//数组的传递方式别忘了。用指针接收也可以。
for(int i = 0;i < n;i++){
fread (a[i].user , sizeof(user) , 1 ,fp);
fread (a[i].passage , sizeof(user) , 1 ,fp);
DeSecurity(a[i].user);
DeSecurity(a[i].passage);
}
}
void UserFwrite(FILE* fp , USER a[] ,int n){
fwrite (&n,sizeof(int) , 1 , fp );
for(int i = 0;i < n;i++){
AddSecurity(a[i].user);
AddSecurity(a[i].passage);
fwrite (a[i].user ,sizeof(user) , 1 , fp );
fwrite (a[i].passage ,sizeof(user) , 1 , fp );
}
}
int UserLogin(FILE* fp , USER a[] ,int n){
int flagONE = 0;
int flag = 0;
int j;
for(; ;){
printf ("\n\n\t\t账号:");
gets(user);
int i = UserSeek(a , n);
if(i == -1 && flag != 2){
printf ("\n\t\t--用户名不存在,请重新输入--");
}else if(i != -1){
j = 0;
for(; ;){
printf ("\n\n\t\t密码:");
PassageHide(passage);
if( strcmp(a[i].passage , passage) != 0){
j++;
if(j == 3){
printf ("\n\n\n\t\t--密码错误三次,请重新登录!--\n\n\n");
system("pause");
Return(0 , 0);
break;
}else{
printf ("\n\n\t\t\t密码错误,请重新输入!");
}
}else{break;}
}
if(j != 3){flagONE++;break;}//账号和密码输入正确后跳出最外for循环
}
flag++;
if(flag == 3){
printf ("\n\n\t\t账号错误三次,即将返回主界面\n\n");
printf("\n\t\t(若遗忘账号或密码请联系负责人,谢谢配合)\n\n");
system("pause");
Return(0 , 0);
}
}
return flagONE;
}
void SUGZH(){
system("cls");
printf ("\n\n\t\t\t宿管账号");
FILE* fp = fopen("宿管账号.txt" , "ab+");
int n;
fread (&n , sizeof(int) , 1, fp);
USER a[n];
UserFread(fp , a , n);
int flag = UserLogin(fp , a , n);
fclose(fp);
if(flag){
SUG(a , n);
}else{
Return(0 , 0);
}
}
void SUG(USER a[] ,int n){
system("cls");
printf ("\n\t\t您可以执行的操作:");
printf ("\n\n\n\t\t\t1.更改密码");
printf ("\n\n\n\n\t\t\t2.查询学生住宿信息");
printf ("\n\n\n\n\t\t\t3.查询空余床位位置");
printf ("\n\n\n\n\t\t\t4.统计空余床位数量");
printf ("\n\n\n\n\t\t\t5.浏览学生住宿信息");
printf ("\n\n\n\n\t\t\t6.输入住宿信息到EXCEL表格");
printf ("\n\n\t\t\t\t9.返回上级界面");
printf ("\n\n\t\t\t\t0.退出系统");
printf ("\n\n\t\t请输入:");
int i ,flag = 0;
for(; ;){
scanf ("%d" , &i);
getchar();
switch(i){
case 1:
system("cls");
int flag = 0;
printf("\t\t\t宿管密码重设\n\n");
for(; ;){
printf ("\n\n\t\t请输入您的旧密码:");
PassageHide(temp);
if(strcmp(temp , passage) == 0){
system("cls");
printf("\t\t\t宿管密码重设\n\n");
printf("\n\n\t\t(输入 0 返回)\n");
int x = UserSeek(a , n);
printf("\n\n\t\t(若要返回请在新密码处输入数字0)");
PassageSet(2 , 0);
strcpy(a[x].passage , passage );
FILE* fpB = fopen("宿管账号.txt","wb+");
UserFwrite(fpB , a , n);
fclose(fpB);
Return(2 , 0);
break;
}else{
flag++;
if(flag == 3){
printf ("\n\n\t\t\t三次输入错误,返回主界面,请重新进入!\n\n\t\t");
system("pause");
Return(0 , 0);
break;
}else{
printf("\n\n\t\t\t密码错误,请重新输入!");
}
}
}
flag++;
break;
case 2:
FindStu(2 , 0);
flag++;
break;
case 3:
SpareSeek();
flag++;
break;
case 4:
SpareNum();
flag++;
break;
case 5:
StuPrint();
Return(2 , 0);
break;
case 6:
StuOutE();
Return(2 , 0);
break;
case 0:
exit(0);
case 9:
Return(0 , 0);
default:
printf("\n\n\t\t请正确输入:");
}
if(flag){break;}
}
}
void SpareNum(){
system("cls");
printf("\t\t\t空余床位数量统计");
printf("\n\n\n\t\t查询范围");
printf("\n\n\n\n\t\t\t1.楼 2.宿舍(%d个床位)" , chuangNum);
int i , j , num , n , flag = 0;;
FILE* fp = fopen("学生住宿.txt","ab+");
fscanf(fp ,"%d" , &n);
link head = StuFread(fp , n);
fclose(fp);
link now = head;
for(; ;){
printf("\n\n\n\n\t\t请输入(9.返回上层):");
scanf("%d" , &i);
getchar();
switch(i){
case 1:
for(; ;){
printf ("\n\n\t\t请输入所要查找的 楼号(0返回上层):");
scanf("%d" , &z[0].lou);
getchar();
if(z[0].lou > 0 && z[0].lou <= lou){
system("cls");
printf("\n\n\t\t楼号\t宿舍\t空位数");
for(i = 0;i < n;i++){
if(now->lou == z[0].lou){
link temp = now;
for(j = i;j < n;j++){
num = SpareChuang(temp);
printf("\n\n\t\t%d\t%d\t%d" ,temp->lou , temp->suse , num );
flag++;
for(int x = 0;x < chuangNum-num+1;x++){
temp = temp->next;
}
if(temp == NULL || temp->lou != now->lou){
break;
}
if(temp->suse/100 != temp->before->suse/100){
printf("\n\n");
}
}
break;
}
now = now->next;
}
}else if(z[0].lou > lou){
printf("\n\n\t\t\t请输入1~%d楼",lou);
continue;
}else if(z[0].lou < 0){
printf("\n\n\t\t请输入正数,谢谢配合");
}else{
Return(2 , 0);
break;
}
if(i == n){
printf ("\n\n\n\n\t\t未找到您输入的楼号,请检查后重新输入");
}else{break;}
}
break;
case 2:
for(; ;){
printf ("\n\n\t\t请依次输入所要查找的 楼号(0返回上层) 和 宿舍号:");
scanf("%d" , &z[0].lou);
scanf("%d" , &z[0].suse);
getchar();
if(z[0].lou > 0 && z[0].lou <= lou){
system("cls");
printf("\n\t\t楼号\t宿舍\t空位数");
for(i = 0;i < n;i++){
if(now->lou == z[0].lou && now->suse == z[0].suse){
num = SpareChuang(now);
printf("\n\n\t\t%d\t%d\t%d" ,now->lou , now->suse , num );
flag++;
break;
}
now = now->next;
}
}else if(z[0].lou > lou){
printf("\n\n\t\t\t请输入1~%d楼",lou);
continue;
}else if(z[0].lou < 0){
printf("\n\n\t\t请输入正数,谢谢配合");
}else{
Return(2 , 0);
break;
}
if(i == n){
printf ("\n\n\n\n\t\t未找到您输入位置的宿舍,请检查后重新输入");
}else{break;}
}
break;
case 9:
Return(2 , 0);
break;
default:
printf("\n\n\t\t\t请正确输入,谢谢配合!");
}
if(flag){
printf("\n\n\n\n\n\t\t成功打印,即将返回上层\n\n\t\t");
system("pause");
Return(2 , 0);
break;
}
}
}
int SpareChuang(link now){
int num = chuangNum;
for(; ;){
if(now->next == NULL || now->suse != now->next->suse || now->lou != now->next->lou){
break;
}
num--;
now = now->next;
}
return num;
}
void SpareSeek(){
system("cls");
printf("\t\t\t空余床位位置");
printf("\n\n\n\t\t查询范围");
printf("\n\n\n\n\t\t\t1.楼 2.宿舍(%d个床位)" , chuangNum);
int i , j , num , n , flag = 0;
FILE* fp = fopen("学生住宿.txt","ab+");
fscanf(fp ,"%d" , &n);
link head = StuFread(fp , n);
fclose(fp);
for(; ;){
printf("\n\n\n\n\t\t请输入(9.返回上层):");
scanf("%d" , &i);
getchar();
switch(i){
case 1:
for (; ;){
printf("\n\n\n\t\t楼号(0取消查找):");
scanf("%d" , &z[0].lou);
if(z[0].lou >= 0 && z[0].lou <= lou){break;}
printf("\n\n\t\t楼号为1~%d!" , lou);
}
if(z[0].lou == 0){
Return(2 , 0);
break;
}
system("cls");
printf("\n\n\t\t楼号\t宿舍\t空余床位");
link now = head;
for(i = 0;i < n;i++){
if(now->lou == z[0].lou){
link temp = now;
for(j = i;j < n;j++){
num = SpareCP(temp);
j+= num;
for(int x = 0;x < num+1;x++){
temp = temp->next;
}
if(temp == NULL || temp->lou != now->lou ){
break;
}
if(temp->suse/100 != temp->before->suse/100){
printf("\n\n");
}
flag++;
}
break;
}
now = now->next;
}
if(i == n){
printf ("\n\n\n\n\t\t未找到您输入的楼号,请检查后重新输入");
}else{break;}
break;
case 2:
for(; ;){
printf ("\n\n\t\t所要查找的 楼号(0返回上层):");
scanf("%d" , &z[0].lou);
getchar();
if(z[0].lou > 0 && z[0].lou <= lou){
printf ("\n\n\t\t宿舍号:");
scanf("%d" , &z[0].suse);
getchar();
if(z[0].suse <= 0){
printf("\n\n\t\t请重新输入正数,谢谢配合!");
continue;
}else if(z[0].suse/100 == 0 || z[0].suse/100 > cen){
printf("\n\n\t\t楼层不存在,请重新输入!");
continue;
}else if(z[0].suse%100 > sushe){
printf("\n\n\t\t宿舍不存在,请重新输入!");
continue;
}
system("cls");
printf("\n\t\t楼号\t宿舍\t空余床位");
link now = head;
for(i = 0;i < n;i++){
if(now->lou == z[0].lou && now->suse == z[0].suse){
SpareCP(now);
flag++;
break;
}
now = now->next;
}
}else if(z[0].lou > lou){
printf("\n\n\t\t\t请输入1~%d楼",lou);
continue;
}else if(z[0].lou == 0){
Return(2 , 0);
break;
}else{
printf("\n\n\t\t请输入正数,谢谢配合");
}
if(i == n){
printf ("\n\n\n\n\t\t未找到您输入位置的宿舍,请检查后重新输入");
}else{break;}
}
break;
case 9:
Return(2 , 0);
break;
default:
printf("\n\n\t\t\t请正确输入,谢谢配合!");
}
if(flag){
printf("\n\n\n\n\n\t\t成功打印,即将返回上层\n\n\t\t");
system("pause");
Return(2 , 0);
break;
}
}
}
int SpareCP(link now){
int num = 0 , flag = 1;
STU temp = *now;
if(now->chuang == 0 && now->next->chuang != 0){
now = now->next;
}
for(int x = 1;x <= chuangNum ;x++){
temp.chuang = x;
if(P(*now , temp) == 0){
num++;
if(now->next != NULL && now->next->chuang != 0){
now = now->next;
}
}else{
if(flag){
printf("\n\n\t\t%d\t%d\t" ,temp.lou , temp.suse);
flag--;
}
printf("%d " , temp.chuang);
}
}
return num;
}
//-------------------------宿管部分--------------------------------
void BeginSet(){
system("cls");
printf("\n\n\n\n\t\t\t系统初始化会丢失当前所有数据,请确认是否要继续!!");
int i , j ;
printf("\n\n\t\t\t1. 确定 其余任意字符取消:");
scanf("%d" , &i);
getchar();
if(i == 1){
printf("\n\n\n\n\t\t\t系统初始化会丢失当前所有数据,请再次确认是否要继续!!");
printf("\n\n\t\t\t1. 确定 其余任意字符取消:");
scanf("%d" , &j);
getchar();
if(j == 1){
int x = 1;
FILE* fp;
char a[21] = "123456";
AddSecurity(a);
fp = fopen("楼长账号.txt" , "wb+");
fwrite( a , sizeof(a) , 1 ,fp);
fwrite( a , sizeof(a) , 1 ,fp);
fclose(fp);
fp = fopen("宿管账号.txt" , "wb+");
fwrite( &x, sizeof(int) , 1 , fp );//int 类型显示是乱码,但char不会
fwrite( a , sizeof(a) , 1 ,fp);
fwrite( a , sizeof(a) , 1 ,fp);
fclose(fp);
fp = fopen("学生住宿.txt" , "wb+");
fprintf(fp , "%d\n" , lou*cen*sushe);
for(int i = 1;i <= lou;i++){
for(int j = 1;j <= cen;j++){
for(int x = 1;x <= sushe;x++){
fprintf(fp ,"%d\t%d\t%d\t%s\t%s\t%s\n" , i , j*100+x ,0 ,"0" , "0" ,"0");
}
}
}
fclose(fp);
printf("\n\n\t\t\t 初始化完成!");
printf("\n\n\t\t\t 初始宿舍规模为:%d栋楼,%d层 ,%d个宿舍 ,%d个床位!" , lou , cen , sushe , chuangNum);
printf("\n\n\t\t\t 如需更改请与软件开发者联系!");
printf("\n\n\t\t初始账号和密码都为123456\n\n\t\t");
system("pause");
}
}
Return(0 ,0);
}