学习打卡day9

考勤打卡系统

与高中同学一起编程

代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<malloc.h>
#include<time.h>		//所使用的头文件

typedef struct		//时间结构体定义
{
	int hour;
	int minute;
}TIME;

typedef struct worker  //职工结构体定义
{
	char id[10];
	TIME time[20];
	struct worker *next;
}worker;
worker *head=NULL;		        //链表头指针head
int writeinfo_flag=0;		        //信息保存标记
char password[16]="123456";		//初始密码
struct tm *timeinfo;


void detect()         //检查是否建立信息库 
{
	if(head==NULL)
	{
		printf("\n\t\t\t不存在职工信息\n\n\t\t\t请按回车键返回主菜单新建职工信息!");
		getchar();getchar();
		system("cls");
		return;
	}
}
  

void start()  //初始界面
{
	printf("欢迎使用职工考勤管理系统,按任意键以进入系统");
	getch();
	system("cls");
	return;
}


/*选择菜单*/
int select()
{
	worker *p=head;
	int c,k;
	time_t nowtime;
	time( &nowtime );
	timeinfo = localtime( &nowtime );
	printf("**************选择菜单**************\t");
	//在菜单中显示当前时间
	printf("现在时间:星期%d  %2d:%2d",timeinfo->tm_wday,timeinfo->tm_hour,timeinfo->tm_min);
	printf("\n新建职工信息(0)\n");
	printf("输入考勤信息(1)\n");
	printf("当天考勤信息(2)\n");
	printf("本周考勤信息(3)\n");
	printf("删除考勤信息(4)\n");
	printf("修改考勤信息(5)\n");
	printf("保存所有信息(6)\n");
	printf("修改密码    (7)\n");
	printf("退出        (8)");
	printf ("\n(任何情况下按Ctrl+C退出程序)\n"); 
	printf ("\n\n请选择功能:") ; 
	scanf("%d",&c);
	if(timeinfo->tm_wday==0&&p!=NULL)		//周日初始化所有考勤信息
	{
		for(k=0;k<20;k++)
		{
			p->time[k].hour=88;
			p->time[k].minute=88;
		}
	}
	return c;
}


void createstaff()		//新建职工信息
{
	worker *p,*rear;
	int i,n,k;
	if(head!=NULL)
	{
		printf("\n\n\n\n\t\t\t职工信息数据库已存在\n\n\t\t\t新建职工信息将续接在信息库的后面\n\n\n\t\t\t按回车键继续");
		getchar();getchar();
		rear=head;
		while(rear->next!=NULL)
			rear=rear->next;
		system("cls");
	}
	printf("\n\n请输入希望建立职工信息条数:");
	scanf("%d",&n);
	if(n<=0)
	{
		printf("\n\n输入错误,新建信息至少一条!\n");
		printf("\n\n请按回车键返回主菜单重新开始!\n");
		getchar();getchar();
		system("cls");
		return;
	}
	printf("\n请输入职工的工号(至多10个字符):\n");
	for(i=0;i<n;i++)
	{
		p=(worker*)malloc(sizeof(worker));
		scanf("%s",p->id);
		for(k=0;k<20;k++)   //时间初始化为88:88
		{
			p->time[k].hour=88;
			p->time[k].minute=88;
		}
		if(head==NULL)
		{
			head=p;
			rear=p;
		}
		else
		{
			rear->next=p;
			rear=p;
		}
	}
	p->next=NULL;
	printf("\n%d条信息建立完毕!\n\n请按回车键返回主菜单\n",n);
	getchar();getchar();
	system("cls");
	writeinfo_flag=1;
	return;
}


void recordRec()		//录入考勤信息
{
	time_t nowtime;
	worker *p;
	char s[10];
	int c,m,week;
	detect();
	printf("\n\n\n\t\t\t请选择录入考勤种类:\n\n\t\t\t1.上午上班(8:00)\n\n\t\t\t2.上午下班(11:30)\n\n\t\t\t3.下午上班(2:00)\n\n\t\t\t4.下午下班(5:30)\n\n");
	printf("\n\t\t您的选择(以回车键结束):");
	scanf("%d",&m);
	system("cls");
	//可通过工号或姓名;录入
	printf("\n\n\n\n\n\n\t\t\t请输入工号(以回车键结束):");
			scanf("%s",s);
			for(p=head;strcmp(p->id,s)!=0&&p->next!=NULL;p=p->next);
			if(strcmp(p->id,s)!=0&&p->next==NULL)
			{
				printf("\n\n\n\n\t\t\t不存在该工号\n");
				printf("\n\n\n\n\t\t\t请按回车键返回主菜单重新开始!\n");
				getchar();getchar();
				system("cls");
				return;
			}
			time( &nowtime );
			timeinfo = localtime( &nowtime );
			week=timeinfo->tm_wday;
			p->time[4*week+m-5].hour=(timeinfo->tm_hour);		//存储时间
			p->time[4*week+m-5].minute=(timeinfo->tm_min);
	system("cls");
	printf("\n\n\n\n\n\n\t\t\t考勤成功!请按回车键返回主菜单\n");
	getchar();getchar();
	writeinfo_flag=1;
	system("cls");
	return;
}


