人员签到管理系统方案.docx
- 文档编号:26156415
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:60
- 大小:27.40KB
人员签到管理系统方案.docx
《人员签到管理系统方案.docx》由会员分享,可在线阅读,更多相关《人员签到管理系统方案.docx(60页珍藏版)》请在冰豆网上搜索。
人员签到管理系统方案
《我的第一个管理系统》
这是我的第一个人员签到签出管理系统。
A.可以实现的功能
1.用户注册(只要内存足够可以实现无穷多个用户注册)
2.用户签到记录用户员工是否迟到
3.用户签退记录用户员工是否早退
4.员工出勤情况查询(包括总共上班天数,迟到次数,早退次数)
B.我认为程序比较好的地方
1.如果内存可以系统可以让无穷多个用户实现注册。
2.可以让用户在任意时刻签到或者签退,并且如果内存足够可以实现无穷多次的签到或者签退,并且完整记录信息。
3.用户注册时候提供了注册名不会重复的功能,如果重复提示用户重新确定注册名。
4.在输入注册密码时让用户两次输入密码比较是否一样,如果不一样则提示用户密码不一致请重新输入。
5.所有密码在输入时全部以*回显,保证密码不会泄露。
6.每一步都有完整的提示指导用户操作,对每一种可能发生的情况都做了相应的处理(当然还会有我没有想到的情况)。
7.本程序是用纯C编写出来的,依靠的是链表指针操作,看起来不是很容易。
C.程序的主要思想
1.不用C++里面的类,完全用结构体来代替。
2.先创建一个用户emp结构体,用来作为横向链表的节点,存储用户名,用户密码等基本信息。
3.再创建一个day签到签退结构体用来作为竖向节点,用来记录用户每天签到情况。
4.总体就是一个用户就是一个链表,每注册一个用户就在横向链表里插入一个节点记录用户名等基本信息,然后就是每个横向节点又作为每个用户签到链表的头结点,这样签到一次就在该用户对应的横节点下插入一个节点记录该用户签到情况。
D.程序的不足之处
1.没有漂亮的界面,看起来不爽。
2.没有提供开除员工的取消用户注册的操作(其实也比较好实现,再多加一个函数就可以解决)。
(以实现)
3.程序中用到大量的goto语句,这里不提倡使用。
4.记录数据不是十分充分,但是随时可以扩充。
5.如果程序意外停止,那么所有数据全部丢失,所以本系统不是用来用的,是用来看的。
6.程序重复代码有好多,其实可以精简。
7《此程序最终可以实现回车重新输入密码》
《所有功能都实现了哈哈哈哈哈》
#include
#include
#include
#include
typedefstructdays
{
intstime;//上班时间
intgotime;//下班时间
charislate;//是否迟到Y为迟到N为没有迟到
charisgoearly;//是否早退
days*next;
}day;
typedefstructemplore
{
charjoin[20];//用户名
charsec[20];//用户密码
emplore*next;
day*next1;
}emp;
intfindjoin(emp*head,constchar*name)//通过用户名查找
{
charC;
while(head!
=NULL)
{
if(int(strcmp(head->join,name))==0)
{
printf("请输入用户密码:
\n");
return1;//查找到对应的用户名
}
else
{
head=head->next;
}
}
if(head==NULL)
{
printf("此用户名不存在,您现在需要注册吗?
Y注册,N不注册\n");
C=getche();
//scanf("%c",&C);
if(C=='Y')
return2;//需要注册
else
return3;//不需要注册
}
return0;
}
intinsert1(emp*&head,char*name,char*mima1)//用户注册时候需要的链表?
?
?
?
注意head要用引用哦!
{
emp*p;
p=(emp*)malloc(sizeof(emp));
if(p==NULL)
{
printf("注册失败\n");
return0;
}
else
printf("\n恭喜您注册成功\n");
strcpy(p->join,name);
strcpy(p->sec,mima1);
p->next=head;
p->next1=NULL;//重要的一步一定要初始化为NULL方便标记
head=p;
return0;
}
intfindmima(emp*head,constchar*name,constchar*mima1)//一定是在有用户名的情况下
{
while(head!
=NULL)
{
if(int(strcmp(head->join,name))==0)
{
if(strcmp(head->sec,mima1)==0)
{
printf("\n密码正确请选择签到还是签退:
\ne签到l签退t退出系统\n");//提供选项让用户选择签到还是签退
return0;
}
else
{
printf("\n密码错误请重新输入:
");
return1;
}
}
else
head=head->next;
}
return0;
}
intcometime(day*&p)//输入签早到信息并且处理信息
{
printf("请输入签早到时间,相信你是诚实的哦\n");
scanf("%d",&(p->stime));//这个地方一定要注意,这不是C++是纯C一定要注意啊
if(p->stime>8)
p->isgoearly='Y';
else
p->isgoearly='N';
p->islate='N';//实现分开处理的必要条件
printf("您已经完成签到\n");
return0;
}
intgoouttime(day*&p)//输入签退信息并且处理信息
{
printf("\n请输入签退时间,相信你是诚实的哦\n");
scanf("%d",&(p->gotime));
if(p->gotime<18)
p->islate='Y';
else
p->islate='N';
p->isgoearly='N';//实现分开处理的必要条件
printf("您已经完成签退\n");
return0;
}
intinsert2(emp*head,char*name,day*p)//找到本用户的头结点并插入,这里找到的head就是该用户的头结点
{
while(head!
=NULL)
{
if(int(strcmp(head->join,name))==0)
{
p->next=head->next1;
head->next1=p;
return0;
}
head=head->next;
}
return0;
}
intfindrec(emp*head,char*name)//查找用户信息
{
intrday=0,rlate=0,rearly=0;
day*p=NULL;
while(head!
=NULL)
{
if(int(strcmp(head->join,name))==0)
{
p=head->next1;
while(p!
=NULL)
{
rday++;//记录一共签到多少次
if(p->isgoearly=='Y')
rearly++;
if(p->islate=='Y')
rlate++;
p=p->next;
}
printf("总共有记录的条数:
%d\n",rday);
printf("总共有记录迟到的次数:
%d\n",rlate);
printf("总共有记录早退的次数:
%d\n",rearly);
return0;//这一步是必要的哦
}
head=head->next;//这一步不要忘记啊
}
return0;
}
intfindname(emp*head,char*name)//查找用户信息
{
while(head!
=NULL)
{
if(int(strcmp(head->join,name))==0)
return1;
head=head->next;
}
if(head==NULL)
return0;
return0;
}
intdelete_q(emp*p)//删除本人还有其所有的记录
{
day*p1,*p2;
if(p==NULL)
return0;
p1=p->next1;
free(p);
while(p1!
=NULL)
{
p2=p1;
p1=p1->next;
free(p2);
}
return0;
}
intgoout(emp*&p,char*name,char*mima)//用户注销,返回一注销成功删除所有记录
{
emp*p1;
if(p==NULL)
{
printf("\n用户名不存在或密码错误\n");
return0;
}
if(p->next==NULL)//一定不是不能操作
{
if(strcmp(p->join,name)==0&&strcmp(p->sec,mima)==0)
{
delete_q(p);
p=NULL;
printf("注销成功");
return1;
}
else
{
printf("密码错误,注销失败");
return0;
}
}
if(strcmp(p->join,name)==0)
{
if(strcmp(p->next->join,mima)!
=0)
{
p1=p;
p=p->next;
delete_q(p1);
//printf("册成功yue");
return1;
}
}
p1=p;
while(p1->next!
=NULL)
{
if(strcmp(p1->next->join,name)==0&&strcmp(p1->next->sec,mima)==0)
{
//printf("%s%s",p1->next->sec,mima);
p1->next=p1->next->next;
delete_q(p1->next);
printf("注销成功");
return1;
}
p1=p1->next;
}
printf("注销失败\n");
return0;
}
intchange_mima(emp*p,char*name)
{
chara[20],b[20];
if(findname(p,name)==0)
{
printf("\n该用户名不存在");
return0;
}
while(p!
=NULL)
{
if(int(strcmp(p->join,name))==0)
{
printf("请输入用户密码");
scanf("%s",a);
if(strcmp(p->sec,a)!
=0)
{
printf("密码错误");
return0;
}
else
{loop7:
printf("请输入您的新密码:
\n");
scanf("%s",a);
printf("请重新输入您的新密码:
\n");
scanf("%s",b);
if(strcmp(a,b)!
=0)
{
printf("两次新密码不一致请重新输入:
");
gotoloop7;
}
else
{
strcpy(p->sec,a);
printf("恭喜您密码更改成功");
return1;
}
}
}
}
return0;
}
/////////////////////////////////////////////////////////////////
intmain()
{
printf("+_+欢迎进入-_-欣欣-_-自动签到系统+_+\n");
emp*head1=NULL;
charname[20],mima[20],mimayangli[20],biao,kk;
day*p1=NULL;
intpp=0,pp1=0,i=0;
loop:
pp=0;
pp1=0;
i=0;
printf("\n按任意键进入系统:
\n");
getch();//暂停
loop6:
printf("请选择操作:
\nA查询,B签到,C注册,D退出,E用户注销,G更改用户密码(不区分大小写)\n");
biao=getche();
if(biao=='G'||biao=='g')
{
printf("\n请输入您要更改密码的用户名\n");
scanf("%s",name);
change_mima(head1,name);
gotoloop6;
}
if(biao=='e'||biao=='E')
{
printf("\n请输入您的用户名:
\n");
scanf("%s",name);
printf("请输入密码:
\n");
i=0;
while(kk=getch())
{
if(kk=='\r')
break;
if(kk=='\b')
{
i--;
printf("\b");
printf("\b");
if(i<=0)
i=0;
continue;
}
printf("*");
mima[i]=kk;
i++;
}
mima[i]='\0';
if(goout(head1,name,mima)==1)//用户注销
printf("\n用户注销成功,感谢您近期的使用\n");
gotoloop6;
}
if(biao=='d'||biao=='D')
{
printf("\n系统已近退出请按提示操作");
gotoloop;
}
if(biao=='a'||biao=='A')
{
printf("\n现在您正处于查询状态中\n");
gotoloop3;
}
if(biao=='c'||biao=='C')
gotoloop4;
printf("\n请输入用户名:
\n");
scanf("%s",name);
pp=findjoin(head1,name);
if(pp==2)//如果返回值是2那么就用户注册
{
loop4:
printf("\n请输入您的注册名:
\n");
scanf("%s",name);
if(findname(head1,name)==1)
{
printf("此用户名已存在请重新确定您的注册名");
gotoloop4;
}
loop5:
printf("请输入您的注册密码:
\n");
i=0;
while(kk=getch())
{
if(kk=='\r')
break;
if(kk=='\b')
{
i--;
printf("\b");
printf("\b");
if(i<=0)
i=0;
continue;
}
printf("*");
mima[i]=kk;
i++;
}
mima[i]='\0';
printf("\n请再次输入您的注册密码:
\n");
i=0;
while(kk=getch())
{
if(kk=='\r')
break;
if(kk=='\b')
{
i--;
printf("\b");
printf("\b");
if(i<=0)
i=0;
continue;
}
printf("*");
mimayangli[i]=kk;
i++;
}
mimayangli[i]='\0';
if(strcmp(mima,mimayangli)==0)
{
insert1(head1,name,mima);
printf("请继续选择您需要的操作\n");
gotoloop6;
}
else
{
printf("\n两次密码输入不同请重新输入");
gotoloop5;
}
}
if(pp==3)
gotoloop;//这位用户选择退出从头开始
if(pp==1)//如果返回值是1那么就输入密码
{
loop1:
i=0;
while(kk=getch())
{
if(kk=='\r')////
break;
if(kk=='\b')
{
i--;
printf("\b");
printf("\b");
if(i<=0)
i=0;
continue;
}
printf("*");
mima[i]=kk;
i++;
}mima[i]='\0';
}
pp1=findmima(head1,name,mima);
if(pp1==1)//如果返回值是一的话那么就要用户重新输入密码跳到输入密码处
gotoloop1;
//这里就是把每一次签到或签退的情况分开处理
if(pp1==0)//在密码这正确的情况下提示用户操作
{
p1=(day*)malloc(sizeof(day));
//p1->next=NULL;
biao=getch();
if(biao=='t')
gotoloop;//这一步用户选择退出程序跳转到开头供下一位用户选择使用
if(biao=='e')//
cometime(p1);//这一步完成签早到信息并判断了是否迟到
if(biao=='l')
goouttime(p1);//这一步完成签退信息并判断了是否早退
insert2(head1,name,p1);//这一步完成向头结点插入,每次插入都是最新的位置,这一步是必须的
}
printf("请重新选择操作或者选择退出\n");
gotoloop6;
loop3:
printf("请输入您要查询的用户名:
\n");
scanf("%s",name);
if(findname(head1,name)==1)//如果返回值是1那么就用户存在
{
findrec(head1,name);
}
else
{
printf("用户名错误或者该用户不存在请重新选择操作");
printf("\n");
gotoloop6;
}
printf("查询已完成请继续选择操作或者退出\n");
gotoloop6;
return0;
}
《此程序不足》《下面有修改过的程序》
#include
#include
#include
#include
typedefstructdays
{
intstime;//上班时间
intgotime;//下班时间
charislate;//是否迟到Y为迟到N为没有迟到
charisgoearly;//是否早退
days*next;
}day;
typedefstructemplore
{
charjoin[20];//用户名
charsec[20];//用户密码
emplore*next;
day*next1;
}emp;
intfindjoin(emp*head,constchar*name)//通过用户名查找
{
charC;
while(head!
=NULL)
{
if(int(strcmp(head->join,name))==0)
{
printf("请输入用户密码(输入#表示密码输入结束):
\n");
return1;//查找到对应的用户名
}
else
{
head=head->next;
}
}
if(head==NULL)
{
printf("此用户名不存在,您现在需要注册吗?
Y注册,N不注册\n");
C=getche();
//scanf("%c",&C);
if(C=='Y')
return2;//需要注册
else
return3;//不需要注册
}
return0;
}
intinsert1(emp*&head,char*name,char*mima1)//用户注册时候需要的链表?
?
?
?
注意head要用引用哦!
{
emp*p;
p=(emp*)malloc(sizeof(emp));
if(p==NULL)
{
printf("注册失败\n");
return0;
}
else
printf("\n恭喜您注册成功\n");
strcpy(p->join,name);
strcpy(p->sec,mima1);
p->next=head;
p->next1=NULL;//重要的一步一定要初始化为NULL方便标记
head=p;
return0;
}
intfindmima(emp*head,constchar*name,constchar*mima1)//一定是在有用户名的情
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人员 签到 管理 系统 方案