欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学生考勤管理系统

程序员文章站 2024-01-21 11:03:16
...

学生考勤管理系统

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_STYLE_SIZE 100//最大存储数量

typedef struct _STU
{
	int year;//日期 年-月-日
	int mon;
	int day;
	int begin;//第几节课 begin-end
	int end;
	char name[20];//学生姓名
	char class_name[20];//课程名
	char style[20];//缺课类型
}STU;

int menu()
{
	int chioce;//记录选择
	system("cls");//清屏
	printf("1:录入记录\n");
	printf("2:修改记录\n");
	printf("3:查询记录\n");
	printf("4:统计某天情况\n");
	printf("5:显示所有信息\n");
	printf("6:删除记录\n");
	printf("0:退出\n");
	scanf("%d",&chioce);
	while(chioce<0||chioce>6)//确保选择范围正确
	{
		printf("输入错误,重新输入!\n");
		scanf("%d",&chioce);
	}
	return chioce;//选择结果返回给主函数
}

//对日期
//排序思想 先按年份排  如果年份相同 按月份排  如果年月相同 按日排 
//如果年月日都相同  按缺课排
void Sort_Time(STU stu[],int NUM)
{
	int i,j;
	STU temp;
	for(i=0;i<NUM;i++)
	{
		for(j=i+1;j<NUM;j++)
		{
			if(stu[i].year>stu[j].year)
			{
				temp=stu[i];
				stu[i]=stu[j];
				stu[j]=temp;
			}
			if(stu[i].year==stu[j].year)
			{
				if(stu[i].mon>stu[j].mon)
				{
					temp=stu[i];
					stu[i]=stu[j];
					stu[j]=temp;
				}
			}
			if(stu[i].year==stu[j].year&&stu[i].mon==stu[j].mon)
			{
				if(stu[i].day>stu[j].day)
				{
					temp=stu[i];
					stu[i]=stu[j];
					stu[j]=temp;
				}
			}

			if(stu[i].year==stu[j].year&&stu[i].mon==stu[j].mon&&stu[i].day==stu[j].day)
			{
				if(stu[i].begin>stu[j].begin)
				{
					temp=stu[i];
					stu[i]=stu[j];
					stu[j]=temp;
				}
			}


		}
	}
}

int Input_New_Stu(STU stu[],int NUM)
{
	char temp[20];//记录选择
	int i,flag=1;
	system("cls");//清屏
	printf("请输入日期(year-mon-day)\n");
	fflush(stdin);
	scanf("%d-%d-%d",&stu[NUM].year,&stu[NUM].mon,&stu[NUM].day);
	printf("请输入第几节课(begin-end)\n");
	fflush(stdin);
	scanf("%s",temp);//因为可以输入5-6或者单独5这样  所以需要自己判断输入的是什么
	stu[NUM].begin=0;//初始化0
	stu[NUM].end=0;

	for(i=0;temp[i]!='\0';i++)
	{
		if(flag&&temp[i]!='-')//flag=1说明第一个数字还没有完成  
		{
			stu[NUM].begin=stu[NUM].begin*10 +(temp[i]-'0');
		}
		if(temp[i]=='-')//说明第一个数字完成
		{
			flag=0;
		}
		if(flag==0&&temp[i]!='-')//第一个数字完成
		{
			stu[NUM].end=stu[NUM].end*10 +(temp[i]-'0');
		}
	}

	printf("请输入课程名\n");
	fflush(stdin);
	scanf("%s",&stu[NUM].class_name);
	printf("请输入学生姓名\n");
	fflush(stdin);
	scanf("%s",&stu[NUM].name);
	printf("请输入缺课类型(迟到、早退、请假、旷课)\n");
	fflush(stdin);
	scanf("%s",&stu[NUM].style);

	printf("确认添加(Y/N)?\n");
	fflush(stdin);
	scanf("%s",temp);
	if(!strcmp(temp,"Y")||!strcmp(temp,"y"))//判断是否按Y
	{
		printf("添加成功\n");
		system("pause");
		return NUM+1;
	}
	printf("已取消添加\n");//其它键取消添加
	system("pause");
	return NUM;
}




//显示信息  NUM代表显示个数  stu代表开始显示位置
void Display_Stu_Info(STU stu[],int NUM)
{
	int i;
	if(NUM==0)//如果为0则不显示信息
	{
		printf("无旷课信息!\n");
		return ;
	}
	
	for(i=0;i<NUM;i++)
	{
		printf("%4d-%02d-%-12d",stu[i].year,stu[i].mon,stu[i].day);
		if(stu[i].end==0)
		{
			printf("%-20d",stu[i].begin);
		}
		else
		{
			printf("%2d-%-17d",stu[i].begin,stu[i].end);
		}
		printf("%-20s",stu[i].class_name);
		printf("%-20s",stu[i].name);
		printf("%-20s\n",stu[i].style);
	}
}