void todayRec()			//浏览当天的考勤信息
{
	worker *p=head;
	int m,week;
	week=timeinfo->tm_wday;
	detect();
	printf("\n职工今天整体出勤情况如下(没有考勤一律视为旷工):\n\n");
	printf("职工号	姓名	上午上班	上午下班	下午上班	下午下班\n");
	while(p!=NULL)
	{
		m=0;
		printf("\n%d",p->id);
		if((p->time[(week-1)*4].hour>8&&p->time[(week-1)*4].hour<25)||(p->time[(week-1)*4].hour==8&&p->time[(week-1)*4].minute>0))
			printf("	迟到");
		else if(p->time[(week-1)*4].hour==88)
			printf("	旷工");
		else if(p->time[(week-1)*4].hour!=88)
		{printf("	    ");m++;}

		if((p->time[(week-1)*4+1].hour<11&&p->time[(week-1)*4].hour!=0)||(p->time[(week-1)*4+1].hour==11&&p->time[(week-1)*4+1].minute<30))
			printf("		早退");
		else {printf("		     ");m++;}

		if((p->time[(week-1)*4+2].hour>14&&p->time[(week-1)*4+2].hour<25)||(p->time[(week-1)*4+2].hour==14&&p->time[(week-1)*4+2].minute>0))
			printf("		迟到");
		else if(p->time[(week-1)*4+2].hour==88)
			printf("		旷工");
		else if(p->time[(week-1)*4+2].hour!=88)
		{printf("		    ");m++;}

		if((p->time[(week-1)*4+3].hour<17&&p->time[(week-1)*4+2].hour!=0)||(p->time[(week-1)*4+3].hour==17&&p->time[(week-1)*4+3].minute<30))
			printf("		早退");
		else {printf("		     ");m++;}

		if(m==4)
			printf("     全勤!");
		p=p->next;
	}
	printf("\n\n显示完毕,按回车键返回主菜单!");
	getchar();getchar();
	system("cls");
	return;
}


void wholeRec()			//根据工号或姓名查找考勤信息
{
	worker *p=head;
	int c,i;
	char s[10];
	detect();
	printf("\n\n\n\n\n\n\t\t\t请输入工号(以回车键结束):");
			scanf("%s",s);
			for(p=head;strcmp(p->id,s)!=0&&p->next!=NULL;p=p->next);
			if(strcmp(p->id,s)!=0&&p->next==NULL)
			{
				printf("\n\n\n\n\t\t\t不存在该工号\n");
				printf("\n\n\n\n\t\t\t请按回车键返回主菜单重新开始!\n");
				getchar();getchar();
				system("cls");
				return;
			}		
	system("cls");
	printf("职工号	姓名	     上午上班	   上午下班	   下午上班	   下午下班\n\n");
	printf(" %s",p->id);
	printf("	周一");
	for(i=0;i<4;i++)
	{
		if(p->time[i].hour==88)
			printf("  --:--  	  ");
		if(p->time[i].hour!=88)
			printf("  %2d:%2d  	  ",p->time[i].hour,p->time[i].minute);
		if(i==4)
			printf("\n\n");
	}

	printf("\n	        周二");
	for(i=4;i<8;i++)
	{
		if(p->time[i].hour==88)
			printf("  --:--  	  ");
		if(p->time[i].hour!=88)
			printf("  %2d:%2d  	  ",p->time[i].hour,p->time[i].minute);
		if(i==8)
			printf("\n\n");
	}
	printf("\n	        周三");
	for(i=8;i<12;i++)
	{
		if(p->time[i].hour==88)
			printf("  --:--  	  ");
		if(p->time[i].hour!=88)
			printf("  %2d:%2d  	  ",p->time[i].hour,p->time[i].minute);
		if(i==12)
			printf("\n\n");
	}
	printf("\n	        周四");
	for(i=12;i<16;i++)
	{
		if(p->time[i].hour==88)
			printf("  --:--  	  ");
		if(p->time[i].hour!=88)
			printf("  %2d:%2d  	  ",p->time[i].hour,p->time[i].minute);
		if(i==16)
			printf("\n\n");
	}
	printf("\n	        周五");
	for(i=16;i<20;i++)
	{
		if(p->time[i].hour==88)
			printf("  --:--  	  ");
		if(p->time[i].hour!=88)
			printf("  %2d:%2d  	  ",p->time[i].hour,p->time[i].minute);
		if(i==20)
			printf("\n\n");
	}

	printf("\n\n\n\n\n\n\t\t\t显示完毕,按回车键返回主菜单!");
	getchar();getchar();
	system("cls");
	return;
}


