职工考勤管理系统.docx
《职工考勤管理系统.docx》由会员分享,可在线阅读,更多相关《职工考勤管理系统.docx(37页珍藏版)》请在冰豆网上搜索。
职工考勤管理系统
C语言程序设计
课程设计报告
课设题目:
考勤管理系统
专业:
班级:
姓名:
成绩:
完成日期:
指导教师:
1.课程设计目的
1)通过课程设计,加深对结构化程序设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。
2)通过课程设计,进一步掌握C语言中重要的数据结构。
掌握并熟练运用指针、链表、结构体、文件等数据结构。
3)通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。
4)通过课程设计,培养C语言知识运用和自学能力,真正的把课堂上获得的知识运用起来,培养自己对程序编写的兴趣,并能独立设计和实现一个小型系统。
5)通过课程设计,加强了自己的程序分析能力。
2.需求分析
2.1要求
1)遵循软件开发过程的基本规范;能灵活应用,初步具备运用C程序解决实际问题的能力。
2)运用结构化程序设计方法,按照课程设计题目要求,完成包括需求分析、数据结构设计、概要设计、详细设计、编写代码、调试和测试C程序等过程。
3)学会利用数组、结构体、链表进行相关信息表示。
4)功能模块划分清晰,系统结构图符合功能操作要求,且有详尽的功能描述
5)各主要功能模块有详尽的流程图及描述,用函数的形式实现,且调用入口、功能、出口等关系正确。
6)所设计的C程序较好的可读性和可靠性;程序书写风格规范,注释清晰。
7)界面友好(良好的人机互交),凡需要输入信息时,都有较详尽的提示信息,并对输入信息有较完善的值域分析。
8)程序经上机调试通过,不应出现语法型、功能型错误,并获得满意的结果。
9)学会通过各功能性测试用例测试程序的能力,尽可能避免原则性错误的出现。
10)掌握编写、调试和测试C语言程序的基本技巧,充分理解结构化程序设计的基本方法。
11)C语言课程设计报告的内容反应实际设计过程,且符合格式要求,无抄袭现象。
2.2任务描述
此系统以对职工考勤为背景,提供对职工信息、上下班时间的新建、录入、编辑、查询、密码保护等功能。
具体功能实现如下:
1)职工信息新建:
实现职工工号以及姓名的录入功能,并能将其以文件形式加以保存。
2)考勤信息编辑:
实现对职工上下时间的记录,并对指定职工的考勤信息进行删除或修改等功能。
3)考情信息浏览:
实现对全体职工当天迟到、早退、矿工、全勤的浏览功能。
4)查询功能:
实现按工号或姓名查询职工一周的上下班时间的功能。
5)密码功能:
实现对进入系统、修改和删除考勤信息的保护功能以及密码重设的功能。
6)系统以菜单方式工作,界面清晰,易于操作。
2.3运行环境
1)WindowsXP/7系统
2)VC++6.0编译环境
2.4开发工具
C语言
3.总体设计
3.1系统流设计
本系统的功能模块如图1所示,主要有以下模块:
图1系统功能模块图
3.2系统模块设计
1)系统欢迎界面:
构造函数voidwelcome(),实现欢迎使用职工考勤管理系统的显示。
2)主菜单界面:
构造函数intmenu_select(),实现系统主菜单的显示。
3)职工信息新建:
构造函数voidcreateInfo(),实现职工基本信息的录入及显示。
并可以通过函数voiddeleteRec()和voidmodifyRec(),实现对职工基本信息的删除和修改。
4)职工考勤录入:
构造函数voidcreateRec(),实现由主菜单选择通过工号和姓名两种方式职工上下班时间的录入。
5)职工考勤修改:
构造函数voidmodifyRec(),实现由主菜单选择通过工号和姓名两种方式对职工考勤以及基本信息的修改。
6)职工考勤删除:
构造函数voiddeleteRec(),实现由主菜单选择通过工号和姓名两种方式对职工考勤信息的删除。
7)职工考勤查询:
构造函数voidsearchRec(),实现对指定职工一周内上下班的时间的查询。
8)职工考勤浏览:
构造函数voidlistRec();,实现所有职工一天中上下班的出勤情况的浏览。
9)密码重设:
构造函数voidresetPassword(),实现对初始密码888888的重设,并保存在文件中
10)保存所有信息:
构造函数voidsaveRec(),实现随时对考勤信息的保存。
4.详细设计
4.1数据结构设计
根据系统要求,系统中需要保存的数据信息,其结构如下:
数据项名称
数据项系统表示
数据类型
数据长度
备注
工号
id
char
10个字符
姓名
name
char
10个字符
小时
hour
int
4个字节
数组
分钟
minute
int
4个字节
数组
下一个节点地址
next
worker
4个字节
worker为定义结构体
密码
password
char
16个字符
头指针
head
worker
4个字节
worker为定义结构体
为了能实现不受限制的增加职工信息,采用链表的结构保存职工信息,在增加职工的基本信息时,创建一个职工信息的节点,将其插入到链表中,示意图如下。
为此,先声明一个类型为structworker的结构体,其成员为职工的考勤信息。
然后通过对指针、链表、文件等数据结构的操作,实现对职工考勤信息的录入,插入,存盘,查询,浏览,删除,修改等一系列操作。
还声明了一个结构体TIME,用于储存职工上下班的时间。
其中,结构体定义如下:
typedefstruct//结构体定义
{
inthour;
intminute;
}TIME;
typedefstructworker
{
charid[10];
charname[10];
TIMEtime[20];
structworker*next;
}worker;
4.2模块接口设计
1)所有函数模块声明如下:
intmenu_select();//主菜单
voidwelcome();//显示欢迎界面
voidcreateInfo();//新建职工信息
voidcreateRec();//录入考勤信息
voidlistRec();//浏览当天考勤信息
voidsearchRec();//查询考勤信息
voidsaveRec();//保存所有信息
voiddeleteRec();//删除考勤信息
voidmodifyRec();//修改考勤信息
voidloadRec();//加载文件信息
voidresetPassword();//重设密码
2)并定义三个全局变量:
worker*head=NULL;//链表头指针head
writeinfo_flag=0;//信息保存标记
charpassword[16]="888888";//密码保存
3)主要模块的实现
系统以主函数voidmain()为入口。
调用voidwelcome()函数,显示课程设计名称及作者信息。
然后调用voidloadRec()函数读取文件中的信息。
然后调用intmenu_select()函数,进入主菜单界面。
系统接收用户输入的选择,调用相应的函数,进入到下一级菜单进行相关工作。
4.3以下是几个主要模块的流程图:
1)主菜单函数:
图2主函数流程图
2)考勤查询函数:
图3信息查询流程图
3)
考勤删除函数:
图4考勤删除流程图
5.运行结果
5.1主菜单界面:
图5主菜单界面
输入功能选择,系统自动进入相应功能界面。
5.2考勤录入界面:
图6信息录入界面
5.3考勤浏览界面:
图7全部信息浏览
5.4考勤查询界面:
从键盘中输入选择,可以按工号和姓名进行查询,并显示结果。
图8按姓名查询的结果
5.5信息修改界面:
从键盘中输入需要修改的信息代码,自动提示输入新的信息。
图9按工号修改的结果
6.程序调试与测试
6.1程序调试
(1)各模块分别调试过程及结果。
(2)集成调试过程及结果。
(3)功能调试过程及结果
6.2程序测试
(1)输入初始密码后进入系统。
首先选择‘0’新建4个职工信息。
分别为1aa;2bb;3cc;4dd。
(2)建立信息后系统的各功能都可以使用。
输入‘2’,可以看到刚才新建的所有职工信息,由于还没有考勤,所以都显示为旷工。
选择‘1’,可以录入上午上班考勤信息,通过工号输入1,可以将现在的时间录入到职工号为1的响应的位置。
通过查询功能可也查看他的时间。
选择‘4’输入初始密码删除1后,在查询可以看到aa不存在了
密码修改测试:
略。
7.问题与不足
(1)系统对时间的识别方面比较的差,比如上午:
8:
00上班,12:
30下班,而16:
30的时候输入上午上班,系统还是会记为迟到。
(2)工号和姓名不能输入太长,不然整个屏幕的输出都会乱。
(3)必须每周周日开启系统的时候,才能初始化考勤信息。
8.建议
我觉得这个题目中有些要求不是很明确,程序刚开始里面的信息要怎么建立,职工是哪里来的啊,题目所给的功能中并没有要求要建立职工的档案,就给我职工是系统本来就有的感觉,我不需要去建立职工信息。
在课设过程中我觉得老师和学生接触有点少啊,每个星期就见一次,有些问题都不能及时的解决。
9.编程体会
通过这次做C语言课设,我发现这学期在老师那学的只是一些皮毛而已。
编程的知识博大精深,还有许许多多的函数我都不知道,不会用,在今后自己还要不断的学习。
这次我做的题目中就有一个要求要自动获取系统时间,当初看到这个我就苦恼了,最后还是在网上找到了time.h这个头文件的里面有相关的函数。
课设中我遇到的最大的困难就是信息库的建立,之前总是想着把信息都存在文件中,系统在从中读取,可我自己有对文件不是很熟;之后我改变路径,先通过系统建立链表,在保存到文件中。
通过这几天做课设,我体会到这个过程是艰辛并快乐着的,这个过程中充满了编程的乐趣。
每次为如何把实际中的问题转化为计算机可以识别的语言而苦恼、烦躁,不停的在图书馆和网上查找自己需要的资料,可是一旦自己把程序编出来了,并在计算机上运行通过,自己心里又是快乐的,有一种巨大的成就感回荡在心头,把坐在电脑前几个小时的苦和累都忘了。
这次课设,是我自己第一次靠自己编出来的一个完整的程序,我会把这个程序一直的保存着,随着我今后在编程方面的学习加深,我会自己慢慢的改进它,让它见证我的成长历程。
总言而之,这几天做课设我国的非常的充实,也让我学习到了很多。
10.程序源代码:
#include
#include
#include
#include
#include
#include//所使用的头文件
typedefstruct//时间结构体定义
{
inthour;
intminute;
}TIME;
typedefstructworker//职工结构体定义
{
charid[10];
charname[10];
TIMEtime[20];
structworker*next;
}worker;
intmenu_select();//主菜单
voidwelcome();
voidcreateInfo();//新建职工信息
voidcreateRec();//录入考勤信息
voidlistRec();//浏览当天考勤信息
voidsearchRec();//查询考勤信息
voidsaveRec();//保存所有信息
voiddeleteRec();//删除考勤信息
voidmodifyRec();//修改考勤信息
voidloadRec();//加载文件信息
voidresetPassword();//重设密码
worker*head=NULL;//链表头指针head
writeinfo_flag=0;//信息保存标记
charpassword[16]="888888";//初始密码
structtm*timeinfo;
intmain()//主函数
{
chars[16];
welcome();//欢迎界面
loadRec();//加载文件信息
printf("\n提示:
\n\n初始密码为:
888888\n");//进入系统密码管理
printf("\t\t\t\n\n\n\n\n请输入密码,进去系统(密码不超过15个字符):
");
scanf("%s",s);
while(strcmp(password,s)!
=0)
{
printf("\n密码错误,请重新输入:
");
scanf("%s",s);
}
system("cls");
for(;;)//菜单循环
{
switch(menu_select())
{
case0:
system("cls");createInfo();break;
case1:
system("cls");createRec();break;
case2:
system("cls");listRec();break;
case3:
system("cls");searchRec();break;
case4:
system("cls");deleteRec();break;
case5:
system("cls");modifyRec();break;
case6:
system("cls");saveRec();break;
case7:
system("cls");resetPassword();break;
case8:
system("cls");if(writeinfo_flag==1)saveRec();return0;
default:
{
printf("\n选择错误,请按回车键返回后,重新输入(0~8)!
");
getchar();
getchar();
system("cls");
break;
}
}
}
return0;
}
/*选择菜单*/
intmenu_select()
{
worker*p=head;
intc,k;
time_tnowtime;
time(&nowtime);
timeinfo=localtime(&nowtime);
printf("\t\t**************选择菜单**************\t");
//在菜单中显示当前时间
printf("时间:
星期%d%2d:
%2d",timeinfo->tm_wday,timeinfo->tm_hour,timeinfo->tm_min);
printf("\n---------------------------------------------------------------------------");
printf("\t\t\t0.新建职工信息\n");
printf("\t\t1.录入考勤信息\n");
printf("\t\t2.浏览考勤信息\n");
printf("\t\t3.查询考勤信息\n");
printf("\t\t4.删除考勤信息\n");
printf("\t\t5.修改考勤信息\n");
printf("\t\t6.保存所有信息\n");
printf("\t\t7.重设密码\n");
printf("\t\t8.退出(退出后信息会自动保存在磁盘中)\n\t\t(任何情况下按Ctrl+C退出程序)\n");
printf("\n---------------------------------------------------------------------------");
printf("\n\n请输入您的选择(0~8):
");
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;
}
}
returnc;
}
voidloadRec()//从磁盘导入信息
{
worker*rear,*p,*pre;
FILE*fp,*key;
inti;
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%s",p->id,p->name);
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;
}
voidcreateInfo()//新建职工信息
{
worker*p,*rear;
inti,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输入错误,建立信息条数至少为1条!
\n");
printf("\n\n请按回车键返回主菜单重新开始!
\n");
getchar();getchar();
system("cls");
return;
}
printf("\n请输入职工的工号(至多10个字符)和姓名(至多10个字符):
\n");
for(i=0;i{
p=(worker*)malloc(sizeof(worker));
scanf("%s%s",p->id,p->name);
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;
}
voidcreateRec()//录入考勤信息
{
time_tnowtime;
worker*p;
chars[10];
intc,m,week;
if(head==NULL)
{
printf("\n\t\t\t不存在职工信息\n\n\t\t\t请按回车键返回主菜单新建职工信息!
");
getchar();getchar();
system("cls");
return;
}
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\t\t\t请选择输入工号还是姓名:
\n\n\t\t\t1.选择输入工号\n\n\t\t\t2.选择输入姓名\n\n");
printf("\n\t\t您的选择(以回车键结束):
");
scanf("%d",&c);
system("cls");
switch(c)
{
case1:
{
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=loc