C语言实现班级事务管理系统

班级事务管理系统采用C语言实现,可以用于课程设计和学习,代码有两个文件:班级事务管理系统.cpp和辅助操作.cpp。

班级事务管理系统.cpp代码如下:

#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

#pragma warning(disable:4996)

enum Sex {                                    //性别
    Man, Woman, Unknow                        //男,女,未知
};
enum Type {                                   //缺勤类型
    Late, Absent, Leave                       //迟到,缺席,请假
};
enum State {                                  //考勤信息状态
    No, Yes                                   //未确认,已确认
};
typedef struct attendanceInfo_node* apointer; //考勤信息结点指针类型
struct attendanceInfo_node {                  //考勤信息结点结构
    int X;                                    //编号,即在链表中的序号
    char num[15];                             //学号
    char name[10];                            //姓名
    tm data;                                  //日期
    int n;                                    //第几节
    char subject[25];                         //课程
    char locale[8];                           //地点
    enum Type type;                           //性质
    enum State state;                         //状态
    apointer next;                            //考勤信息结点指针域
};
typedef apointer alklist;                     //考勤信息单链表类型,即头指针类型
typedef struct studentInfo_node* spointer;    //学生信息结点指针类型
struct studentInfo_node {                     //学生信息结点结构
    int X;                                    //编号,即在链表中的序号
    char name[10];                            //姓名
    enum Sex sex;                             //性别
    char grade[8];                            //年级
    char clas[20];                            //班级
    char num[15];                             //学号
    char password[20];                        //密码
    char phone[15];                           //手机
    char idCard[20];                          //身份证
    int times;                                //缺勤次数(非出席次数)
    spointer next;                            //学生信息结点指针域
};
typedef spointer slklist;                     //学生信息单链表类型,即头指针类型

struct student {                              //临时用学生简易信息
    char name[10];                            //姓名
    char num[15];                             //学号
    int times;                                //缺勤次数(非出席次数)
};

//主要功能函数
void Title(); //标题函数,用于输出标题
void Registe(slklist* studentHead, spointer* studentRear); //注册函数,用于用户注册
void Login(int flag); //登录函数,用于用户登录和管理员登录
void Help(); //帮助函数,用于查看程序使用说明书
void AdminMenu(slklist* studentHead, alklist* attendanceHead, apointer* attendanceRear); //管理员菜单函数,用于显示菜单并选择功能
void UserMenu(spointer sp); //用户菜单函数,用于显示菜单并选择功能
void StudentInfo(); //查看学生信息
void Query(); //查询考勤信息
void Add(); //添加考勤信息
void Delete(); //删除考勤信息
void Modify(); //修改考勤信息
void Statistic(); //统计缺勤人员
void Super(); //超级管理权限,暂时无实用功能
void Init(); //初始化系统
void UserInfo(spointer sp); //查看个人信息
void Confirm(spointer sp); //确认个人考勤
void ChangePassword(spointer sp); //修改密码
void outstand();//三好学生评选
//辅助操作函数
void DisplayCursor(int flag); //显示或隐藏光标
void Goto_xy(short x, short y); //定位光标位置到指定坐标
void InputPassword(char* password); //输入密码
void ReadStudentInfo(slklist* studentHead, spointer* studentRear, int flag); //从文件读取学生信息,建立学生信息链表
void WriteStudentInfo(slklist* studentHead); //将学生信息链表写入文件
void ReadAttendanceInfo(alklist* attendanceHead, apointer* attendanceRear, int flag); //从文件读取考勤信息,建立考勤信息链表
void WriteAttendanceInfo(alklist* attendanceHead); //将考勤信息链表写入文件
void Destroy(slklist* studentHead, alklist* attendanceHead); //销毁链表
void QuickSort(int flag, struct student stu[], int left, int right); //快速排序
void selectOutstandingStudents(slklist studentList);//三好学生评选
slklist studentHead = NULL; //学生信息链表头指针
spointer studentRear = NULL; //学生信息链表尾指针
alklist attendanceHead = NULL; //考勤信息链表头指针
apointer attendanceRear = NULL; //考勤信息链表尾指针

//主函数
int main() {
    char choice;
    ReadStudentInfo(&studentHead, &studentRear, 1); //建立学生信息链表
    ReadAttendanceInfo(&attendanceHead, &attendanceRear, 1); //建立考勤信息链表
    SetConsoleTitle(TEXT("◇ 班 级 事 务 管 理 系 统 ◇")); //设置控制台标题
    do { //欢迎界面
        system("cls");
        printf("\n\t\t\t=====================================================================\n");
        printf("\t\t\t  ===============                                   ===============\n");
        printf("\t\t\t   ◇=========== 欢 迎 使 用 班 级 事 务 管 理 系 统 ===========◇\n");
        printf("\t\t\t  ===============          by-Li Cheng                  ===============\n");
        printf("\t\t\t=====================================================================\n\n\n\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                             1.学生模式\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                             2.管理模式\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                             3. 帮  助\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                             4.退出系统\n");
        printf("\t\t\t                        --------------------\n");
        DisplayCursor(0); //隐藏光标
        choice = _getch();
        switch (choice) {
        case '1': //用户模式
            do { //用户登录注册选择界面
                system("cls");
                Title();
                printf("\t\t\t                            请登录或注册\n");
                printf("\t\t\t                        --------------------\n");
                printf("\t\t\t                               1.登录\n");
                printf("\t\t\t                        --------------------\n");
                printf("\t\t\t                               2.注册\n");
                printf("\t\t\t                        --------------------\n");
                printf("\t\t\t                               3.取消\n");
                printf("\t\t\t                        --------------------\n");
                choice = _getch();
                if (choice == '1') { //登录
                    Login(0);
                    break;
                }
                else if (choice == '2') { //注册
                    Registe(&studentHead, &studentRear);
                    break;
                }
                else if (choice == '3') //取消,返回欢迎界面
                    break;
            } while (1);
            break;
        case '2':Login(1); break; //管理模式
        case '3':Help(); break; //帮助
        case '4':exit(0); //退出系统
        }
    } while (1);
    return 0;
}

//标题函数,用于输出标题
void Title() {
    system("cls");
    printf("\n\t\t\t                    ◇ 班 级 事 务 管 理 系 统 ◇\n");
    printf("\t\t\t=====================================================================\n\n");
}