void Serach_Stu_Info(STU stu[],int NUM)
{
	char temp[20];
	int i,flag=1;
	system("cls");
	printf("请输入要查询的学生姓名:");
	scanf("%s",temp);

	for(i=0;i<NUM;i++)
	{
		if(!strcmp(temp,stu[i].name))
		{
			if(flag)
			{
				printf("%-20s%-20s%-20s%-20s%-20s\n","日期","第几节课","课程名","学生姓名","缺课类型");
			}
			Display_Stu_Info(stu+i,1);
			flag=0;
		}
	}
	if(flag)
	{
		printf("该学生无缺课信息!\n");
	}
	system("pause");
}

int Del_Stu_Info(STU stu[],int NUM)
{
	int i,j,flag=1;
	char temp[20];

	system("cls");
	if(NUM==0)
	{
		printf("无信息!\n");
		system("pause");
		return NUM;
	}
	printf("%-20s%-20s%-20s%-20s%-20s\n","日期","第几节课","课程名","学生姓名","缺课类型");
	for(i=0;i<NUM;i++)
	{
		printf("编号:%d\n",i+1);
		Display_Stu_Info(stu+i,1);
	}
	printf("请输入要删除的编号:");
	scanf("%d",&flag);
	while(flag<=0||flag>NUM)
	{
		printf("编号错误,请重新输入\n");
		scanf("%d",&flag);
	}


	printf("确认删除(Y/N)?\n");
	fflush(stdin);
	scanf("%s",temp);
	if(!strcmp(temp,"Y")||!strcmp(temp,"y"))//判断是否按Y
	{

		for(j=flag-1;j<NUM;j++)//把要删除的用后面的数据覆盖
		{
			stu[j]=stu[j+1];//前面用后面的覆盖
		}
		printf("删除成功\n");
		system("pause");
		return NUM-1;//减去一个
	}
	printf("已取消删除\n");//其它键取消添加
	system("pause");
	return NUM;//没有删除
}

void Sort_Total(STU stu[],int NUM)
{
	int i,j;
	int count1,count2;
	STU temp;
	for(i=0;i<NUM;i++)
	{
		for(j=i+1;j<NUM;j++)
		{
			if(stu[j].year==stu[i].year&&stu[j].mon==stu[i].mon&&stu[j].day==stu[i].day)//对同一天进行排序
			{
				if(stu[i].end==0)//如果end是0  说明只缺一节课
				{
					count1=1;
				}
				else
				{
					count1=stu[i].end-stu[i].begin;//否则缺课是end-begin+1
				}
				if(stu[j].end==0)
				{
					count2=1;
				}
				else
				{
					count2=stu[j].end-stu[j].begin;
				}
				if(count1<count2)//根据缺课节数
				{
					temp=stu[i];
					stu[i]=stu[j];
					stu[j]=temp;
				}
				if(count1==count2)//如果缺课一样 根据名字排序
				{
					if(strcmp(stu[i].name,stu[j].name)>0)
					{
						temp=stu[i];
						stu[i]=stu[j];
						stu[j]=temp;
					}
				}
			}
		}
	}
}


void Total_Stu_Info(STU stu[],int NUM)
{
	int year,mon,day,i,flag=1;
	system("cls");
	printf("请输入要查询的日期(year-mon-day):");
	scanf("%d-%d-%d",&year,&mon,&day);
	for(i=0;i<NUM;i++)
	{
		if(year==stu[i].year&&mon==stu[i].mon&&day==stu[i].day)//如果符合查询日期
		{
			if(flag)//只输出一次 然后flag就是0
			{
				printf("%-20s%-20s\n","姓名","缺课数");
			}
			flag=0;
			printf("%-20s",stu[i].name);
			if(stu[i].end==0)
			{
				printf("%-20d\n",1);
			}
			else
			{
				printf("%-20d\n",stu[i].end-stu[i].begin+1);
			}
		}
	}
	if(flag)//一次都没输出 flag还是1
	{
		printf("该日期无缺课记录!\n");
	}
	system("pause");
}


