数据结构大作业-班级考勤管理系统

简介

此程序是本人大二时期的数据结构大作业,初学数据结构和算法后所编写的一个程序,是一个班级考勤管理系统,可实现班级考勤信息的管理。

本程序使用C语言编写,使用Visual Studio 2019进行开发,程序中使用到了数据结构及算法知识,整个系统功能完善、界面美观(虽然是控制台窗口界面,但经过各种调整,整个界面十分整洁好看)。程序分为两个模式,用户模式和管理模式,用户模式供普通学生登录,可查看和管理个人的考勤信息等,管理模式供班级干部等管理员登录,可查看和管理整个班级成员的考勤信息等。用户模式的功能包括:查看个人信息、确认个人考勤、查询考勤信息、统计缺勤人员、修改密码、退出系统;管理模式的功能包括:查看学生信息、查询考勤信息、添加考勤信息、删除考勤信息、修改考勤信息、统计缺勤人员、超级管理权限、初始化系统、退出系统。

本次数据结构大作业程序,是本人在假期期间从零开始写的,由于本人有强迫症,所以程序有很多代码都在调整界面,花费了大量时间进行各种调整,整个系统的界面非常美观,这也是本人写过的大作业里十分满意的一次之一,当然最后毫无疑问的依旧拿了个优秀的成绩。

本程序是作者本人呕心沥血之作,在此求各位点个赞 o( ̄▽ ̄)d

程序源代码及程序设计说明书可点击下方链接进行下载,供各位需要的人学习参考。

下载链接:班级考勤管理系统



程序流程

程序大概流程如下图:
程序流程图

功能展示

本程序功能及细节颇多,在此仅展示部分功能,若想了解完整功能及细节,请至文章开头处下载程序,进行体验。

欢迎界面(初始界面)

打开本程序,进入欢迎界面即初始界面,在此可选择进入用户模式或管理模式,亦可打开帮助界面,或退出系统。

欢迎界面(初始界面)

帮助

在欢迎界面按“3”可进入到帮助界面,进入帮助界面时,会先显示一个动态闪烁的“HELP”,然后再显示出帮助界面,帮助界面中展示一些帮助事项,在此界面按“1”可打开查看详细的程序设计说明书,按其他键将返回欢迎界面。

帮助
帮助

注册

进入用户模式后可选择进行用户注册,用户注册界面需输入各种用户信息进行注册,用户信息完整输入且无误即可成功注册,注册成功将展示用户的账号和密码,提示用户牢记账号密码。

用户注册
注册成功

登录

在用户模式下可进行用户登录,输入用户的账号(即学号)和密码进行登录;在管理模式下可进行管理员登录,输入特定的账号和密码进行登录,本程序的管理员账号和密码写死在了程序源代码中,均为“admin”。若登录成功会先展示一个动态的进度条并伴随音效,进度条加载完成后将进入相应的菜单界面。

登录
登录成功

用户菜单界面

用户登录成功后将进入到用户菜单界面,在此界面可进行各种用户功能选择,包括:查看个人信息、确认个人考勤、查询考勤信息、统计缺勤人员、修改密码、退出系统。

用户菜单界面

查看个人信息

查看个人信息功能,是用户模式的功能,可查看用户自己的个人信息。

查看个人信息

确认个人考勤

确认个人考勤功能,是用户模式的功能,可在此确认用户本人的考勤信息。

确认个人考勤
确认个人考勤

查询考勤信息

查询考勤信息功能,是用户模式和管理模式都有的功能,可按条件查询考勤信息,亦可查看全部考勤信息,按条件查询时需输入指定的条件,输入后系统将查询并展示出所有符合条件的考勤信息。
查询考勤信息
查询考勤信息-按条件查询
查询考勤信息-按条件查询
查询考勤信息-查看全部

统计缺勤人员

统计缺勤人员功能,是用户模式和管理模式都有的功能,可统计出缺勤人员,既可按条件统计,也可统计全部,按条件统计时需输入指定的条件,输入后系统将统计并展示出所有符合条件的缺勤人员,统计全部将展示出所有有缺勤记录的学生,并统计缺勤次数。

统计缺勤人员
统计缺勤人员-按条件统计
统计缺勤人员-按条件统计
统计缺勤人员-统计全部

修改密码

修改密码功能,是用户模式的功能,可进行密码的修改,需输入旧密码和两次新密码,输入无误将成功修改密码。

修改密码
修改密码成功

管理菜单界面

管理员登录成功后将进入到管理菜单界面,在此界面可进行各种管理功能选择,包括:查看学生信息、查询考勤信息、添加考勤信息、删除考勤信息、修改考勤信息、统计缺勤人员、超级管理权限、初始化系统、退出系统。

管理菜单界面

查看学生信息

查看学生信息功能,是管理模式的功能,可查看所有学生的信息,进入此界面后先展示所有学生的简易信息,输入指定的学生编号可查看指定学生的详细信息。

查看学生信息
查看学生信息

添加考勤信息

添加考勤信息功能,是管理模式的功能,进入此界面后依次输入相应信息,信息输入完整无格式错误且确定后,该条考勤信息将录入到系统中并保存。

添加考勤信息

删除考勤信息

删除考勤信息功能,是管理模式的功能,进入此界面后会展示所有考勤信息,可输入指定编号删除指定考勤信息,亦可输入“0”删除全部考勤信息。

删除考勤信息

修改考勤信息

修改考勤信息功能,是管理模式的功能,进入此界面后会展示所有考勤信息,可输入指定编号进行指定考勤信息的修改,后续可对该考勤信息进行单个参数修改或整条修改。

修改考勤信息
修改考勤信息
修改考勤信息-修改单个参数

超级管理权限

超级管理权限功能,是管理模式的功能,输入超级管理权限密码“ADMIN”后,可进入超级管理模式,此模式下可对学生的个人信息进行各种操作,但当时由于时间问题(实则偷懒 ),所以该部分功能暂未实现。

超级管理权限
超级管理权限-NOTHING

初始化系统

初始化系统功能,是管理模式的功能,可将系统初始化,将所有信息还原至系统最初保存的信息。

初始化系统

代码展示

本程序代码较多且有详细注释,在此仅展示部分重要代码,完整代码请至文章开头处下载程序,进行了解。

为了系统界面的美观 强迫症患者 ,所以本程序的输出语句很多且很长,很多代码都在调整界面,请别介意。

数据结构

本程序使用的数据结构为单链表,整个程序的数据存放在考勤信息链表和学生信息链表中,并将这两条链表保存至文件中,以下代码为链表的定义。

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;                     //学生信息单链表类型,即头指针类型

函数声明及全局变量

本程序定义了17个主要功能函数和9个辅助操作函数,函数声明如下,全局变量为两条单链表,即两条单链表的头指针和尾指针。

//主要功能函数
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 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); //快速排序

//全局变量,学生信息链表、考勤信息链表
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  ===============                                   ===============\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;
}

… …
其他代码请见程序源码!

后记

本程序仅供学习和参考,请勿抄袭或另作他用。

感谢观看,有什么问题可在下方评论区进行评论,若觉得本文章写得不错,还请点个赞呢。

关注我,收看更多精彩!( • ̀ω•́ )✧求点赞、评论、收藏、关注

猜你喜欢

转载自blog.csdn.net/XiuMu_0216/article/details/125821166