void save()		//储存所有信息
{
	worker *p=head;
	FILE *fp,*key;
	int i;
	if(writeinfo_flag==0)
	{
		printf("\n\n\n\n\t\t\t信息无改动,无需保存!\n\n\t\t\t请按回车键返回主菜单\n");
		getchar();getchar();
		system("cls");
		return;
	}
	if(writeinfo_flag==1)
	{
		if((fp=fopen("workerRec.txt","w"))==NULL||(key=fopen("key.txt","w"))==NULL)
		{
			printf("\n\t\t\t提示:\n\n\t\t\t存储信息失败!\n");
			printf("\n\t\t\t请按回车键进入主菜单重新开始\n");
			getchar();getchar();
			system("cls");
			return;
		}
		while(p!=NULL)
		{
			fprintf(fp,"%s\n",p->id);
			for(i=0;i<20;i++)
				fprintf(fp,"%d\n%d\n",p->time[i].hour,p->time[i].minute);
			p=p->next;
		}
		fprintf(key,"%s",password);
		fclose(fp),fclose(key);
		writeinfo_flag=0;		//消除改动标志
		printf("\n\n\n\n\n\t\t\t保存完毕,按回车键继续!");
		getchar();getchar();
		system("cls");
		return;
	}
}


void deleteRec()			//删除考勤信息
{
	worker *p,*pre=head;
	char s[16];
	int c;
	detect();
	printf("\n\n\n\t\t\t提示:\n\n\t\t\t初始密码为:123456\n");
	printf("\n\n\n\t\t\t请输入密码(密码不超过15个字符):");
	scanf("%s",s);
	while(strcmp(password,s)!=0)
	{
		printf("n\n\n\t\t\t密码错误!\n\n");
		printf("\t\t\t按回车键返回主菜单!");
		getchar();getchar();
		system("cls");
		return;
	}
	printf("\n\n\n\t\t\t密码输入成功!\n\n\t\t\t请按回车键继续");
	getchar();getchar();
	system("cls");
	printf("\n\n\n\n\n\n\t\t\t请输入工号:");
			scanf("%s",s);
			for(p=head;strcmp(p->id,s)!=0&&p->next!=NULL;p=p->next);
			if(strcmp(p->id,s)!=0&&p->next==NULL)
			{
				printf("\n\n\n\n\t\t\t不存在该工号\n");
				printf("\n\n\n\n\t\t\t请按回车键返回主菜单重新开始!\n");
				getchar();getchar();
				system("cls");
				return;
			}
	system("cls");
	if(p==head)
		head=p->next;
	else
	{
		for(;pre->next!=p;pre=pre->next);
		pre->next=p->next;
	}
	free(p);
	printf("\n\n\n\n\n\n\t\t\t删除成功,请按回车键返回主菜单!");
	getchar();getchar();
	system("cls");
	writeinfo_flag=1;
	return;
}