void Modify_Stu_Info(STU stu[],int NUM)//修改信息
{
	int i,j,flag=1;
	char temp[20];
	STU swap;//临时变量 用于交换
	system("cls");
	if(NUM==0)
	{
		printf("无缺课信息!\n");
		system("pause");
		return ;
	}

	printf("%-20s%-20s%-20s%-20s%-20s\n","日期","第几节课","课程名","学生姓名","缺课类型");
	for(i=0;i<NUM;i++)
	{
		printf("编号:%d\n",i+1);
		Display_Stu_Info(stu+i,1);
	}//显示所有信息

	printf("请输入要修改的编号:");
	scanf("%d",&j);
	while(j<=0||j>NUM)
	{
		printf("编号错误,请重新输入\n");
		scanf("%d",&j);
	}//选择要修改的编号
	
	printf("请输入日期(year-mon-day)\n");
	fflush(stdin);
	scanf("%d-%d-%d",&swap.year,&swap.mon,&swap.day);
	printf("请输入第几节课(begin-end)\n");
	fflush(stdin);
	scanf("%s",temp);
	swap.begin=0;
	swap.end=0;
	for(i=0;temp[i]!='\0';i++)
	{
		if(flag&&temp[i]!='-')
		{
			swap.begin=swap.begin*10 +(temp[i]-'0');
		}
		if(temp[i]=='-')
		{
			flag=0;
		}
		if(flag==0&&temp[i]!='-')
		{
			swap.end=swap.end*10 +(temp[i]-'0');
		}
	}
	printf("请输入课程名\n");
	fflush(stdin);
	scanf("%s",&swap.class_name);
	printf("请输入学生姓名\n");
	fflush(stdin);
	scanf("%s",&swap.name);
	printf("请输入缺课类型(迟到、早退、请假、旷课)\n");
	fflush(stdin);
	scanf("%s",&swap.style);

	printf("确认修改(Y/N)?\n");
	fflush(stdin);
	scanf("%s",temp);
	if(!strcmp(temp,"Y")||!strcmp(temp,"y"))//判断是否按Y
	{
		stu[j-1]=swap;
		printf("修改成功\n");
		system("pause");
		return ;
	}
	printf("已取消修改\n");//其它键取消添加
	system("pause");
}

//保存文件
void Save_Stu_Info(STU stu[],int NUM)
{
	FILE* fp=fopen("Stu_Info.txt","w");//保存学生信息
	if(fp==NULL)
	{return ;}
	fwrite(&stu[0],MAX_STYLE_SIZE,sizeof(STU),fp);
	fclose(fp);

	fp=fopen("NUM_Info.txt","w");//保存学生数量
	if(fp==NULL)
	{return ;}
	fprintf(fp,"%d",NUM);
	fclose(fp);
}

void Load_Stu_Info(STU stu[],int* n)//读取文件
{
	FILE* fp=fopen("Stu_Info.txt","r");//读取学生信息
	if(fp==NULL)
	{return ;}
	fread(&stu[0],MAX_STYLE_SIZE,sizeof(STU),fp);
	fclose(fp);

	fp=fopen("NUM_Info.txt","r");//读取学生数量
	if(fp==NULL)
	{return ;}
	fscanf(fp,"%d",n);
	fclose(fp);
}


int main()
{
	STU stu[MAX_STYLE_SIZE];//定义结构体数组
	int NUM=0,chioce;//记录选择以及数量
	system("mode con: cols=120 lines=35");//改变控制台大小
	Load_Stu_Info(stu,&NUM);//读取文件
	do
	{
		chioce=menu();//获取选择
		switch(chioce)
		{
		case 1:
			NUM=Input_New_Stu(stu,NUM);//添加
			Save_Stu_Info(stu,NUM);//保存
			break;
		case 2:
			Modify_Stu_Info(stu,NUM);//修改
			Save_Stu_Info(stu,NUM);//保存
			break;
		case 3:
			Sort_Time(stu,NUM);//对时间排序
			Serach_Stu_Info(stu,NUM);//查找
			break;
		case 4:
			Sort_Total(stu,NUM);//对缺课次数姓名排序
			Total_Stu_Info(stu,NUM);//统计
			break;
		case 5:
			system("cls");
			printf("%-20s%-20s%-20s%-20s%-20s\n","日期","第几节课","课程名","学生姓名","缺课类型");
			Display_Stu_Info(stu,NUM);//显示
			system("pause");//暂停
			break;
		case 6:
			NUM=Del_Stu_Info(stu,NUM);//删除
			Save_Stu_Info(stu,NUM);//保存
			break;
		}
	}while(chioce!=0);

	return 0;
}