考勤打卡系统
与高中同学一起编程
代码
#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;
}