c语言课设-考勤管理系统

发布于:2023-07-04 ⋅ 阅读:(96) ⋅ 点赞:(0)

这些天因为补修c语言课设,在花费了一段时间后写完了这个课设,课设的要求如下:
考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假及旷课)。试设计一考勤管理系统,使之能提供以下功能:
(1) 录入学生的缺课记录;
(2) 修改某个学生的缺课记录;
(3) 查询某个学生的缺课情况;
(4) 统计某段时间内,旷课学生姓名及旷课次数,按旷课次数由多到少排序;
(5) 统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;
(6) 系统以菜单方式工作。
本程序由visual studio 2017编写
我会先将程序放上来然后后面慢慢加注释,程序的大概思路是设计三个结构体,考勤信息结构体负责保存每一条缺课信息,其中包括学生信息和课程信息,每次添加考勤信息的时候,剩下的两个学生和课程结构体会自动从里面添加所需要的信息,整个程序的功能实现也是建立在三个结构体的基础上的。

#define _CRT_SECURE_NO_WARNINGS
#define N 1000
#define M 100
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct kaoqing {
	//int total;//旷课总节数
	int number;// 旷课的第几节
	char coure_name[20];//课程名称
	char stu_name[20];//学生名字
	char type[20];//课程类型
	int year;
	int month;
	int day;
};
struct stu {
	char stu_name2[20];
	int num;//每个学生的旷课总节数,旷课次数
};
struct course {
	char coure_name2[20];//课程名称
	int num;//本门课程旷课人次
};
struct kaoqing K[N+1]= { 0 };
struct stu S[M + 1] = { 0 };
struct course C[M + 1] = { 0 };
int add_course(char name[], int *t)
{
	int z = *t;
	int i = 1;
	int flag = 0;
	for (; i < z; i++) {
		if (strcmp(C[i].coure_name2, name) == 0) {
			flag = 1;
		}
	}
	if (flag) {
		return 1;//
	}
	strcpy(C[i].coure_name2, name);
	++(*t);
	return 0;
}
int add_stu(char name[],int *t)
{
	int m = *t;
	int i = 1;
	int flag = 0;
	for(;i<m;i++) {
		if (strcmp(S[i].stu_name2, name) == 0) {
			flag = 1;
		}
	}
	if (flag) {
		return 1;//
	}
	strcpy(S[i].stu_name2, name);
	++(*t);
	return 0;
}
void Coure_show(int n,int m)
{
	int imax; int temp;
	int i = 1, j = 1;
	int by, bm, bd, ey, em, ed;
	for (; i < n; i++) {
		printf("%s缺课日期:%d年%d月%d日 第%d节课 %s %s\n", K[i].stu_name, K[i].year, K[i].month, K[i].day, K[i].number, K[i].coure_name, K[i].type);
	}
	printf("请输入统计时间段的起点时间:");
	scanf("%d%d%d", &by, &bm, &bd);
	printf("请输入统计时间段的终点时间:");
	scanf("%d%d%d", &ey, &em, &ed);
	i = 1; j = 1;
	for (; i < m; i++) {
		for (j = 1; j < n; j++) {
			if ((K[j].year >= by) && (K[j].year <= ey)) {
				if ((K[j].month >= bm) && (K[j].month <= em)) {
					if ((K[j].day >= bd) && (K[j].day <= ed)) {

						if (strcmp(K[j].coure_name, C[i].coure_name2) == 0) {
							++C[i].num;
						}
					}
				}
			}
		}
	}
	i = 1; j = 1;
	for (; i < m; i++)
	{
		imax = i;
		for (j = i + 1; j < m; j++)
		{
			if (C[j].num > C[imax].num) {
				imax = j;
			}
		}
		temp = C[imax].num;
		C[imax].num = C[i].num;
		C[i].num = temp;
	}
	i = 1; j = 1;
	printf("从%d年%d月%d日到%d年%d月%d日这段时间内,旷课情况如下:\n", by, bm, bd, ey, em, ed);
	for (; i < m; i++) {
		//if (C[i].num > 0) {
			printf("%s   旷课人次%d\n", C[i].coure_name2, C[i].num);
		//}
		for (j = 1; j < n; j++) {
			if (strcmp(K[j].coure_name, C[i].coure_name2) == 0) {
				printf("缺课日期:%d年%d月%d日   第%d节课  %s   %s\n", K[j].year, K[j].month, K[j].day, K[j].number, K[j].stu_name, K[j].type);
			}
		}
	}
	i = 1;
	for (; i < m; i++) {
		C[i].num = 0;
	}
}
void Info_show(int n,int m)
{
	int imax; int temp;
	int i = 1,j=1;
	int by, bm, bd,ey,em,ed;
	for (; i < n; i++) {
			printf("%s缺课日期:%d年%d月%d日 第%d节课 %s %s\n",K[i].stu_name,K[i].year, K[i].month, K[i].day, K[i].number, K[i].coure_name, K[i].type);
	}
	printf("请输入统计时间段的起点时间:");
	scanf("%d%d%d", &by, &bm, &bd);
	printf("请输入统计时间段的终点时间:");
	scanf("%d%d%d", &ey, &em, &ed);
	i = 1; j = 1;
	for (; i < m; i++) {
		for (j=1; j < n; j++) {
			if ((K[j].year >= by) && (K[j].year <= ey)) {//满足年份则不需要管月份和日期
				if ((K[j].month >= bm) && (K[j].month <= em)) {//不满足年份满足月份则不需要管
					if ((K[j].day >= bd) && (K[j].day <= ed)) {

						if (strcmp(K[j].stu_name,S[i].stu_name2)==0) {
							++S[i].num;
						}
					}
				}
			}
		}
	}
	i = 1; j = 1;
	for (; i < m; i++)
	{
		imax = i;
		for (j = i + 1; j < m; j++)
		{
			if (S[j].num > S[imax].num) {
				imax = j;
			}
		}
		temp = S[imax].num;
		S[imax].num = S[i].num;
		S[i].num = temp;
	}
	i = 1; j = 1;
	printf("从%d年%d月%d日到%d年%d月%d日这段时间内,旷课情况如下:\n",by,bm,bd,ey,em,ed);
	for (; i < m; i++) {
		if (S[i].num > 0) {
			printf("%s   旷课次数%d\n", S[i].stu_name2, S[i].num);
		}
		for (j=1; j < n; j++) {
			if (strcmp(K[j].stu_name, S[i].stu_name2) == 0) {
				printf("缺课日期:%d年%d月%d日   第%d节课  %s   %s\n", K[j].year, K[j].month, K[j].day, K[j].number, K[j].coure_name, K[j].type);
			}
		}
	}
	i = 1;
	for (; i < m; i++) {
		S[i].num = 0;
	}
}
void Info_change(int n)
{
	char name[20];
	int i=1;
	int flag = 0;//记录是否修改
	int year, month, day, number;
	printf("请输入想修改的学生姓名:");
	scanf("%s", name);
	printf("请输入想修改记录的时间和节数:");
	scanf("%d%d%d%d", &year, &month, &day, &number);
	for (; i < n; i++) {
		if ((strcmp(K[i].stu_name,name) == 0)&&((K[i].year==year)&&(K[i].month==month)&&(K[i].day==day)&&(K[i].number==number))) {
			printf("请依次输入新的该条信息!");
			printf("请输入缺课日期,格式为年 月 日:");
			scanf("%d%d%d", &K[i].year, &K[i].month, &K[i].day);
			printf("请输入缺课课程为当日第几节:");
			scanf("%d", &K[i].number);
			printf("请输入缺课课程名称:");
			scanf("%s", K[i].coure_name);
			printf("请输入缺课类型:");
			scanf("%s", K[i].type);
			printf("请输入缺课学生姓名:");
			scanf("%s", K[i].stu_name);
			printf("修改成功!");
			++flag;
		}
	}
	if (!flag) {
		printf("修改失败!请联系管理员进行错误排查!");
	}
}
void Info_find(int n)
{
	char name[20];
	int i = 1;
	printf("请输入查找学生姓名:");
	scanf("%s", name);
	printf("%s的缺课情况如下:\n",name);
	for (; i < n; i++) {
		if (strcmp(K[i].stu_name, name) == 0) {
			printf("缺课日期:%d年%d月%d日 第%d节课 %s %s\n", K[i].year, K[i].month, K[i].day, K[i].number, K[i].coure_name, K[i].type);
		}
	}
}
void Info_init(int *x,int *y,int *z) 
{
	/*
	int number;// 旷课的第几节
	char coure_name[20];//课程名称
	char stu_name[20];//学生名字
	char type[20];//课程类型
	int year;
	int month;
	int day;
	*/
	int a_s;
	int a_c;
	int X = *x;
	int Y = *y;
	int Z = *z;
	int numbera;// 旷课的第几节
	char coure_namea[20];//课程名称
	char stu_namea[20];//学生名字
	char typea[20];//课程类型
	int yeara;
	int montha;
	int daya;
	FILE *fp;
	if ((fp = fopen("INFO.txt", "r")) == NULL) {
		printf("数据读入失败!请联系管理员进行错误排查!");
		exit(0);  //退出程序(结束程序)
	}
	while (fscanf(fp, "%d%s%s%s%d%d%d", &numbera, coure_namea, stu_namea, typea, &yeara, &montha, &daya) == 7) {
		K[*x].number = numbera;
		strcpy(K[*x].coure_name,coure_namea);
		strcpy(K[*x].stu_name, stu_namea);
		strcpy(K[*x].type, typea);
		K[*x].year = yeara;
		K[*x].month = montha;
		K[*x].day = daya;
		++(*x);
		printf("%d\n", *x);
		a_s = add_stu(stu_namea,y);
		a_c = add_course(coure_namea,z);
		/*if (!a_s) {
			printf("%d\n", *y);
			printf("学生姓名数组初始化成功!\n");
		}
		
		if (!a_c) {
			printf("%d\n", *z);
			printf("课程名称数组初始化成功!\n");
		}*/

	}
	fclose(fp);

}
void Info_save(int n)
{
	int i=1;
	FILE * fp;

	if ((fp = fopen("INFO.txt", "w")) == NULL) {
		printf("数据读入失败!请联系管理员进行错误排查!");
		exit(0);  //退出程序(结束程序)
	}
	for (; i < n; i++) {
		fprintf(fp, "%d %s %s %s %d %d %d\n", K[i].number, K[i].coure_name, K[i].stu_name, K[i].type, K[i].year, K[i].month, K[i].day);
	}
	fclose(fp);
}
void Info_in(int *w,int *z,int *v)
{
	char name[20];
	char c_name[20];
	int flag1, flag2;
	int n = *w;//记录数组的控制数
	int m = *z;//学生数组的控制数
	int o = *z;//课程数组的控制数
	printf("请依次输入学生的缺课情况:");
	printf("请输入缺课日期,格式为年 月 日:");
	scanf("%d%d%d", &K[n].year, &K[n].month, &K[n].day);
	printf("请输入缺的课程为当日第几节:");
	scanf("%d", &K[n].number);
	printf("请输入缺的课程的名称:");
	scanf("%s", K[n].coure_name);
	strcpy(c_name, K[n].coure_name);
	flag1 = add_course(c_name, v);
	if (!flag1)
	{
		printf("课程名称添加成功");
	}
	printf("请输入缺课的学生姓名:");
	scanf("%s", K[n].stu_name);
	strcpy(name, K[n].stu_name);
	flag2=add_stu(name,z);
	if (!flag2)
	{
		printf("学生姓名添加成功");
	}
	printf("请输入缺课类型:");
	scanf("%s", K[n].type);
	printf("添加成功!");
	++(*w);
}
int main()
{
	int X = 1; int Y = 1; int Z = 1;
	Info_init(&X,&Y,&Z);
	while (1)
	{
		system("cls");
		int n;
		printf("            *************************************************************************\n");
		printf("            **                                                                     **\n");
		printf("            **               -------欢迎使用考勤管理系统------                     **\n");
		printf("            **                                                                     **\n");
		printf("            *************************************************************************\n\n");
		printf("\t\t\t         [    1.缺课信息登记    ]\n\n");
		printf("\t\t\t         [    2.缺课信息修改    ]\n\n");
		printf("\t\t\t         [    3.缺课信息查询    ]\n\n");
		printf("\t\t\t         [    4.旷课学生信息展示]\n\n");
		printf("\t\t\t         [    5.课程情况展示    ]\n\n");
		printf("\t\t\t         [    6.退出系统        ]\n\n");
		printf("请输入需要使用的功能数字:");
		scanf("%d", &n);
		while (n < 1 || n > 7) {
			printf("\n\n代码输入有误,请您重新输入:");
			scanf("%d", &n);
		}
		switch (n) {
		case 1:Info_in(&X,&Y,&Z); break;
		case 2:Info_change(X); break;
		case 3:Info_find(X); break;
		case 4:Info_show(X,Y); break;
		case 5:Coure_show(X,Z); break;
		case 6:exit(0);
		}
		Info_save(X);
		system("pause");
	}
	return 0;
}
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到