sta* newnode(sta* p) //构建员工节点函数
{
p=(sta*)malloc(sizeof(sta)); //动态内存申请
p->next=NULL; //初始化为空
return p;
}
att* cnewnode(att* p) //构建考勤信息节点函数
{
p=(att*)malloc(sizeof(att));
p->next=NULL;
return p;
}
void menu() //菜单函数
{
printf("\n");
printf(" *****考勤信息管理系统*****\n");
printf(" * *\n");
printf(" * 1.管理员 *\n");
printf(" * *\n");
printf(" * 2.考勤员 *\n");
printf(" * *\n");
printf(" * 3.普通员工 *\n");
printf(" * *\n");
printf(" * 0.退出管理系统 *\n");
printf(" **************************\n");
printf(" 请选择登陆身份:");
}
main()
{
int choice;
head=av=newnode(head); //av用于初始文件的读取
chead=cv=cnewnode(chead);
staff_read();
att_information_read();
while(1)
{
menu();
scanf("%d",&choice);
fflush(stdin); //清除缓冲区
if(choice==0||choice==1||choice==2||choice==3)
{
switch(choice)
{
case 1: admin();
break;
case 2: atten();
break;
case 3: staff();
break;
case 0: quit(); //退出程序函数
break;
}
}
else
{
printf(" 输入有误,将回到主菜单,请重新选择登陆身份:\n");
fflush(stdin); //清除缓冲区
//备注:VS2019可能无法使用fflush(stdin)函数消除缓冲区,可以使用rewind(stdin)函数替换
system("pause");
system("cls");
}
}
system("pause");
}
//退出程序函数
void quit()
{
char a[20];
printf(" 确定退出程序?请输入y/n:");
while(1)
{
scanf("%s",a);
fflush(stdin); //清除缓冲区
if((strcmp(a,"y"))!=0&&(strcmp(a,"n")!=0)) //检验是否输入正确
{
printf(" 输入的数据有误,请重新输入!");
fflush(stdin); //清除缓冲区
}
if(strcmp(a,"y")==0||strcmp(a,"n")==0) //若输入正确,则跳出整个循环
{
break;
}
}
if(strcmp(a,"y")==0)
{
system("cls");
printf("\n\n");
printf(" 感谢您的使用,谢谢");
exit(0);
}
else
{
printf(" 不退出喔,将回到上一个菜单\n");
system("pause");
system("cls");
}
}
//管理员登陆函数
int get_admin()
{
char num[20],password1[20],quanxian[20]="管理员";
int flag=0,i;
printf("\n\n\n 请输入您的编号: ");
scanf("%s",num);
fflush(stdin); //清除缓冲区
for(u=head->next;u!=NULL;u=u->next)
{
if(strcmp(u->employee_number,num)==0 && strncmp(u->jurisdiction,quanxian,6)==0)
{
flag=1;
printf(" 请输入密码:"); //共有三次输入机会
for(i=0;i<3;i++)
{
scanf("%s",password1);
fflush(stdin); //清除缓冲区
if(strcmp(u->password,password1)==0) //判断输入密码是否一致
{
printf("\n 密码正确,登陆成功!\n");
system("pause");
return 1;
break; //运行成功 ,跳出循环
}
else
{
if(i<2)
{
printf(" 密码错误,请重新输入:"); //若前面两次都输错,则报错
}
}
}
if(i>2)
{
printf(" 密码错误次数已达上限\n 将返回上一步,请重新选择登录身份!\n");
system("pause");
system("cls");
return 0;
}
}
}
if(flag==0)
{
printf("你还不是管理员喔\n");
}
system("pause");
system("cls");
}
void admin()
{
int choice;
system("cls");
if(get_admin()) //调用密码函数,判断是否能够继续
{
system("cls");
while(1)
{
printf("\n\n\n 尊敬的%s小主您好,欢迎进入考勤信息管理系统!\n\n",u->name);
printf(" 管理员模式\n\n\n");
printf(" ***********************考勤信息管理系统********************\n");
printf(" * *\n");
printf(" * 1.管理员工基本信息 *\n");
//职员信息添加staff_add()、删除staff_del()、查询staff_find()、修改staff_modify()、存储staff_storage()功能
printf(" * *\n");
printf(" * 2.查询某部门全体职工出勤信息 *\n");
printf(" * *\n");
printf(" * 3.统计每个职工月在岗,出差,迟到,加班等时间 *\n");
printf(" * *\n");
printf(" * 4.统计不同职工的年出差时间 *\n");
printf(" * *\n");
printf(" * 0.退出管理系统 *\n");
printf(" ***********************************************************\n");
printf(" 请选择:");
scanf("%d",&choice);
fflush(stdin); //清除缓冲区
if(choice==0||choice==1||choice==2||choice==3||choice==4)
{
switch(choice)
{
case 1: adminxx(); break;
case 2: admin_attend(); break; //2,3,4功能考勤员与管理员共用
case 3: admin_staff(); break;
case 4: admin_travel(); break;
case 0: quit(); break; //退出程序函数
}
}
else
{
printf(" 输入有误,请重新输入:\n");
fflush(stdin); //清除缓冲区
//备注:VS2019可能无法使用fflush(stdin)函数消除缓冲区,可以使用rewind(stdin)函数替换
choice=1; //重新给choice赋值,防止跳出循环
}
printf("\n\n");
}
}
else
{
return ; //退出程序
}
}
void adminxx()
{
system("cls");
int choice;
do
{
printf("\n");
printf(" 管理员模式\n\n\n");
printf(" ********考勤信息管理系统********\n");
printf(" * *\n");
printf(" * 1.添加员工信息 *\n");
printf(" * *\n");
printf(" * 2.删除员工信息 *\n");
printf(" * *\n");
printf(" * 3.查询员工信息 *\n");
printf(" * *\n");
printf(" * 4.修改员工信息 *\n");
printf(" * *\n");
printf(" * 0.退出管理系统 *\n");
printf(" ********************************\n");
printf(" 请选择:");
scanf("%d",&choice);
fflush(stdin); //清除缓冲区
if(choice==0||choice==1||choice==2||choice==3||choice==4||choice==5)
{
switch(choice)
{
case 1: staff_add(); break;
case 2: staff_del(); break;
case 3: staff_find(); break;
case 4: staff_modify_find(); break;
case 0: quit(); break; //退出程序函数
}
}
else
{
printf(" 输入有误,请重新选择:\n");
fflush(stdin); //清除缓冲区
//备注:VS2019可能无法使用fflush(stdin)函数消除缓冲区,可以使用rewind(stdin)函数替换
choice=1; //重新给choice赋值,防止跳出循环
}
}while(choice!=0);
return;
}
void admin_attend()
{
system("cls");
char depart[20];
int flag=0;
printf("\n\n 根据部门查询信息\n");
printf(" 请输入您要查询部门的名称: ");
scanf("%s",depart);
fflush(stdin); //清除缓冲区
for(cu=chead->next;cu!= NULL;cu=cu->next)
{
if(strcmp(cu->att_department,depart)==0)
{
flag++;
if(flag==1)
{
printf(" 查找成功!\n");
printf(" 该部门考勤信息\n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
}
printf("\n");
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
continue;
}
}
if(flag==0)
{
printf(" --->未查找到该部门的出勤信息!\n");
}
system("pause");
system("cls");
}
void admin_staff()
{
system("cls");
char num[20];
char a[20];
int flag=0,year,mon;
double sum_intime=0,sum_traveltime=0,sum_latetime=0,sum_overtime=0;
printf("\n\n\n 根据月份查询信息\n");
printf(" 请输入您要查询的年月份: ");
scanf("%d %d",&year,&mon);
fflush(stdin); //清除缓冲区
while(1)
{
printf(" 请输入你想要查询的职工编号: ");
scanf("%s",num);
fflush(stdin); //清除缓冲区
for(cu=chead->next;cu!= NULL;cu=cu->next)
{
if(cu->att_year==year)
{
if(cu->att_mon==mon)
{
if(strcmp(cu->att_number,num)==0)
{
flag++;
sum_intime+=cu->att_intime;
sum_traveltime+=cu->att_traveltime;
sum_latetime+=cu->att_latetime;
sum_overtime+=cu->att_overtime;
continue;
}
else
{
continue;
}
}
}
}
if(flag==0)
{
printf(" --->未找到此月该员工出勤的信息!\n");
}
if(flag>0)
{
printf("\n");
printf(" 考勤日期 职工编号 月在岗时间 月出差时间 月迟到时间 月加班时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %s %lf %lf %lf %lf\n",year,mon,num,sum_intime,sum_traveltime,sum_latetime,sum_overtime);
sum_intime=0;
sum_traveltime=0;
sum_latetime=0;
sum_latetime=0;
printf("\n");
}
printf(" 是否还要继续查询?请输入y/n:");
while(1)
{
scanf("%s",a);
fflush(stdin); //清除缓冲区
if((strcmp(a,"y"))!=0&&(strcmp(a,"n")!=0)) //检验是否输入正确
{
printf(" 输入的数据有误,请重新输入!");
fflush(stdin); //清除缓冲区
}
if(strcmp(a,"y")==0||strcmp(a,"n")==0) //若输入正确,则跳出整个循环
{
break;
}
}
if(strcmp(a,"n")==0)
{
printf(" 将结束此次查询\n");
system("pause");
system("cls");
return;
}
else
{
printf(" 不退出喔,将继续查询\n");
flag=0;
}
}
system("pause");
system("cls");
}
void admin_travel()
{
system("cls");
char num[20];
int flag=0,year;
double sumtime=0;
printf("\n\n\n 根据员工编号查询年出差信息\n");
printf(" 请输入您要查询的员工编号: ");
scanf("%s",num);
fflush(stdin); //清除缓冲区
printf(" 请输入您要查询的年份: ");
scanf("%d",&year);
fflush(stdin); //清除缓冲区
for(cu=chead->next;cu!= NULL;cu=cu->next)
{
if(strcmp(cu->att_number,num)==0)
{
if(cu->att_year==year)
{
flag++;
sumtime+=cu->att_traveltime;
continue;
}
else
{
continue;
}
}
}
if(flag==0)
{
printf(" --->未找到该年员工出差的信息!\n");
}
if(flag>0)
{
printf(" 该员工%d年的出差时间为 %lf 小时\n",year,sumtime);
}
system("pause");
system("cls");
}
void staff_add()
{
system("cls");
int i,k;
int sign1,sign2=0; //作为判断是否重复的一个标志
u=newnode(u); //创建一个新节点
printf(" ******************考勤信息管理系统****************\n");
printf(" * *\n");
printf(" * 1.职工编号: *\n");
printf(" * *\n");
printf(" * 2.姓名: *\n");
printf(" * *\n");
printf(" * 3.所属部门: *\n");
printf(" * *\n");
printf(" * 4.性别: *\n");
printf(" * *\n");
printf(" * 5.身份证号码: *\n");
printf(" * *\n");
printf(" * 6.职务: *\n");
printf(" * *\n");
printf(" * 7.权限: *\n");
printf(" * *\n");
printf(" * 8.密码: *\n");
printf(" * *\n");
printf(" **************************************************\n");
while(1)
{
gotoxy(24,2); //光标移动函数,
scanf("%s",u->employee_number);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->employee_number);i++) //遍历输入的数据,判断是否满足要求
{
if(u->employee_number[i]<'0'||u->employee_number[i]>'9')
{
gotoxy(24,2);
printf("编号应为数字,请重新输入");
Sleep(600);
gotoxy(24,2);
for(k=0;k<=23;k++) //把上一个printf显示的数据清空
printf(" ");
break; //结束整个for语句
}
if(strlen(u->employee_number)!=7)
{
gotoxy(24,2);
printf("编号应为7位,请重新输入");
Sleep(600);
gotoxy(24,2);
for(k=0;k<=23;k++)
printf(" ");
break;
}
}
strcpy(check,u->employee_number);
for(at=av->next;at!=NULL;at=at->next) //定义一个中间变量,来遍历staff这个链表
{
if(strcmp(at->employee_number,check)==0)
{
sign1=0;
gotoxy(24,2);
printf("该编号已经存在,请重新输入");
Sleep(600);
gotoxy(24,2);
for(k=0;k<=25;k++)
printf(" ");
break;
}
if(strcmp(at->employee_number,check)!=0) //如果未找到,则结束此次循环
{
continue;
}
}
if(at==NULL) //表明此次输入的编号是新的,则置标志sign1=1
{
sign1=1;
}
if(strlen(u->employee_number)==7 && i==strlen(u->employee_number) && sign1==1)
{
//若输入的编号为7位,且经过i次遍历,且标志sign1=1
break;
}
}
while(1)
{
gotoxy(24,4);
scanf("%s",u->name);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->name);i++) //遍历输入的数据,判断是否满足要求
{
if(u->name[i]>=0&&u->name[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
gotoxy(24,4);
printf("不是中文,请重新输入");
Sleep(600);
gotoxy(24,4);
for(k=0;k<=23;k++)
printf(" ");
break;
}
}
if(i==strlen(u->name))
{
break;
}
}
while(1)
{
gotoxy(24,6);
scanf("%s",u->department);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->department);i++) //遍历输入的数据,判断是否满足要求
{
if(u->department[i]>=0&&u->department[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
gotoxy(24,6);
printf("不是中文,请重新输入");
Sleep(600);
gotoxy(24,6);
for(k=0;k<=23;k++)
printf(" ");
break;
}
}
if(i==strlen(u->department))
{
break;
}
}
while(1)
{
gotoxy(24,8);
scanf("%s",u->gender);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->gender);i++) //遍历输入的数据,判断是否满足要求
{
if(u->gender[i]>=0&&u->gender[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
gotoxy(24,8);
printf("不是中文,请重新输入");
Sleep(600);
gotoxy(24,8);
for(k=0;k<=23;k++)
printf(" ");
break;
}
}
if(i==strlen(u->gender))
{
break;
}
}
while(1)
{
gotoxy(24,10); //光标移动函数,
scanf("%s",u->IDnumber);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->IDnumber);i++) //遍历输入的数据,判断是否满足要求
{
if(u->IDnumber[i]<'0'||u->IDnumber[i]>'9')
{
gotoxy(24,10);
printf("身份证号应为数字,请重新输入");
Sleep(600);
gotoxy(24,10);
for(k=0;k<=45;k++) //把上一个printf显示的数据清空
printf(" ");
break; //结束整个for语句
}
if(strlen(u->IDnumber)!=18)
{
gotoxy(24,10);
printf("编号应为18位,请重新输入");
Sleep(600);
gotoxy(24,10);
for(k=0;k<=23;k++)
printf(" ");
break;
}
}
strcpy(check,u->IDnumber);
for(at=av->next;at!=NULL;at=at->next) //定义一个中间变量,来遍历staff这个链表
{
if(strcmp(at->IDnumber,check)==0)
{
sign1=0;
gotoxy(24,10);
printf("该号码已经存在,请重新输入");
Sleep(600);
gotoxy(24,10);
for(k=0;k<=23;k++)
printf(" ");
break;
}
if(strcmp(at->IDnumber,check)!=0) //如果未找到,则结束此次循环
{
continue;
}
}
if(at=NULL) //表明此次输入的身份证号是新的,则置标志sign1=1
{
sign1=1;
}
if(strlen(u->IDnumber)==18 && i==strlen(u->IDnumber) && sign1==1)
{
//若输入的身份证号为18位,且经过i次遍历,且标志sign1=1
break;
}
}
while(1)
{
gotoxy(24,12);
scanf("%s",u->duty);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->duty);i++) //遍历输入的数据,判断是否满足要求
{
if(u->duty[i]>=0&&u->duty[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
gotoxy(24,12);
printf("不是中文,请重新输入");
Sleep(600);
gotoxy(24,12);
for(k=0;k<=23;k++)
printf(" ");
break;
}
}
if(i==strlen(u->duty))
{
break;
}
}
while(1)
{
gotoxy(24,14);
scanf("%s",u->jurisdiction);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->jurisdiction);i++) //遍历输入的数据,判断是否满足要求
{
if(u->jurisdiction[i]>=0&&u->jurisdiction[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
gotoxy(24,14);
printf("不是中文,请重新输入");
Sleep(600);
gotoxy(24,14);
for(k=0;k<=23;k++)
printf(" ");
break;
}
}
if(i==strlen(u->jurisdiction))
{
break;
}
}
while(1)
{
gotoxy(24,16);
scanf("%s",u->password);
fflush(stdin); //清除缓冲区
if(strlen(u->password)>15)
{
gotoxy(24,16);
printf("密码输入过长 ^.^ 请重新输入");
Sleep(600);
gotoxy(24,16);
for(k=0;k<23;k++)
printf(" ");
}
if(strlen(u->password)<=15)
{
break;
}
}
u->next=head->next; //采用头插法将新节点的尾指针指向第二个节点
head->next=u; //将新节点放在头节点后面
printf("\n\n\n\n --->采集成功!\n");
staff_storage();
printf("\n ");
system("pause");
system("cls");
}
void staff_del() //按员工的编号来删除
{
system("cls");
char num[20];
int flag=0;
printf("\n 请输入您要删除员工的编号: ");
scanf("%s",num);
fflush(stdin); //清除缓冲区
for(u=head;u!=NULL;u=u->next) //遍历这个链表
{
if(strcmp(u->employee_number,num)==0) //找到相同的编号
{
flag=1;
printf(" 查找成功!\n");
printf(" 员工信息 \n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
p->next=u->next;
free(u);
printf("\n --->删除成功!\n");
staff_storage();
break;
}
p=u; //p指向u当前的节点,后u又指向下一个节点
}
if(flag==0)
printf("\n --->没有这个员工的信息!\n");
system("pause");
system("cls");
}
void staff_find()
{
system("cls");
int choice;
do
{
printf("\n\n\n");
printf(" **********************************\n");
printf(" * 1.按编号查找 *\n");
printf(" * *\n");
printf(" * 2.按姓名查找 *\n");
printf(" * *\n");
printf(" * 3.按身份证号查找 *\n");
printf(" * *\n");
printf(" * 0.退出,返回上一个菜单 *\n");
printf(" * *\n");
printf(" **********************************\n");
printf(" 请选择:");
scanf("%d",&choice);
fflush(stdin); //清除缓冲区
if(choice==0||choice==1||choice==2||choice==3||choice==4)
{
switch(choice)
{
case 1: staff_find_num(); break;
case 2: staff_find_name(); break;
case 3: staff_find_IDnum(); break;
}
}
else
{
printf(" 输入有误,请重新输入:\n");
fflush(stdin); //清除缓冲区
system("cls");
choice=1; //重新给choice赋值,防止跳出循环
}
printf("\n\n");
}while(choice!=0);
printf(" 将返回到上一个菜单!\n");
system("pause");
system("cls");
return;
}
void staff_find_num()
{
char num[20];
int flag=0;
printf(" 根据编号查询信息\n");
printf(" 请输入您要查询员工的编号: ");
scanf("%s",num);
fflush(stdin); //清除缓冲区
for(u=head->next;u!= NULL;u=u->next)
{
if(strcmp(u->employee_number,num)==0)
{
flag=1;
printf(" 查找成功!\n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
break;
}
}
if(flag==0)
{
printf(" --->未找到该员工!\n");
}
system("pause");
system("cls");
}
void staff_find_name()
{
char staffname[20];
int flag=0;
printf(" 根据姓名查询信息\n");
printf(" 请输入您要查询员工的姓名: ");
scanf("%s",staffname);
fflush(stdin); //清除缓冲区
for(u=head->next;u!= NULL;u=u->next)
{
if(strcmp(u->name,staffname)==0)
{
flag=1;
printf(" 查找成功!\n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
break;
}
}
if(flag==0)
{
printf(" --->未找到该员工!\n");
}
system("pause");
system("cls");
}
void staff_find_IDnum()
{
char num[20];
int flag=0;
printf(" 根据身份证号查询信息\n");
printf(" 请输入您要查询员工的身份证号: ");
scanf("%s",num);
fflush(stdin); //清除缓冲区
for(u=head->next;u!= NULL;u=u->next)
{
if(strcmp(u->IDnumber,num)==0)
{
flag=1;
printf(" 查找成功!\n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
break;
}
}
if(flag==0)
{
printf(" --->未找到该员工!\n");
}
system("pause");
system("cls");
}
void staff_modify_find() //按照编号查找员工信息
{
system("cls");
int flag=0;
printf("\n 请输入您要修改员工的编号: ");
scanf("%s",number);
fflush(stdin); //清除缓冲区
for(u=head->next;u!= NULL;u=u->next) //遍历这个链表
{
if(strcmp(u->employee_number,number)==0) //找到相同的编号
{
flag=1;
printf(" 查找成功!\n");
printf(" 员工信息 \n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
system("pause");
staff_modify();
break;
}
}
if(flag==0)
printf("\n --->没有这个员工的信息!\n");
system("pause");
system("cls");
}
void staff_modify()
{
system("cls");
int choice;
int i;
do
{
//因为在储存时u所指向的节点已经发生变化,故再次遍历链表, 找到上次修改的节点
for(p=head->next;p!= NULL;p=p->next)
{
if(strcmp(p->employee_number,number)==0)
{
u=p;
}
}
printf("\n");
printf(" *******************修改员工信息**********************\n");
printf(" * 1.修改编号 2.修改姓名 *\n");
printf(" * *\n");
printf(" * 3.修改部门 4.修改身份证号 *\n");
printf(" * *\n");
printf(" * 5.修改职务 6.修改权限 *\n");
printf(" * *\n");
printf(" * 0.退出,返回上一个菜单 *\n");
printf(" * *\n");
printf(" *****************************************************\n");
printf(" 请选择:");
scanf("%d",&choice);
fflush(stdin); //清除缓冲区
if(choice==0||choice==1||choice==2||choice==3||choice==4||choice==5||choice==6)
{
switch(choice)
{
case 1:
{
while(1)
{
printf(" 请输入新的编号:");
scanf("%s",u->employee_number);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->employee_number);i++) //遍历输入的数据,判断是否满足要求
{
if(u->employee_number[i]<'0'||u->employee_number[i]>'9')
{
printf(" 编号必须是数字 请重新输入\n");
break;
}
if(strlen(u->employee_number)!=7)
{
printf(" 编号必须为7位 请重新输入\n");
break;
}
}
if(strlen(u->employee_number)==7&&i==strlen(u->employee_number))
{
strcpy(number,u->employee_number);
break;
}
}
printf("\n --->修改成功!\n");
printf(" 新的员工信息 \n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
system("pause");
staff_storage();
system("pause");
system("cls");
break;
}
case 2:
{
while(1)
{
printf(" 请输入新的名字: ");
scanf("%s",u->name);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->name);i++) //遍历输入的数据,判断是否满足要求
{
if(u->name[i]>=0&&u->name[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
printf(" 不是中文,请重新输入\n");
break;
}
}
if(i==strlen(u->name))
{
break;
}
}
printf("\n --->修改成功!\n");
printf(" 新的员工信息 \n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
system("pause");
staff_storage();
system("pause");
system("cls");
break;
}
case 3:
{
while(1)
{
printf(" *请输入新的部门: ");
scanf("%s",u->department);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->department);i++)
{
if(u->department[i]>=0&&u->department[i]<=255)
{
printf(" 不是中文 , 请重新输入\n");
break;
}
}
if(i==strlen(u->department))
{
break;
}
}
printf("\n --->修改成功!\n");
printf(" 新的员工信息 \n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
system("pause");
staff_storage();
system("pause");
system("cls");
break;
}
case 4:
{
while(1)
{
printf(" 请输入新的身份证号: ");
scanf("%s",u->IDnumber);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->IDnumber);i++) //遍历输入的数据,判断是否满足要求
{
if(u->IDnumber[i]<'0'||u->IDnumber[i]>'9')
{
printf("身份证号应为数字,请重新输入\n");
break; //结束整个for语句
}
if(strlen(u->IDnumber)!=18)
{
printf("编号应为18位,请重新输入\n");
break;
}
}
if(strlen(u->IDnumber)==18&&i==strlen(u->IDnumber))
{
break;
}
}
printf("\n --->修改成功!\n");
printf(" 新的员工信息 \n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
system("pause");
staff_storage();
system("pause");
system("cls");
break;
}
case 5:
{
while(1)
{
printf(" *请输入新的职务: ");
scanf("%s",u->duty);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->duty);i++)
{
if(u->duty[i]>=0&&u->duty[i]<=255)
{
printf(" 不是中文 , 请重新输入\n");
break;
}
}
if(i==strlen(u->duty))
{
break;
}
}
printf("\n --->修改成功!\n");
printf(" 新的员工信息 \n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
system("pause");
staff_storage();
system("pause");
system("cls");
break;
}
case 6:
{
while(1)
{
printf(" *请输入新的权限: ");
scanf("%s",u->duty);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(u->jurisdiction);i++)
{
if(u->jurisdiction[i]>=0&&u->jurisdiction[i]<=255)
{
printf(" 不是中文 , 请重新输入\n");
break;
}
}
if(i==strlen(u->jurisdiction))
{
break;
}
}
printf("\n --->修改成功!\n");
printf(" 新的员工信息 \n");
puts(" 职工编号 姓名 所属部门 性别 身份证号码 职务 权限\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
system("pause");
staff_storage();
system("pause");
system("cls");
break;
}
}
}
printf("\n\n");
}while(choice!=0);
printf(" 将返回到上一个菜单!\n");
system("pause");
system("cls");
return;
}
void staff_read()
{
char a[160]; //存放读取的汉字
FILE *fp;
char ch;
fp=fopen("staff.txt","a+"); //进入程序时打开/建立该文件
fclose(fp);
if((fp=fopen("staff.txt","r+"))==NULL)
{
printf("\n --->没有找到文件!\n");
return ;
}
ch=fgetc(fp); //从指定的文件读取一个字符
if(ch==EOF)
{
return;
}
else
rewind(fp); //如果文件有内容,则把文件读写指针移动到文件的开头
fgets(a,140,fp); //读取第一行汉字信息
while(!feof(fp)) //未到文件末尾继续循环
{
u=newnode(u);
fscanf(fp,"%s %s %s %s %s %s %s %s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction,u->password);
u->next=head->next; //头插法建立链表
head->next=u;
}
fclose(fp);
}
void staff_storage()
{
char a[20];
FILE *fp;
printf("\n 确认保存(y/n)? ");
while(1)
{
scanf("%s",a);
fflush(stdin); //清除缓冲区
if( (strcmp(a,"n")!=0)&& (strcmp(a,"y")!=0))
{
printf(" 输入的数据有误,请重新输入!");
fflush(stdin); //清除缓冲区
}
if( (strcmp(a,"n")==0)||(strcmp(a,"y")==0))
{
break; //如果满足条件则结束循环
}
}
if((strcmp(a,"n")==0))
{
printf(" 不保存喔\n");
return ;
}
if((fp=fopen("staff.txt","w+"))==NULL) /*以w+的方式写入,每次写入数据时先把原来的内容清空,这里不用担心数据丢失,因为数据已经从文件中读取,存入程序的链表里面了*/
{
printf("\n --->staff.txt文件打开失败!\n");
return ;
}
fputs("职工编号 姓名 所属部门 性别 身份证号码 职务 权限 密码\n",fp);
//从头节点开始依次写入文件
for(u=head->next;u!=NULL;u=u->next)
{
fprintf(fp,"%s %s %s %s %s %s %s %s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction,u->password);
}
fflush(stdin); //清除缓冲区
fclose(fp);
printf("\n --->信息成功存入\n");
}
flag++;
if(flag==1)
{
printf(" 查找成功!\n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
}
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
printf("\n");
sum_intime+=cu->att_intime;
sum_traveltime+=cu->att_traveltime;
sum_latetime+=cu->att_latetime;
sum_overtime+=cu->att_overtime;
continue;
}
}
}
}
if(flag>0)
{
printf("\n\n\n");
printf(" 考勤日期 月在岗时间 月出差时间 月迟到时间 月加班时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %lf %lf %lf %lf\n",year,mon,sum_intime,sum_traveltime,sum_latetime,sum_overtime);
sum_intime=0;
sum_traveltime=0;
sum_latetime=0;
sum_latetime=0;
printf("\n");
}
if(flag==0)
{
printf(" --->未找到此月你的出勤的信息!\n");
}
system("pause");
system("cls");
}
12-15