//注册函数,用于用户注册
void Registe(slklist* studentHead, spointer* studentRear) {
    while (1) {
        Title();
        printf("\t\t\t                              用户注册\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
        printf("\t\t\t                ┃ 姓    名:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 性    别:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 年    级:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 班    级:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 学    号:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 密    码:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 确认密码:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 手    机:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 身 份 证:                      ┃\n");
        printf("\t\t\t                ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
        spointer sp = NULL, sp1 = (*studentHead);
        int exist = 0; //学号是否已注册
        if ((sp = (spointer)malloc(sizeof(struct studentInfo_node))) == NULL) {
            printf("内存申请出错!\n");
            exit(-1);
        }
        memset(sp, 0, sizeof(struct studentInfo_node));
        char sexs[10], sex[3], password1[20], choice;
        sp->X = (*studentRear)->X + 1;
        DisplayCursor(1); //显示光标
        Goto_xy(52, 7); //设置光标位置
        scanf("%s", sp->name); //输入姓名
        Goto_xy(52, 9);
        scanf("%s", sexs); //输入性别
        strncpy(sex, sexs, 2);
        sex[2] = '\0';
        if (strcmp("男", sex) == 0)
            sp->sex = Man;
        else if (strcmp("女", sex) == 0)
            sp->sex = Woman;
        else
            sp->sex = Unknow;
        Goto_xy(52, 11);
        scanf("%s", sp->grade); //输入年级
        Goto_xy(52, 13);
        scanf("%s", sp->clas); //输入班级
        Goto_xy(52, 15);
        scanf("%s", sp->num); //输入学号
        while (sp1 != NULL) { //检测学号是否已经注册
            if (strcmp(sp1->num, sp->num) == 0) {
                exist = 1;
                break;
            }
            sp1 = sp1->next;
        }
        if (exist) { //学号已注册
            MessageBeep(MB_ICONHAND); //发出错误警报声
            printf("\n\n\n\n\n\n\n\n\n\n\t\t\t                     该学号已注册,请重新注册!\n\n");
            printf("\t\t\t                          1.确定    2.取消\n");
            DisplayCursor(0); //隐藏光标
            choice = _getch();
            if (choice == '1' || choice == '\r') {
                free(sp);
                continue;
            }
            else
                break;
        }
        Goto_xy(52, 17);
        InputPassword(sp->password); //输入密码
        Goto_xy(52, 19);
        InputPassword(password1); //输入确认密码
        if (strcmp(sp->password, password1) != 0) { //两次密码不相同
            MessageBeep(MB_ICONHAND);
            printf("\n\n\n\n\n\n\n\t\t\t                    两次密码不相同,请重新注册!\n\n");
            printf("\t\t\t                          1.确定    2.取消\n");
            DisplayCursor(0); //隐藏光标
            choice = _getch();
            if (choice == '1' || choice == '\r') {
                free(sp);
                continue;
            }
            else
                break;
        }
        Goto_xy(52, 21);
        scanf("%s", sp->phone); //输入手机
        Goto_xy(52, 23);
        scanf("%s", sp->idCard); //输入身份证
        sp->times = 0;
        sp->next = NULL;
        printf("\n\n\t\t\t                      是否用以上信息进行注册?\n\n");
        printf("\t\t\t                          1.确定    2.取消\n");
        DisplayCursor(0); //隐藏光标
        choice = _getch();
        if (choice == '1' || choice == '\r') {
            (*studentRear)->next = sp;
            *studentRear = sp;
            WriteStudentInfo(studentHead);
            Title();
            printf("\t\t\t                              注册成功\n");
            printf("\t\t\t                        --------------------\n\n\n");
            printf("\t\t\t                     \33[31m请牢记您的账号(学号)和密码\33[0m\n\n");
            printf("\t\t\t                      账号:%s\n", (*studentRear)->num);
            printf("\t\t\t                      密码:%s\n\n\n\n", (*studentRear)->password);
            DisplayCursor(1); //显示光标
            system("pause");
        }
        else
            free(sp);
        break;
    }
}

//登录函数,用于用户登录和管理员登录
void Login(int flag) {
    while (1) {
        Title();
        flag ? printf("\t\t\t                             管理员登录\n") : printf("\t\t\t                              用户登录\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                    ┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
        printf("\t\t\t                    ┃ 账号:                  ┃\n");
        printf("\t\t\t                    ┣━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                    ┃ 密码:                  ┃\n");
        printf("\t\t\t                    ┗━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
        spointer sp = studentHead;
        char account[15], password[20];
        char choice;
        int i, j, exist = 0; //exist表示账号是否存在
        DisplayCursor(1); //显示光标
        Goto_xy(52, 7); //设置光标位置
        scanf("%s", account);
        Goto_xy(52, 9);
        InputPassword(password);
        if (flag) { //管理员登录
            if (strcmp("admin", account) == 0 && strcmp("admin", password) == 0) { //登录成功
                DisplayCursor(0); //隐藏光标
                Title();
                printf("\t\t\t                              登录成功\n");
                printf("\t\t\t                        --------------------\n\n\n");
                printf("\t\t\t                      欢迎使用班级事务管理系统\n\n");
                printf("\t\t\t                       正在进入管理员菜单界面\n\n");
                printf("\t\t\t                      ┏━━━━━━━━━━━━━━━━━━━━━┓\n");
                printf("\t\t\t                      ┃                     ┃\n");
                printf("\t\t\t                      ┗━━━━━━━━━━━━━━━━━━━━━┛\n");
                Goto_xy(48, 13);
                j = 2500;
                for (i = 1; i <= 10; i++) {
                    printf("\33[36m★\33[0m");
                    Beep(j, 500);
                    j -= 200;
                }
                AdminMenu(&studentHead, &attendanceHead, &attendanceRear);
            }
            else { //登录失败
                MessageBeep(MB_ICONHAND);
                printf("\n\n\n\t\t\t                    账号或密码错误,请重新登录!\n\n");
                printf("\t\t\t                          1.确定    2.取消\n");
                DisplayCursor(0); //隐藏光标
                choice = _getch();
                if (choice == '1' || choice == '\r')
                    continue;
                else
                    break;
            }
        }
        else { //用户登录
            while (sp != NULL) {
                if (strcmp(sp->num, account) == 0)
                    break;
                sp = sp->next;
            }
            if (sp != NULL && strcmp(sp->num, account) == 0 && strcmp(sp->password, password) == 0) { //登录成功
                DisplayCursor(0); //隐藏光标
                Title();
                printf("\t\t\t                              登录成功\n");
                printf("\t\t\t                        --------------------\n\n\n");
                printf("\t\t\t                      欢迎使用班级事务管理系统\n\n");
                printf("\t\t\t                        正在进入用户菜单界面\n\n");
                printf("\t\t\t                      ┏━━━━━━━━━━━━━━━━━━━━━┓\n");
                printf("\t\t\t                      ┃                     ┃\n");
                printf("\t\t\t                      ┗━━━━━━━━━━━━━━━━━━━━━┛\n");
                Goto_xy(48, 13);
                j = 500;
                for (i = 1; i <= 10; i++) {
                    printf("\33[36m■\33[0m");
                    Beep(j, 500);
                    j += 200;
                }
                UserMenu(sp);
            }
            else { //登录失败
                MessageBeep(MB_ICONHAND);
                printf("\n\n\n\t\t\t                    账号或密码错误,请重新登录!\n\n");
                printf("\t\t\t                          1.确定    2.取消\n");
                DisplayCursor(0); //隐藏光标
                choice = _getch();
                if (choice == '1' || choice == '\r')
                    continue;
                else
                    break;
            }
        }
    }
}

//帮助函数,用于查看程序使用说明书
void Help() {
    char choice;
    int times = 1;
    system("cls");
    printf("\33[10B"); //光标下移10行
    printf("\t\t\t       ■      ■     ■■■■■     ■             ■■■■■\n");
    printf("\t\t\t       ■      ■     ■             ■             ■      ■\n");
    printf("\t\t\t       ■      ■     ■             ■             ■      ■\n");
    printf("\t\t\t       ■■■■■     ■■■■■     ■             ■■■■■\n");
    printf("\t\t\t       ■      ■     ■             ■             ■\n");
    printf("\t\t\t       ■      ■     ■             ■             ■\n");
    printf("\t\t\t       ■      ■     ■■■■■     ■■■■■     ■\n");
    while (times <= 2) {
        printf("\33[7A\33[31m");
        printf("\t\t\t       ■      ■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■■■■■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■■■■■     ■■■■■     ■\n");
        Sleep(300);
        printf("\33[7A\33[32m");
        printf("\t\t\t       ■      ■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■■■■■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■■■■■     ■■■■■     ■\n");
        Sleep(300);
        printf("\33[7A\33[33m");
        printf("\t\t\t       ■      ■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■■■■■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■■■■■     ■■■■■     ■\n");
        Sleep(300);
        printf("\33[7A\33[34m");
        printf("\t\t\t       ■      ■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■■■■■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■■■■■     ■■■■■     ■\n");
        Sleep(300);
        printf("\33[7A\33[35m");
        printf("\t\t\t       ■      ■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■■■■■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■■■■■     ■■■■■     ■\n");
        Sleep(300);
        printf("\33[7A\33[36m");
        printf("\t\t\t       ■      ■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■      ■     ■             ■             ■      ■\n\t\t\t       ■■■■■     ■■■■■     ■             ■■■■■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■             ■             ■\n\t\t\t       ■      ■     ■■■■■     ■■■■■     ■\n");
        Sleep(300);
        printf("\33[0m"); //关闭所有输出属性,恢复至默认
        times++;
    }
    DisplayCursor(1); //显示光标
    Title();
    printf("\t\t\t                                帮助\n");
    printf("\t\t\t                        --------------------\n\n");
    printf("1、选项:在选项界面按相应数字即可进入相应功能界面;在确认&取消选项中,按「1」或「回车」键即为确认,其他键为取消。\n\n");
    printf("2、注册:已注册的学号不允许再注册;相应学生信息允许的最长字符数为:姓名-9,年级-7,班级-19,学号-14,密码-19,手机-14,身份证-19。\n\n");
    printf("3、登录:学生登录使用注册时的学号和密码进行登录;管理员登录使用特定的账号和密码进行登录。\n\n");
    printf("4、. . . . . . \n\n");
    printf("\n按「1」可打开查看详细程序设计说明书,按其他键返回菜单界面. . . ");
    while(1) {
        choice = _getch();
        if (choice == '1')
            system("start 「班级考勤管理系统」程序设计说明书.doc"); //打开程序设计说明书Word文件
        else
            break;
    }
}

//管理员菜单函数,用于显示菜单并选择功能
void AdminMenu(slklist* studentHead, alklist* attendanceHead, apointer* attendanceRear) {
    char choice;
    while (1) {
        Title();
        printf("\t\t\t                         请选择要进行的操作\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           1.查看学生信息\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           2.查询考勤信息\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           3.添加考勤信息\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           4.删除考勤信息\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           5.修改考勤信息\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           6.统计缺勤人员\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           7.超级管理权限\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           8.初始化系统\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           9.退出系统\n");
        printf("\t\t\t                        --------------------\n");
        DisplayCursor(0); //隐藏光标
        choice = _getch();
        switch (choice) {
        case '1':StudentInfo(); break; //查看学生信息
        case '2':Query(); break; //查询考勤信息
        case '3':Add(); break; //添加考勤信息
        case '4':Delete(); break; //删除考勤信息
        case '5':Modify(); break; //修改考勤信息
        case '6':Statistic(); break; //统计缺勤人员
        case '7':Super(); break; //超级管理权限,暂时无实用功能
        case '8':Init(); break; //初始化系统
        case '9':outstand();//评选三好学生
        case '10':exit(0); //退出系统
        }
    }
}

//用户菜单函数,用于显示菜单并选择功能
void UserMenu(spointer sp) {
    char choice;
    while (1) {
        Title();
        printf("\t\t\t                         请选择要进行的操作\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           1.查看个人信息\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           2.确认个人考勤\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           3.查询考勤信息\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           4.统计缺勤人员\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           5.修改密码\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           6.退出系统\n");
        printf("\t\t\t                        --------------------\n");
        DisplayCursor(0); //隐藏光标
        choice = _getch();
        switch (choice) {
        case '1':UserInfo(sp); break; //查看个人信息
        case '2':Confirm(sp); break; //确认个人考勤
        case '3':Query(); break; //查询考勤信息
        case '4':Statistic(); break; //统计缺勤人员
        case '5':ChangePassword(sp); break; //修改密码
        case '6':exit(0); //退出系统
        }
    }
}

//查看学生信息
void StudentInfo() {
    Title();
    printf("\t\t\t                            查看学生信息\n");
    printf("\t\t\t                        --------------------\n");
    int amount = studentRear->X, n, i = 11;
    spointer sp = studentHead->next;
    DisplayCursor(1); //显示光标
    if (amount == 0)
        printf("系统共存有\33[36m0\33[0m位学生的信息!\n");
    else {
        printf("系统共存有\33[36m%d\33[0m位学生的信息,具体如下:\n\n", amount);
        printf("\t\t\t         ┏━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓\n");
        printf("\t\t\t         ┃  编号 ┃    姓名   ┃      学号     ┃  缺勤次数 ┃\n");
        while (sp != NULL) {
            printf("\t\t\t         ┣━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━━━━━╋━━━━━━━━━━━┫\n");
            printf("\t\t\t         ┃       ┃           ┃               ┃           ┃\n");
            Goto_xy(37, i);
            printf("%02d", sp->X);
            Goto_xy(46, i);
            printf("%s", sp->name);
            Goto_xy(56, i);
            printf("%s", sp->num);
            Goto_xy(74, i);
            printf("%d次\n", sp->times);
            i += 2;
            sp = sp->next;
        }
        printf("\t\t\t         ┗━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━━━━┻━━━━━━━━━━━┛\n");
        printf("\n请输入要查看的学生编号(输入0可返回菜单界面):");
        scanf("%d", &n);
        if (n == 0) //返回菜单界面
            return;
        else if (n >= 1 && n <= studentRear->X) {
            Title();
            printf("\t\t\t                            查看学生信息\n");
            printf("\t\t\t                        --------------------\n");
            printf("\t\t\t                ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
            printf("\t\t\t                ┃ 姓    名:                      ┃\n");
            printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
            printf("\t\t\t                ┃ 性    别:                      ┃\n");
            printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
            printf("\t\t\t                ┃ 年    级:                      ┃\n");
            printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
            printf("\t\t\t                ┃ 班    级:                      ┃\n");
            printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
            printf("\t\t\t                ┃ 学    号:                      ┃\n");
            printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
            printf("\t\t\t                ┃ 密    码:                      ┃\n");
            printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
            printf("\t\t\t                ┃ 手    机:                      ┃\n");
            printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
            printf("\t\t\t                ┃ 身 份 证:                      ┃\n");
            printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
            printf("\t\t\t                ┃ 缺勤次数:                      ┃\n");
            printf("\t\t\t                ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
            apointer ap = attendanceHead->next;
            sp = studentHead->next;
            int i = 1;
            while (sp != NULL) {
                if (sp->X == n)
                    break;
                sp = sp->next;
            }
            Goto_xy(52, 7);
            printf("%s", sp->name);
            Goto_xy(52, 9);
            if (sp->sex == Man)
                printf("男");
            else if (sp->sex == Woman)
                printf("女");
            else
                printf("未知");
            Goto_xy(52, 11);
            printf("%s", sp->grade);
            Goto_xy(52, 13);
            printf("%s", sp->clas);
            Goto_xy(52, 15);
            printf("%s", sp->num);
            Goto_xy(52, 17);
            printf("%s", sp->password);
            Goto_xy(52, 19);
            printf("%s", sp->phone);
            Goto_xy(52, 21);
            printf("%s", sp->idCard);
            Goto_xy(52, 23);
            printf("%d次", sp->times);
            printf("\n\n");
            if (sp->times != 0) { //该学生考勤信息条数不为0
                printf("该学生共有\33[36m%d\33[0m条考勤信息,具体如下:\n\n", sp->times);
                printf("序号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
                while (ap != NULL) {
                    if (strcmp(sp->num, ap->num) == 0) {
                        printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", i, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
                        if (ap->type == Late)
                            printf("迟到   ");
                        else if (ap->type == Absent)
                            printf("缺席   ");
                        else
                            printf("请假   ");
                        if (ap->state == No)
                            printf("\33[31m未确认\33[0m\n");
                        else
                            printf("\33[32m已确认\33[0m\n");
                        i++;
                    }
                    ap = ap->next;
                }
            }
            else //该学生考勤信息条数为0
                printf("该学生共有\33[36m0\33[0m条考勤信息!\n");
        }
        else
            printf("\a\n\n\t\t\t                            编号输入错误!\n");
    }
    printf("\n");
    system("pause");
}

//查询考勤信息
void Query() {
    Title();
    printf("\t\t\t                            查询考勤信息\n");
    printf("\t\t\t                        --------------------\n");
    printf("\t\t\t                            1.按条件查询\n");
    printf("\t\t\t                        --------------------\n");
    printf("\t\t\t                            2.查看全部\n");
    printf("\t\t\t                        --------------------\n");
    printf("\t\t\t                            3.取消\n");
    printf("\t\t\t                        --------------------\n");
    char choice;
    apointer ap = attendanceHead->next;
    DisplayCursor(0); //隐藏光标
    while (1) {
        choice = _getch();
        if (choice == '1' || choice == '2' || choice == '3')
            break;
    }
    if (choice == '3') //取消,返回菜单界面
        return;
    else if (choice == '2') { //查看全部考勤信息
        Title();
        printf("\t\t\t                            查询考勤信息\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                              查看全部\n\n");
        printf("系统共存有\33[36m%d\33[0m条考勤信息,具体如下:\n\n", attendanceRear->X);
        printf("编号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
        while (ap != NULL) {
            printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", ap->X, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
            if (ap->type == Late)
                printf("迟到   ");
            else if (ap->type == Absent)
                printf("缺席   ");
            else
                printf("请假   ");
            if (ap->state == No)
                printf("\33[31m未确认\33[0m\n");
            else
                printf("\33[32m已确认\33[0m\n");
            ap = ap->next;
        }
    }
    else { //按条件查询考勤信息
        enum Type type;
        enum State state;
        char num[15], name[10], data[11], n[3], subject[25], locale[8], type0[5], state0[7], str[5];
        int flag = 1, amount = 0;
        Title();
        printf("\t\t\t                            查询考勤信息\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                             按条件查询\n\n");
        printf("请输入查询参数(未输入的参数将默认输出所有符合项):\n");
        printf("注:日期格式:xxxx-xx-xx,性质:迟到/缺勤/请假,状态:未确认/已确认\n");
        printf("\t┏━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━┳━━━━━━━━━┓\n");
        printf("\t┃      学号     ┃   姓名  ┃    日期   ┃ 第几节┃            课程           ┃   地点  ┃  性质 ┃   状态  ┃\n");
        printf("\t┣━━━━━━━━━━━━━━━╋━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━╋━━━━━━━╋━━━━━━━━━┫\n");
        printf("\t┃               ┃         ┃           ┃       ┃                           ┃         ┃       ┃         ┃\n");
        printf("\t┗━━━━━━━━━━━━━━━┻━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━┻━━━━━━━┻━━━━━━━━━┛\n");
        DisplayCursor(1); //显示光标
        rewind(stdin); //清空键盘缓冲区
        Goto_xy(10, 13); gets_s(num);
        Goto_xy(27, 13); gets_s(name);
        Goto_xy(36, 13); gets_s(data);
        Goto_xy(50, 13); gets_s(n);
        Goto_xy(60, 13); gets_s(subject);
        Goto_xy(85, 13); gets_s(locale);
        Goto_xy(95, 13); gets_s(type0);
        Goto_xy(103, 13); gets_s(state0);
        printf("\n\n编号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
        while (ap != NULL) { //查找符合条件的考勤信息,并输出
            flag = 1;
            if (strcmp(num, "\0") != 0)
                flag = flag && !strcmp(ap->num, num);
            if (strcmp(name, "\0") != 0)
                flag = flag && !strcmp(ap->name, name);
            if (strcmp(data, "\0") != 0) {
                strncpy(str, data, 4);
                flag = flag && (ap->data.tm_year + 1900 == atof(str));
                str[0] = data[5]; str[1] = data[6]; str[2] = '\0';
                flag = flag && (ap->data.tm_mon + 1 == atof(str));
                str[0] = data[8]; str[1] = data[9]; str[2] = '\0';
                flag = flag && (ap->data.tm_mday == atof(str));
            }
            if (strcmp(n, "\0") != 0)
                flag = flag && (ap->n == atof(n));
            if (strcmp(subject, "\0") != 0)
                flag = flag && !strcmp(ap->subject, subject);
            if (strcmp(locale, "\0") != 0)
                flag = flag && !strcmp(ap->locale, locale);
            if (strcmp(type0, "\0") != 0) {
                if (strcmp(type0, "迟到") == 0)
                    type = Late;
                if (strcmp(type0, "缺席") == 0)
                    type = Absent;
                if (strcmp(type0, "请假") == 0)
                    type = Leave;
                flag = flag && (ap->type == type);
            }
            if (strcmp(state0, "\0") != 0) {
                if (strcmp(state0, "未确认") == 0)
                    state = No;
                if (strcmp(state0, "已确认") == 0)
                    state = Yes;
                flag = flag && (ap->state == state);
            }
            if (flag) {
                amount++;
                printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", ap->X, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
                if (ap->type == Late)
                    printf("迟到   ");
                else if (ap->type == Absent)
                    printf("缺席   ");
                else
                    printf("请假   ");
                if (ap->state == No)
                    printf("\33[31m未确认\33[0m\n");
                else
                    printf("\33[32m已确认\33[0m\n");
            }
            ap = ap->next;
        }
        printf("\n\n\t\t\t                     共查询到以上\33[36m%d\33[0m条考勤信息!\n", amount);
    }
    printf("\n");
    DisplayCursor(1); //显示光标
    system("pause");
}

//添加考勤信息
void Add() {
    while (1) {
        int year, month, flag = 0;
        char choice;
        apointer ap;
        spointer sp = studentHead->next;
        if ((ap = (apointer)malloc(sizeof(struct attendanceInfo_node))) == NULL) {
            printf("内存申请出错!\n");
            system("pause");
            return;
        }
        memset(ap, 0, sizeof(struct attendanceInfo_node));
        Title();
        printf("\t\t\t                            添加考勤信息\n");
        printf("\t\t\t                        --------------------\n");
        DisplayCursor(1); //显示光标
        ap->X = attendanceRear->X + 1;
        printf("\t\t\t请输入[学号]:");
        scanf("%s", ap->num);
        printf("\t\t\t请输入[姓名]:");
        scanf("%s", ap->name);
        printf("\t\t\t请输入[日期](格式:xxxx-xx-xx):");
        scanf("%u-%u-%u", &year, &month, &ap->data.tm_mday);
        ap->data.tm_year = year - 1900;
        ap->data.tm_mon = month - 1;
        printf("\t\t\t请输入[第几节]:");
        scanf("%d", &ap->n);
        printf("\t\t\t请输入[课程]:");
        scanf("%s", ap->subject);
        printf("\t\t\t请输入[地点]:");
        scanf("%s", ap->locale);
        printf("\t\t\t请选择[性质]:1.迟到  2.缺席  3.请假\n");
        while (1) {
            DisplayCursor(0); //隐藏光标
            choice = _getch();
            if (choice == '1') {
                ap->type = Late;
                printf("\33[1A\t\t\t请选择[性质]:迟到                   \n\n");
            }
            else if (choice == '2') {
                ap->type = Absent;
                printf("\33[1A\t\t\t请选择[性质]:缺席                   \n\n");
            }
            else if (choice == '3') {
                ap->type = Leave;
                printf("\33[1A\t\t\t请选择[性质]:请假                   \n\n");
            }
            else
                continue;
            break;
        }
        ap->state = No;
        ap->next = NULL;
        printf("编号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
        printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", ap->X, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
        if (ap->type == Late)
            printf("迟到   ");
        else if (ap->type == Absent)
            printf("缺席   ");
        else
            printf("请假   ");
        printf("\33[31m未确认\33[0m\n\n\n");
        printf("\t\t\t                      是否确定添加该考勤信息?\n\n");
        printf("\t\t\t                          1.确定    2.取消\n");
        choice = _getch();
        if (choice == '1' || choice == '\r') {
            while (sp != NULL) {
                if (strcmp(sp->num, ap->num) == 0 && strcmp(sp->name, ap->name) == 0) {
                    sp->times++;
                    WriteStudentInfo(&studentHead);
                    attendanceRear->next = ap;
                    attendanceRear = ap;
                    WriteAttendanceInfo(&attendanceHead);
                    flag = 1;
                    break;
                }
                sp = sp->next;
            }
            if (!flag) {
                printf("\a\n\n\t\t\t                        学号或姓名输入错误!\n\n");
                DisplayCursor(1); //显示光标
                system("pause");
                break;
            }
            printf("\33[3A\t\t\t                                                \n");
            printf("\33[1A\t\t\t                  考勤信息添加成功,是否继续添加?\n\n");
            printf("\t\t\t                          1.确定    2.取消\n");
            choice = _getch();
            if (choice == '1' || choice == '\r')
                continue;
        }
        break;
    }
}

//删除考勤信息
void Delete() {
    Title();
    printf("\t\t\t                            删除考勤信息\n");
    printf("\t\t\t                        --------------------\n");
    int n, amount = attendanceRear->X;
    spointer sp = studentHead->next;
    apointer ap = attendanceHead->next, aq;
    DisplayCursor(1); //显示光标
    if (amount == 0) { //无考勤信息可删除
        printf("系统共存有\33[36m0\33[0m条考勤信息!\n\n");
        system("pause");
        return;
    }
    printf("系统共存有\33[36m%d\33[0m条考勤信息,具体如下:\n\n", amount);
    printf("编号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
    while (ap != NULL) {
        printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", ap->X, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
        if (ap->type == Late)
            printf("迟到   ");
        else if (ap->type == Absent)
            printf("缺席   ");
        else
            printf("请假   ");
        if (ap->state == No)
            printf("\33[31m未确认\33[0m\n");
        else
            printf("\33[32m已确认\33[0m\n");
        ap = ap->next;
    }
    printf("\n请输入要删除的考勤信息编号(输入0可删除全部,输入-1可返回菜单界面):");
    scanf("%d", &n);
    if (n == -1) //返回菜单界面
        return;
    else if (n == 0) { //删除全部考勤信息
        while (ap != NULL) {
            aq = ap->next;
            free(ap);
            ap = aq;
        }
        attendanceHead->next = NULL;
        attendanceRear = attendanceHead;
        WriteAttendanceInfo(&attendanceHead);
        while (sp != NULL) {
            sp->times = 0;
            sp = sp->next;
        }
        WriteStudentInfo(&studentHead);
        printf("\n\n\t\t\t                     成功删除以上\33[36m%d\33[0m条考勤信息!\n", amount);
    }
    else if (n >= 1 && n <= amount) { //删除指定编号考勤信息
        ap = attendanceHead->next;
        while (ap != NULL) {
            if (ap->X == n - 1) {
                aq = ap->next;
                ap->next = aq->next;
                sp = studentHead->next;
                while (sp != NULL) {
                    if (strcmp(sp->num, aq->num) == 0) {
                        sp->times--;
                        break;
                    }
                    sp = sp->next;
                }
                free(aq);
                if (n == amount) //若删除的是尾结点,则尾指针指向新尾结点
                    attendanceRear = ap;
                break;
            }
            ap = ap->next;
        }
        ap = ap->next;
        while (ap != NULL) { //在删除结点后的结点编号减一
            ap->X--;
            ap = ap->next;
        }
        WriteAttendanceInfo(&attendanceHead);
        WriteStudentInfo(&studentHead);
        printf("\n\n\t\t\t                    成功删除编号为\33[36m%02d\33[0m的考勤信息!\n", n);
    }
    else
        printf("\a\n\n\t\t\t                            编号输入错误!\n");
    printf("\n");
    system("pause");
}

//修改考勤信息
void Modify() {
    Title();
    printf("\t\t\t                            修改考勤信息\n");
    printf("\t\t\t                        --------------------\n");
    char choice, num0[15], num[15], name[10];
    int n, amount = attendanceRear->X, year, month, flag1 = 0, flag2 = 0;
    spointer sp = studentHead->next;
    apointer ap = attendanceHead->next;
    DisplayCursor(1); //显示光标
    if (amount == 0) { //无考勤信息可修改
        printf("系统共存有\33[36m0\33[0m条考勤信息!\n\n");
        system("pause");
        return;
    }
    printf("系统共存有\33[36m%d\33[0m条考勤信息,具体如下:\n\n", amount);
    printf("编号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
    while (ap != NULL) {
        printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", ap->X, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
        if (ap->type == Late)
            printf("迟到   ");
        else if (ap->type == Absent)
            printf("缺席   ");
        else
            printf("请假   ");
        if (ap->state == No)
            printf("\33[31m未确认\33[0m\n");
        else
            printf("\33[32m已确认\33[0m\n");
        ap = ap->next;
    }
    printf("\n请输入要修改的考勤信息编号(输入0可返回菜单界面):");
    scanf("%d", &n);
    if (n == 0) //返回菜单界面
        return;
    else if (n<1 || n>amount) //编号输入错误
        printf("\a\n\n\t\t\t                            编号输入错误!\n");
    else { //修改指定编号考勤信息
        printf("\n编号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
        ap = attendanceHead->next;
        while (ap != NULL) {
            if (ap->X == n) {
                printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", ap->X, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
                if (ap->type == Late)
                    printf("迟到   ");
                else if (ap->type == Absent)
                    printf("缺席   ");
                else
                    printf("请假   ");
                if (ap->state == No)
                    printf("\33[31m未确认\33[0m\n\n");
                else
                    printf("\33[32m已确认\33[0m\n\n");
                break;
            }
            ap = ap->next;
        }
        printf("\t\t\t                           请选择修改类型\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           1.修改单个参数\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           2.修改整条考勤\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                           3.  取    消\n");
        printf("\t\t\t                        --------------------\n");
        DisplayCursor(0); //隐藏光标
        while (1) {
            choice = _getch();
            if (choice == '1' || choice == '2' || choice == '3')
                break;
        }
        DisplayCursor(1); //显示光标
        if (choice == '3') //取消,返回菜单界面
            return;
        else if (choice == '2') { //修改整条考勤
            printf("\t\t\t请输入新的[学号]:");
            scanf("%s", num);
            printf("\t\t\t请输入新的[姓名]:");
            scanf("%s", name);
            while (sp != NULL) {
                if (strcmp(sp->num, num) == 0 && strcmp(sp->name, name) == 0) {
                    flag1 = 1;
                    break;
                }
                sp = sp->next;
            }
            if (flag1) { //若新的学号和姓名存在且配对
                if (strcmp(ap->num, num) != 0) { //若修改了该考勤信息的学号和姓名
                    flag2 = 1;
                    strcpy(num0, ap->num); //记下修改前的学号
                    strcpy(ap->num, num);
                    strcpy(ap->name, name);
                }
            }
            else { //若新的学号和姓名不存在或不配对
                printf("\a\n\n\t\t\t                        学号或姓名输入错误!\n\n");
                system("pause");
                return;
            }
            printf("\t\t\t请输入新的[日期](格式:xxxx-xx-xx):");
            scanf("%u-%u-%u", &year, &month, &ap->data.tm_mday);
            ap->data.tm_year = year - 1900;
            ap->data.tm_mon = month - 1;
            printf("\t\t\t请输入新的[第几节]:");
            scanf("%d", &ap->n);
            printf("\t\t\t请输入新的[课程]:");
            scanf("%s", ap->subject);
            printf("\t\t\t请输入新的[地点]:");
            scanf("%s", ap->locale);
            DisplayCursor(0); //隐藏光标
            printf("\t\t\t请选择新的[性质]:1.迟到  2.缺席  3.请假\n");
            while (1) {
                choice = _getch();
                if (choice == '1') {
                    ap->type = Late;
                    printf("\33[1A\t\t\t请选择新的[性质]:迟到                   \n");
                }
                else if (choice == '2') {
                    ap->type = Absent;
                    printf("\33[1A\t\t\t请选择新的[性质]:缺席                   \n");
                }
                else if (choice == '3') {
                    ap->type = Leave;
                    printf("\33[1A\t\t\t请选择新的[性质]:请假                   \n");
                }
                else
                    continue;
                break;
            }
            printf("\t\t\t请选择新的[状态]:1.未确认  2.已确认\n");
            while (1) {
                choice = _getch();
                if (choice == '1') {
                    ap->state = No;
                    printf("\33[1A\t\t\t请选择新的[状态]:未确认              \n");
                }
                else if (choice == '2') {
                    ap->state = Yes;
                    printf("\33[1A\t\t\t请选择新的[状态]:已确认              \n");
                }
                else
                    continue;
                break;
            }
        }
        else { //修改单个参数
            printf("\33[8A\t\t\t                         请选择要修改的参数\n");
            printf("\t\t\t                        --------------------\n");
            printf("\t\t\t                            1.学号和姓名    \n");
            printf("\t\t\t                        --------------------\n");
            printf("\t\t\t                            2.日期          \n");
            printf("\t\t\t                        --------------------\n");
            printf("\t\t\t                            3.第几节        \n");
            printf("\t\t\t                        --------------------\n");
            printf("\t\t\t                            4.课程\n");
            printf("\t\t\t                        --------------------\n");
            printf("\t\t\t                            5.地点\n");
            printf("\t\t\t                        --------------------\n");
            printf("\t\t\t                            6.性质\n");
            printf("\t\t\t                        --------------------\n");
            printf("\t\t\t                            7.状态\n");
            printf("\t\t\t                        --------------------\n");
            DisplayCursor(0); //隐藏光标
            while (1) {
                choice = _getch();
                if (choice >= '1' && choice <= '7')
                    break;
            }
            DisplayCursor(1); //显示光标
            switch (choice) {
            case '1':
                printf("\t\t\t请输入新的[学号]:");
                scanf("%s", num);
                printf("\t\t\t请输入新的[姓名]:");
                scanf("%s", name);
                while (sp != NULL) {
                    if (strcmp(sp->num, num) == 0 && strcmp(sp->name, name) == 0) {
                        flag1 = 1;
                        break;
                    }
                    sp = sp->next;
                }
                if (flag1) { //若新的学号和姓名存在且配对
                    if (strcmp(ap->num, num) != 0) { //若修改了该考勤信息的学号和姓名
                        flag2 = 1;
                        strcpy(num0, ap->num); //记下修改前的学号
                        strcpy(ap->num, num);
                        strcpy(ap->name, name);
                    }
                }
                else { //若新的学号和姓名不存在或不配对
                    printf("\a\n\n\t\t\t                        学号或姓名输入错误!\n\n");
                    system("pause");
                    return;
                }
                break;
            case '2':
                printf("\t\t\t请输入新的[日期](格式:xxxx-xx-xx):");
                scanf("%u-%u-%u", &year, &month, &ap->data.tm_mday);
                ap->data.tm_year = year - 1900;
                ap->data.tm_mon = month - 1;
                break;
            case '3':
                printf("\t\t\t请输入新的[第几节]:");
                scanf("%d", &ap->n);
                break;
            case '4':
                printf("\t\t\t请输入新的[课程]:");
                scanf("%s", ap->subject);
                break;
            case '5':
                printf("\t\t\t请输入新的[地点]:");
                scanf("%s", ap->locale);
                break;
            case '6':
                printf("\t\t\t请选择新的[性质]:1.迟到  2.缺席  3.请假\n");
                DisplayCursor(0); //隐藏光标
                while (1) {
                    choice = _getch();
                    if (choice == '1') {
                        ap->type = Late;
                        printf("\33[1A\t\t\t请选择新的[性质]:迟到                   \n");
                    }
                    else if (choice == '2') {
                        ap->type = Absent;
                        printf("\33[1A\t\t\t请选择新的[性质]:缺席                   \n");
                    }
                    else if (choice == '3') {
                        ap->type = Leave;
                        printf("\33[1A\t\t\t请选择新的[性质]:请假                   \n");
                    }
                    else
                        continue;
                    break;
                }
                break;
            case '7':
                printf("\t\t\t请选择新的[状态]:1.未确认  2.已确认\n");
                DisplayCursor(0); //隐藏光标
                while (1) {
                    choice = _getch();
                    if (choice == '1') {
                        ap->state = No;
                        printf("\33[1A\t\t\t请选择新的[状态]:未确认              \n");
                    }
                    else if (choice == '2') {
                        ap->state = Yes;
                        printf("\33[1A\t\t\t请选择新的[状态]:已确认              \n");
                    }
                    else
                        continue;
                    break;
                }
            }
        }
        printf("\n编号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
        printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", ap->X, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
        if (ap->type == Late)
            printf("迟到   ");
        else if (ap->type == Absent)
            printf("缺席   ");
        else
            printf("请假   ");
        if (ap->state == No)
            printf("\33[31m未确认\33[0m\n");
        else
            printf("\33[32m已确认\33[0m\n");
        WriteAttendanceInfo(&attendanceHead);
        if (flag2) { //若成功修改了考勤信息的学号和姓名,则进行学生的缺勤次数修改
            sp->times++;
            sp = studentHead->next;
            while (sp != NULL) {
                if (strcmp(num0, sp->num) == 0) {
                    sp->times--;
                    break;
                }
                sp = sp->next;
            }
            WriteStudentInfo(&studentHead);
        }
        printf("\n\n\t\t\t                    成功修改编号为\33[36m%02d\33[0m的考勤信息!\n", n);
    }
    printf("\n");
    DisplayCursor(1); //显示光标
    system("pause");
}

//统计缺勤人员
void Statistic() {
    int i, j, amount = 0; //缺勤学生总数
    char choice;
    struct student stu[50];
    spointer sp = studentHead->next;
    apointer ap = attendanceHead->next;
    Title();
    printf("\t\t\t                            统计缺勤人员\n");
    printf("\t\t\t                        --------------------\n");
    printf("\t\t\t                            1.按条件统计\n");
    printf("\t\t\t                        --------------------\n");
    printf("\t\t\t                            2.统计全部\n");
    printf("\t\t\t                        --------------------\n");
    printf("\t\t\t                            3.取消\n");
    printf("\t\t\t                        --------------------\n");
    DisplayCursor(0); //隐藏光标
    while (1) {
        choice = _getch();
        if (choice == '1' || choice == '2' || choice == '3')
            break;
    }
    if (choice == '3') //取消,返回菜单界面
        return;
    else if (choice == '2') { //统计全部缺勤人员
        Title();
        printf("\t\t\t                            统计缺勤人员\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                              统计全部\n\n");
        while (sp != NULL) { //记录有缺勤记录的学生到stu数组中
            if (sp->times != 0) {
                strcpy(stu[amount].name, sp->name);
                strcpy(stu[amount].num, sp->num);
                stu[amount].times = sp->times;
                amount++;
            }
            sp = sp->next;
        }
        if (amount == 0)
            printf("共有\33[36m0\33[0m位学生有缺勤(非出席)记录!\n");
        else {
            QuickSort(0, stu, 0, amount);
            printf("共有\33[36m%d\33[0m位学生有缺勤(非出席)记录,具体如下(结果已按缺勤次数降序排序):\n\n", amount);
            printf("\t\t\t             ┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓\n");
            printf("\t\t\t             ┃    姓名   ┃      学号     ┃  缺勤次数 ┃\n");
            for (i = 0, j = 13; i < amount; i++, j += 2) {
                printf("\t\t\t             ┣━━━━━━━━━━━╋━━━━━━━━━━━━━━━╋━━━━━━━━━━━┫\n");
                printf("\t\t\t             ┃           ┃               ┃           ┃\n");
                Goto_xy(42, j);
                printf("%s", stu[i].name);
                Goto_xy(52, j);
                printf("%s", stu[i].num);
                Goto_xy(70, j);
                printf("%d次\n", stu[i].times);
            }
            printf("\t\t\t             ┗━━━━━━━━━━━┻━━━━━━━━━━━━━━━┻━━━━━━━━━━━┛\n");
        }
    }
    else { //按条件统计缺勤人员
        enum Type type;
        enum State state;
        char data[11], n[3], subject[25], locale[8], type0[5], state0[7], str[5];
        int flag = 1;
        Title();
        printf("\t\t\t                            统计缺勤人员\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                             按条件统计\n\n");
        printf("请输入统计参数(未输入的参数将默认取所有符合项):\n");
        printf("注:日期格式:xxxx-xx-xx,性质:迟到/缺勤/请假,状态:未确认/已确认\n");
        printf("\t\t   ┏━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━┳━━━━━━━━━┓\n");
        printf("\t\t   ┃    日期   ┃ 第几节┃            课程           ┃   地点  ┃  性质 ┃   状态  ┃\n");
        printf("\t\t   ┣━━━━━━━━━━━╋━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━╋━━━━━━━╋━━━━━━━━━┫\n");
        printf("\t\t   ┃           ┃       ┃                           ┃         ┃       ┃         ┃\n");
        printf("\t\t   ┗━━━━━━━━━━━┻━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━┻━━━━━━━┻━━━━━━━━━┛\n");
        DisplayCursor(1); //显示光标
        rewind(stdin); //清空键盘缓冲区
        Goto_xy(21, 13); gets_s(data);
        Goto_xy(35, 13); gets_s(n);
        Goto_xy(45, 13); gets_s(subject);
        Goto_xy(70, 13); gets_s(locale);
        Goto_xy(80, 13); gets_s(type0);
        Goto_xy(88, 13); gets_s(state0);
        while (ap != NULL) { //查找符合条件的考勤信息,并获取其学生信息
            flag = 1;
            if (strcmp(data, "\0") != 0) {
                strncpy(str, data, 4);
                flag = flag && (ap->data.tm_year + 1900 == atof(str));
                str[0] = data[5]; str[1] = data[6]; str[2] = '\0';
                flag = flag && (ap->data.tm_mon + 1 == atof(str));
                str[0] = data[8]; str[1] = data[9]; str[2] = '\0';
                flag = flag && (ap->data.tm_mday == atof(str));
            }
            if (strcmp(n, "\0") != 0)
                flag = flag && (ap->n == atof(n));
            if (strcmp(subject, "\0") != 0)
                flag = flag && !strcmp(ap->subject, subject);
            if (strcmp(locale, "\0") != 0)
                flag = flag && !strcmp(ap->locale, locale);
            if (strcmp(type0, "\0") != 0) {
                if (strcmp(type0, "迟到") == 0)
                    type = Late;
                if (strcmp(type0, "缺席") == 0)
                    type = Absent;
                if (strcmp(type0, "请假") == 0)
                    type = Leave;
                flag = flag && (ap->type == type);
            }
            if (strcmp(state0, "\0") != 0) {
                if (strcmp(state0, "未确认") == 0)
                    state = No;
                if (strcmp(state0, "已确认") == 0)
                    state = Yes;
                flag = flag && (ap->state == state);
            }
            if (flag) {
                flag = 0; //stu数组中是否有该缺勤学生信息
                for (i = 0; i < amount; i++) {
                    if (strcmp(ap->num, stu[i].num) == 0) {
                        flag = 1;
                        break;
                    }
                }
                if (!flag) { //若无,则添加该学生信息至stu数组
                    strcpy(stu[amount].name, ap->name);
                    strcpy(stu[amount].num, ap->num);
                    amount++;
                }
            }
            ap = ap->next;
        }
        if (amount == 0)
            printf("\n\n共有\33[36m0\33[0m位学生符合以上缺勤记录!\n");
        else {
            QuickSort(1, stu, 0, amount);
            printf("\n\n共有\33[36m%d\33[0m位学生符合以上缺勤记录,具体如下(结果已按学号升序排序):\n\n", amount);
            printf("\t\t\t                   ┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n");
            printf("\t\t\t                   ┃    姓名   ┃      学号     ┃\n");
            for (i = 0, j = 21; i < amount; i++, j += 2) {
                printf("\t\t\t                   ┣━━━━━━━━━━━╋━━━━━━━━━━━━━━━┫\n");
                printf("\t\t\t                   ┃           ┃               ┃\n");
                Goto_xy(48, j);
                printf("%s", stu[i].name);
                Goto_xy(58, j);
                printf("%s\n", stu[i].num);
            }
            printf("\t\t\t                   ┗━━━━━━━━━━━┻━━━━━━━━━━━━━━━┛\n");
        }
    }
    printf("\n");
    DisplayCursor(1); //显示光标
    system("pause");
}

//超级管理权限,暂时无实用功能
void Super() {
    while (1) {
        char password[20], choice;
        Title();
        printf("\t\t\t                            超级管理权限\n");
        printf("\t\t\t                        --------------------\n\n\n");
        printf("\t\t\t                  ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
        printf("\t\t\t                  ┃ 密码:                      ┃\n");
        printf("\t\t\t                  ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
        DisplayCursor(1); //显示光标
        Goto_xy(50, 9);
        InputPassword(password);
        if (strcmp("ADMIN", password) == 0) { //密码正确
            Title();
            printf("\t\t\t                            超级管理权限\n");
            printf("\t\t\t                        --------------------\n\n\n");
            printf("\33[3B\33[31m");
            printf("\t    ■■      ■       ■■       ■■■■■   ■      ■   ■■■■■   ■■      ■       ■■■\n");
            printf("\t    ■ ■     ■     ■    ■         ■       ■      ■       ■       ■ ■     ■     ■      ■\n");
            printf("\t    ■  ■    ■    ■      ■        ■       ■      ■       ■       ■  ■    ■    ■\n");
            printf("\t    ■   ■   ■   ■        ■       ■       ■■■■■       ■       ■   ■   ■   ■\n");
            printf("\t    ■    ■  ■    ■      ■        ■       ■      ■       ■       ■    ■  ■    ■     ■■\n");
            printf("\t    ■     ■ ■     ■    ■         ■       ■      ■       ■       ■     ■ ■     ■      ■\n");
            printf("\t    ■      ■■       ■■           ■       ■      ■   ■■■■■   ■      ■■       ■■■■\n");
            printf("\33[11B\33[0m");
            system("pause");
            break;
        }
        else { //密码错误
            printf("\a\n\n\n\t\t\t                       密码错误,请重新输入!\n\n");
            printf("\t\t\t                          1.确定    2.取消\n");
            DisplayCursor(0); //隐藏光标
            choice = _getch();
            if (choice != '1' && choice != '\r')
                break;
        }
    }
}

//初始化系统
void Init() {
    Title();
    printf("\t\t\t                             初始化系统\n");
    printf("\t\t\t                        --------------------\n\n");
    char choice;
    printf("\t\t\t           是否确定初始化系统,将系统信息还原至最初信息?\n\n");
    printf("\t\t\t                          1.确定    2.取消\n");
    DisplayCursor(0); //隐藏光标
    choice = _getch();
    if (choice == '1' || choice == '\r') {
        Destroy(&studentHead, &attendanceHead); //销毁整个学生链表和考勤链表
        studentHead = NULL;
        studentRear = NULL;
        attendanceHead = NULL;
        attendanceRear = NULL;
        ReadStudentInfo(&studentHead, &studentRear, 0); //建立初始学生信息链表
        ReadAttendanceInfo(&attendanceHead, &attendanceRear, 0); //建立初始考勤信息链表
        WriteStudentInfo(&studentHead);
        WriteAttendanceInfo(&attendanceHead);
        printf("\n\n\t\t\t                          系统初始化成功!\n\n");
        DisplayCursor(1); //显示光标
        system("pause");
    }
}

//三好学生评选
void outstand()
{
    int i, j, amount = 0; //缺勤学生总数
    char choice;
    struct student stu[50];
    spointer sp = studentHead->next;
    apointer ap = attendanceHead->next;
    while (sp != NULL) { //记录有缺勤记录的学生到stu数组中
        if (sp->times != 0) {
            strcpy(stu[amount].name, sp->name);
            strcpy(stu[amount].num, sp->num);
            stu[amount].times = sp->times;
            amount++;
        }
        sp = sp->next;
    }
    if (amount == 0)
        printf("共有\33[36m0\33[0m位学生有缺勤(非出席)记录!\n");
    else {
        QuickSort(0, stu, 0, amount);
        printf("三好学生如下\n\n", amount);
        printf("\t\t\t             ┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓\n");
        printf("\t\t\t             ┃    姓名   ┃      学号     ┃  缺勤次数 ┃\n");
        for (i = 0, j = 13; i < 3; i++, j += 2) {

            printf("%s", stu[i].name);
            Goto_xy(58, j);
            printf("%s\n", stu[i].num);
        }
    }

}

//查看个人信息
void UserInfo(spointer sp) {
    Title();
    printf("\t\t\t                            查看个人信息\n");
    printf("\t\t\t                        --------------------\n");
    printf("\t\t\t                ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
    printf("\t\t\t                ┃ 姓    名:                      ┃\n");
    printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("\t\t\t                ┃ 性    别:                      ┃\n");
    printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("\t\t\t                ┃ 年    级:                      ┃\n");
    printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("\t\t\t                ┃ 班    级:                      ┃\n");
    printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("\t\t\t                ┃ 学    号:                      ┃\n");
    printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("\t\t\t                ┃ 手    机:                      ┃\n");
    printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("\t\t\t                ┃ 身 份 证:                      ┃\n");
    printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("\t\t\t                ┃ 缺勤次数:                      ┃\n");
    printf("\t\t\t                ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
    apointer ap = attendanceHead->next;
    int i = 1;
    Goto_xy(52, 7);
    printf("%s", sp->name);
    Goto_xy(52, 9);
    if (sp->sex == Man)
        printf("男");
    else if (sp->sex == Woman)
        printf("女");
    else
        printf("未知");
    Goto_xy(52, 11);
    printf("%s", sp->grade);
    Goto_xy(52, 13);
    printf("%s", sp->clas);
    Goto_xy(52, 15);
    printf("%s", sp->num);
    Goto_xy(52, 17);
    printf("%s", sp->phone);
    Goto_xy(52, 19);
    printf("%s", sp->idCard);
    Goto_xy(52, 21);
    printf("%d次", sp->times);
    printf("\n\n");
    if (sp->times != 0) { //个人考勤信息条数不为0
        printf("您共有\33[36m%d\33[0m条考勤信息,具体如下:\n\n", sp->times);
        printf("序号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
        while (ap != NULL) {
            if (strcmp(sp->num, ap->num) == 0) {
                printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", i, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
                if (ap->type == Late)
                    printf("迟到   ");
                else if (ap->type == Absent)
                    printf("缺席   ");
                else
                    printf("请假   ");
                if (ap->state == No)
                    printf("\33[31m未确认\33[0m\n");
                else
                    printf("\33[32m已确认\33[0m\n");
                i++;
            }
            ap = ap->next;
        }
    }
    else //个人考勤信息条数为0
        printf("您共有\33[36m0\33[0m条考勤信息!\n");
    printf("\n");
    DisplayCursor(1); //显示光标
    system("pause");
}

//确认个人考勤
void Confirm(spointer sp) {
    Title();
    printf("\t\t\t                            确认个人考勤\n");
    printf("\t\t\t                        --------------------\n");
    int amount = 0, n, flag = 0;
    apointer ap = attendanceHead->next;
    DisplayCursor(1); //显示光标
    while (ap != NULL) {
        if (strcmp(sp->num, ap->num) == 0 && ap->state == No)
            amount++;
        ap = ap->next;
    }
    if (amount == 0) //无未确认的个人考勤信息
        printf("您共有\33[36m0\33[0m条未确认的考勤信息!\n");
    else { //有未确认的个人考勤信息
        printf("您共有\33[36m%d\33[0m条未确认的考勤信息,具体如下:\n\n", amount);
        printf("编号       学号       姓名        日期      第几节    课程              地点    性质    状态\n\n");
        ap = attendanceHead->next;
        while (ap != NULL) {
            if (strcmp(sp->num, ap->num) == 0 && ap->state == No) {
                printf(" %02d    %-14s %-8s %04u-%02u-%02u   第%d节   %-18s %-8s ", ap->X, ap->num, ap->name, ap->data.tm_year + 1900, ap->data.tm_mon + 1, ap->data.tm_mday, ap->n, ap->subject, ap->locale);
                if (ap->type == Late)
                    printf("迟到   ");
                else if (ap->type == Absent)
                    printf("缺席   ");
                else
                    printf("请假   ");
                printf("\33[31m未确认\33[0m\n");
            }
            ap = ap->next;
        }
        printf("\n请输入要确认的考勤信息编号(输入0可确认全部,输入-1可返回菜单界面):");
        scanf("%d", &n);
        if (n == -1) //返回菜单界面
            return;
        else if (n == 0) { //确认全部个人考勤信息
            ap = attendanceHead->next;
            while (ap != NULL) {
                if (strcmp(sp->num, ap->num) == 0 && ap->state == No)
                    ap->state = Yes;
                ap = ap->next;
            }
            WriteAttendanceInfo(&attendanceHead);
            printf("\n\n\t\t\t                     成功确认以上\33[36m%d\33[0m条考勤信息!\n", amount);
        }
        else { //确认指定编号考勤信息
            ap = attendanceHead->next;
            while (ap != NULL) {
                if (strcmp(sp->num, ap->num) == 0 && ap->X == n && ap->state == No) {
                    ap->state = Yes;
                    flag = 1;
                    break;
                }
                ap = ap->next;
            }
            if (flag) { //成功确认指定编号考勤信息
                WriteAttendanceInfo(&attendanceHead);
                printf("\n\n\t\t\t                    成功确认编号为\33[36m%02d\33[0m的考勤信息!\n", n);
            }
            else
                printf("\a\n\n\t\t\t                            编号输入错误!\n");
        }
    }
    printf("\n");
    system("pause");
}

//修改密码
void ChangePassword(spointer sp) {
    while (1) {
        Title();
        printf("\t\t\t                              修改密码\n");
        printf("\t\t\t                        --------------------\n");
        printf("\t\t\t                ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
        printf("\t\t\t                ┃ 旧 密 码:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 新 密 码:                      ┃\n");
        printf("\t\t\t                ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
        printf("\t\t\t                ┃ 确认密码:                      ┃\n");
        printf("\t\t\t                ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
        char old[20], neww1[20], neww2[20], choice;
        DisplayCursor(1); //显示光标
        Goto_xy(52, 7);
        InputPassword(old);
        Goto_xy(52, 9);
        InputPassword(neww1);
        Goto_xy(52, 11);
        InputPassword(neww2);
        if (strcmp(sp->password, old) != 0) { //旧密码错误
            MessageBeep(MB_ICONHAND);
            printf("\n\n\n\t\t\t                    旧密码错误,请重新修改密码!\n\n");
            printf("\t\t\t                          1.确定    2.取消\n");
            DisplayCursor(0); //隐藏光标
            choice = _getch();
            if (choice == '1' || choice == '\r')
                continue;
        }
        else if (strcmp(neww1, neww2) != 0) { //两次密码不相同
            MessageBeep(MB_ICONHAND);
            printf("\n\n\n\t\t\t                  两次密码不相同,请重新修改密码!\n\n");
            printf("\t\t\t                          1.确定    2.取消\n");
            DisplayCursor(0); //隐藏光标
            choice = _getch();
            if (choice == '1' || choice == '\r')
                continue;
        }
        else { //旧密码正确,且两次密码相同
            printf("\n\n\n\t\t\t                         是否确定修改密码?\n\n");
            printf("\t\t\t                          1.确定    2.取消\n");
            DisplayCursor(0); //隐藏光标
            choice = _getch();
            if (choice == '1' || choice == '\r') {
                strcpy(sp->password, neww1);
                WriteStudentInfo(&studentHead);
                printf("\n\n\t\t\t                    密码修改成功,请牢记新密码!\n\n");
                DisplayCursor(1); //显示光标
                system("pause");
            }
        }
        break;
    }
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化工具选择指南:山海鲸、Tableau与Power BI特点详解

在数据可视化的领域中&#xff0c;众多工具各有千秋。今天&#xff0c;我们将从客观的角度&#xff0c;对三款热门的数据可视化产品——山海鲸可视化、Tableau和Power BI进行深入的对比&#xff0c;帮助用户更全面地了解它们的特点&#xff0c;从而做出更明智的选择。 一、产品…

移动硬盘在电脑上显示不出来?三招教你轻松应对

随着网络的普及&#xff0c;数据的增多&#xff0c;对于数据储存的需要也是越来越多&#xff0c;相信许多人的手中都存在着一些如U盘、MP3、MP4、移动硬盘之类的储存设备&#xff0c;而在使用这些设备的时候&#xff0c;难免会遇到一些这样或那样的问题&#xff0c;比如移动硬盘…

微信小程序证书评级导致接口无法访问问题

微信小程序的ssl证书到期后&#xff0c; 更换了免费的ssl证书&#xff0c; 是在freessl网站申请的&#xff0c; 配置完了&#xff0c;后台可以访问https网页&#xff0c;但是小程序还是无法访问&#xff0c; 开始没有怀疑是https证书的问题&#xff0c; 调适了好长时间的代码&a…

Scala Intellij编译错误:idea报错xxxx“is already defined as”

今天写scala代码时,Idea报了这样的错误&#xff0c;如下图所示&#xff1a; 一般情况下原因分两种&#xff1a; 第一是我们定义的类或对象重复多次出现&#xff0c;编译器无法确定使用哪个定义。 这通常是由于以下几个原因导致的&#xff1a; 重复定义&#xff1a;在同一个文件…

【探索AI】十一 深度学习之第1周:深度学习概述与基础

深度学习概述与基础 深度学习的发展历史与现状神经网络的基本原理前向传播与反向传播算法常见的激活函数与优化算法深度学习框架&#xff08;如TensorFlow或PyTorch&#xff09;进行基础操作 深度学习的发展历史与现状 深度学习的发展历史可以追溯到上世纪40年代&#xff0c;当…

24计算机考研深大经验分享(计算机专业考研综合安排)

文章目录 背景科目选择高数选课一轮二轮冲刺阶段 线代一轮二轮 概率论计算机学科专业基础408数据结构计算机组成原理操作系统计算机网络总结 英语政治 末言 背景 首先贴一下初试成绩。这篇分享主要是给零基础的同学使用的&#xff0c;基础好的同学可以自行了解补充一下&#xf…

Docker数据卷-自定义镜像

一.数据卷 1.1数据卷的基本使用 数据卷是一个特殊的目录&#xff0c;用于在Docker容器中持久化和共享数据。 数据卷的主要特点包括&#xff1a; 数据持久性&#xff1a;数据卷允许您在容器的生命周期之外保持数据的持久性。即使容器被删除&#xff0c;数据卷中的数据依然存在&…

Redis 协议与异步方式

redis pipeline 模式 redis pipeline 是一个客户端提供的机制&#xff0c;与 redis 无关。pipeline 不具备事务性。目的&#xff1a;节约网络传输时间。通过一次发送多条请求命令&#xff0c;从而减少网络传输时间。 时间窗口限流 系统限定某个用户的某个行为在指定的时间范围…

国创证券策略:春季躁动行情有望持续演绎

国创证券指出&#xff0c;商场在连续逼空后总算迎来真正意义上的调整&#xff0c;而指数上也并未能突破3030—3050点压力区&#xff0c;显示现在仍处于中期的下降趋势中的反弹&#xff0c;只是反弹起伏确实是超预期的。周三商场的调整还是近期大涨的巨量获利盘实现压力。由于大…

palworld-server-tool(0.5.7)使用指南

文章目录 说明管理工具&#xff08;docker版本&#xff09;部署教程使用指南RCON指令工具RCON使用广播内容右下角&#xff0c;有加入白明单&#xff0c;和封禁和踢出的功能 游戏中RCON命令使用 说明 本文&#xff0c;主要使简单的使用介绍&#xff08;其实也没有什么指导的&am…

【语音识别】- CTC损失计算的原理

文章目录 1.符号定义与目标函数2.前向计算 α s ( t ) \alpha_s(t) α

Rocky Linux 运维工具 systemctl

一、​​systemctl​的简介 ​​systemctl​是用于管理系统服务的命令行工具。​systemctl​命令可以启动、停止、重启或重新加载服务&#xff0c;并管理它们。 二、systemctl​的参数说明 序号参数描述1start启动指定系统服务2stop停止指定系统服务3status显示指定系统服务的…

【Micropython教程】点亮第一个LED与流水灯

文章目录 前言MicroPython在线仿真GPIO的工作模式一、有哪些工作模式&#xff1f;1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 一、machine.Pin类1.1 machine.Pin 类的构造对象1.2 machine.Pin 类的方法init方法value方法设置高低电平方法 二、延时函数 三、流水灯总…

18、ubutnu20.04使用RTX3060硬件进行视频编解码+推流

基本思想&#xff1a;先进行环境配置&#xff0c;系统环境如下 RTX3060 ubuntu 20.04 cuda 12.2 cudnn 11.3 NVIDIA-SMI 535.146.02 tensorRT 8.6 nv-codec-headers Video_Codec_SDK_12.0.16 注意&#xff1a;发现一个很有意思的问题&#xff0c;如果我使用命令行安装的ffmpe…

JVM(2)

JVM类加载 指的是java进程运行时,需要把.class文件从硬盘加载到内存,并进行一系列校验解析的过程. 核心: .class文件>类对象; 硬盘>内存. 类加载过程 在整个JVM的执行流程中,和程序员关系最密切的就是类加载的过程了,所以我们来看一下类加载的执行流程. 对于一个类…

使用Git从其他分支merge个别文件

项目背景 产品经理&#xff1a;我们本次开发三个功能&#xff0c;列表页功能、详情页功能、系统消息功能&#xff0c;分两次上线&#xff0c;先上列表功能&#xff0c;再上详情页和系统消息。 小明&#xff1a;好的吧。 紧接着&#xff0c;小明就将本次需求分为2个分支&…

爬虫技术抓取网站数据

爬虫技术是一种自动化获取网站数据的技术&#xff0c;它可以模拟人类浏览器的行为&#xff0c;访问网页并提取所需的信息。以下是爬虫技术抓取网站数据的一般步骤&#xff1a; 发起HTTP请求&#xff1a;爬虫首先会发送HTTP请求到目标网站&#xff0c;获取网页的内容。 解析HTM…

vue .env配置环境变量

最近使用的不同的环境有点多了&#xff0c;接口文件ip一直在替换打包&#xff0c;看了下文档&#xff0c;有个方案使用.env配置不同的环境运行打包 vue 现在已经兼容了env &#xff0c;无需下载 创建文件&#xff08;根目录&#xff09; 创建.env.development&#xff0c;.env.…

camunda7流程跳转和流程退回的实现方法

我们在使用工作流的时候&#xff0c;常常有“流程退回”、“流程跳转”、“自由流”、“动态加签”等这样的需求。Camunda流程平台提供了这样的机制和接口&#xff0c;虽然流程模型定义活动执行顺序的序列流&#xff0c;但有时需要灵活地重新启动活动或取消正在运行的活动&…

k8s-项目测试环境部署

部署规划 概述 项目开发好后&#xff0c;我们需要部署&#xff0c;我们接下来就基于 阿里云云效 阿里云容器镜像服务 k8s 搭建部署环境 阿里云云效 : 放代码&#xff0c;可以做cicd&#xff08;https://www.aliyun.com/product/yunxiao&#xff09; 阿里云容器镜像服务 :…