学生考勤管理系统

在这里插入图片描述

#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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值