C语言初学者的第一个系统:宿舍管理系统 2021-05-27

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);
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值