void modifyRec()		//修改考勤信息
{
	worker *p,*pre=head;
	char s[16];
	int c;
	detect();
	printf("\n\n\n\t\t\t提示:\n\n\t\t\t初始密码为:123456\n");
	printf("\n\n\n\t\t\t请输入密码(密码不超过15个字符):");
	scanf("%s",s);
	if(strcmp(password,s)!=0)
	{
		printf("n\n\n\t\t\t密码错误!\n\n");
		printf("\t\t\t按回车键返回主菜单!");
		getchar();getchar();
		system("cls");
		return;
	}
	printf("\n\n\n\t\t\t密码输入成功!\n\n\t\t\t请按回车键继续");
	getchar();getchar();
	system("cls");
	printf("\n\n\n\n\n\n\t\t\t请输入工号:");
			scanf("%s",s);
			for(p=head;strcmp(p->id,s)!=0&&p->next!=NULL;p=p->next);
			if(strcmp(p->id,s)!=0&&p->next==NULL)
			{
				printf("\n\n\n\n\t\t\t不存在该工号\n");
				printf("\n\n\n\n\t\t\t请按回车键返回主菜单重新开始!\n");
				getchar();getchar();
				system("cls");
				return;
			}
	system("cls");
	printf("\n\n\n\t\t\t请选择要修改的内容:\n\n\t\t\t1.工号\n\n\t\t\t2.上午上班时间\n\n\t\t\t3.上午下班时间\n\n\t\t\t4.下午上班时间\n\n\t\t\t5.下午下班时间");
	printf("\n\n\n\t\t您的选择(以回车键结束):");
	scanf("%d",&c);
	system("cls");
	switch(c)
	{
	case 1:
		printf("\n\n\n\t\t\t请输入要修改的工号:");
		scanf("%s",p->id);break;
	case 2:
		printf("\n\n\n\t\t\t请输入要修改星期几的考勤:");
		scanf("%d",&c);
		printf("\n\n\n\t\t\t请输入要修改的时间和分钟:");
		scanf("%d%d",&p->time[(c-1)*4].hour,&p->time[(c-1)*4].minute);break;
	case 3:
		printf("\n\n\n\t\t\t请输入要修改星期几的考勤:");
		scanf("%d",&c);
		printf("\n\n\n\t\t\t请输入要修改的时间和分钟:");
		scanf("%d%d",&p->time[(c-1)*4+1].hour,&p->time[(c-1)*4+1].minute);break;
	case 4:
		printf("\n\n\n\t\t\t请输入要修改星期几的考勤:");
		scanf("%d",&c);
		printf("\n\n\n\t\t\t请输入要修改的时间和分钟:");
		scanf("%d%d",&p->time[(c-1)*4+2].hour,&p->time[(c-1)*4+2].minute);break;
	case 5:
		printf("\n\n\n\t\t\t请输入要修改星期几的考勤:");
		scanf("%d",&c);
		printf("\n\n\n\t\t\t请输入要修改的时间和分钟:");
		scanf("%d%d",&p->time[(c-1)*4+3].hour,&p->time[(c-1)*4+3].minute);break;


	}
	printf("\n\n\n\t\t\t修改成功,请按回车键返回主菜单!");
	getchar();getchar();
	system("cls");
	writeinfo_flag=1;
	return;
}
void loadRec()		//从磁盘导入信息
{
	worker *rear,*p,*pre;
	FILE *fp,*key;
	int i;
	if((fp=fopen("workerRec.txt","r"))==NULL)		//打开职工信息文件和密码文件
	{
		printf("\n提示:\n\n尚未建立职工信息\n");
		printf("\n请按回车键进入主菜单新建职工信息^_^\n");
		getchar();
		system("cls");		//清屏
		return;
	}

	while(!feof(fp))			//fp不指向文件末尾
	{
		p=(worker*)malloc(sizeof(worker));		//开辟一个新单元
		fscanf(fp,"%s",p->id);
		for(i=0;i<20;i++)
			fscanf(fp,"%d%d",&p->time[i].hour,&p->time[i].minute);
		if(head==NULL)
		{
			head=p;
			pre=p;
			rear=p;
		}
		else
		{
			rear->next=p;
			pre=rear;
			rear=p;
		}
	}
	pre->next=NULL;
	key=fopen("key.txt","r");
	while(!feof(key)) fscanf(key,"%s",password);
	fclose(fp);fclose(key);		//关闭文件
	return;
}


void resetPassword()		//重设密码
{
	char s[16];
	printf("\n\t\t请输入原密码:");
	scanf("%s",s);
	if(strcmp(password,s)!=0)
	{
		printf("\n\n\n\t\t密码错误!\n\n");
		printf("\n\n\n\t\t按回车键返回主菜单!");
		getchar();getchar();
		system("cls");
		return;
	}
	printf("\n\n\t\t密码输入成功!\n\n\t\t请按回车键继续");
	getchar();getchar();
	system("cls");
	printf("\n\n\n\t请输入要新的密码(密码不超过15个字符):");
	scanf("%s",s);
	strcpy(password,s);
	printf("\n\n\t修改成功,请按回车键返回主菜单!");
	getchar();getchar();
	system("cls");
	writeinfo_flag=1;
	return;
}


int main()		//主函数
{
	char s[16];
	start();  //欢迎界面
	loadRec();  //加载文件信息
	printf("提示:\n初始密码为:123456\n");
	printf("\n请输入密码:"); //输入密码 
	scanf("%s",s);
	while(strcmp(password,s)!=0)
	{
		printf("\n错误密码,请重试:");
		scanf("%s",s);
	}
	system("cls");
	for(;;)			//菜单循环
	{
		switch(select())
		{
		case 0:system("cls");createstaff();break;
		case 1:system("cls");recordRec();break;
		case 2:system("cls");todayRec();break;
		case 3:system("cls");wholeRec();break;
		case 4:system("cls");deleteRec();break;
		case 5:system("cls");modifyRec();break;
		case 6:system("cls");save();break;
		case 7:system("cls");resetPassword();break;
		case 8:system("cls");if(writeinfo_flag==1)save();return 0;
		default:
			{
				printf("\n 	选择错误,请按回车键返回后,重新输入(0~8)!");
				getchar();
				getchar();
				system("cls");
				break;
			}
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值