C语言企业员工管理系统课程设计附源码Word格式文档下载.docx
《C语言企业员工管理系统课程设计附源码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言企业员工管理系统课程设计附源码Word格式文档下载.docx(52页珍藏版)》请在冰点文库上搜索。
(6).删除员工信息功能模块:
由用户输入选择删除相关的员工的信息。
(7).统计员工信息功能模块:
统计本系统中员工的信息,如男、女员工的人数等。
(8).重置系统密码功能模块:
根据用户的要求,将旧密码更换设置新密码。
(9).退出系统功能模块:
在用户执行完相关系统操作之后,退出使用本系统。
四.详细设计
1.功能函数的调用关系图
首次使用系统不是首次使用
2.各功能函数的数据流程图
3.重点设计及编码
(1)本系统中对是否是第一次使用本系统进行了处理,如果是第一次使用,则需要根据提示信息进行设置密码和初始化操作。
其思路是:
首先打开密码文件,判断是否为空,进而判断系统是否是第一次使用,如果是,系统会提示输入初始密码,如果不是,系统会进入登陆页面,提示输入登陆密码,代码如下:
voidcheckfirst()
{
FILE*fp,*fp1;
//声明文件型指针
charpwd[9],pwd1[9],pwd2[9];
inti;
charstrt='
8'
;
if((fp=fopen("
employee.txt"
"
rb"
))==NULL)
{
printf("
\n\t新系统,请进行相应的初始化操作!
\n"
);
//判断系统密码文件是否为空
bound('
_'
50);
getch();
do
{
printf("
\n设置密码,请不要超过8位:
"
for(i=0;
i<
8&
&
((pwd[i]=getch())!
=13);
i++)
putch('
*'
\n请再确认一次密码:
(pwd1[i]=getch())!
=13;
pwd[i]='
\0'
pwd1[i]='
if(strcmp(pwd,pwd1)!
=0)
printf("
\n\n两次密码输入不一致,请重新输入:
\n"
else
break;
}while
(1);
if((fp1=fopen("
wb"
))==NULL)
\n系统创建失败,请按任意键退出!
getch();
exit
(1);
}
i=0;
while(pwd[i])
pwd2[i]=(pwd[i]^strt);
putw(pwd2[i],fp1);
//将数组元素送入文件流中
i++;
fclose(fp1);
//关闭文件流
\n系统初始化成功,请按任意键退出后,再重新进入!
exit
(1);
}
else
while(!
feof(fp)&
8)//判断是否读完密码文件
pwd[i++]=getw(fp)^strt;
//从文件流中读出字符赋给数组
pwd[i]='
if(i>
=8)
i--;
while(pwd[i]!
=-1&
i>
strcpy(password,pwd);
}
(2)自定义函数login()在初始化检测后调用,用于管理员的登录,用户根据提示密码,函数调用strcmp()函数对输入密码和密码文件中的读取数据进行比较,如果一致则进入系统,不一致会提示重新输入,如果3次不一致会强制退出:
voidlogin()//检测登陆密码
inti,n=3;
charpwd[9];
do
\n请输入登陆密码:
for(i=0;
putch('
if(strcmp(pwd,password))
\n密码错误,请重新输入!
system("
cls"
//调用清屏命令
n--;
break;
}while(n>
0);
if(!
n)
密码输入3次错误,请退出!
(3)自定义函数addemp()用于添加员工的信息,首先打开存储员工信息的数据文件,系统会提示用户输入相应的员工基本信息,当用户输入完成一个员工的信息后,系统会提示用户是否继续输入员工信息:
voidaddemp()
FILE*fp;
EMP*emp1;
inti=0;
charchoice='
y'
ab"
))==NULL)//追加打开一个二进制文件,并在文件末尾写数据
打开文件出错!
i++;
emp1=(EMP*)malloc(sizeof(EMP));
if(emp1==NULL)
内存分配失败,请按任意键退出!
return;
\n\t请输入第%d各员工的信息\n"
i);
40);
工号:
scanf("
%d"
&
emp1->
num);
职务:
%s"
duty);
姓名:
name);
性别:
sex);
年龄:
age);
文化程度:
edu);
工资:
salary);
办公电话:
tel_office);
家庭电话:
tel_home);
手机号码:
mobile);
QQ号码:
qq);
家庭地址:
address);
emp1->
next=NULL;
if(emp_first==NULL)//判断表头指针是否为空
emp_first=emp1;
emp_end=emp1;
else
emp_end->
next=emp1;
fwrite(emp_end,sizeof(EMP),1,fp);
//对数据流添加数据项
gfirst=0;
\n是否继续输入?
(y/n)"
fflush(stdin);
//清除缓存区
choice=getchar();
if(toupper(choice)!
='
Y'
)
fclose(fp);
\n输入完毕,请按任意键返回!
getchar();
}while
(1);
(4)自定义函数delemp()实现删除员工的功能。
在系统的功能菜单中选择删除信息的操作后,系统就会提示要删除的员工的姓名,输入要删除的员工的姓名后,如果系统从信息链表中找到相关信息后就会将信息显示出来,再次要求用户确定是否要删除,谨防误操作,提高信息的安全性。
voiddelemp()
intfindok=0;
EMP*emp1,*emp2;
charname[10],choice;
system("
printf("
\n请输入要删除的员工的姓名:
scanf("
name);
emp1=emp_first;
emp2=emp1;
while(emp1)
if(strcmp(emp1->
name,name)==0)
findok=1;
system("
\n员工%s的信息如下:
\n"
emp1->
bound('
%d\n"
%s\n"
%d\n"
\n确定要删除该员工信息?
(y/n)"
fflush(stdin);
choice=getchar();
if(choice!
choice!
return;
if(emp1==emp_first)
emp_first=emp1->
next;
emp2->
next=emp1->
free(emp1);
gsave=1;
savedata();
//保存数据
emp2=emp1;
emp1=emp1->
if(!
findok)
\n没有找到姓名是:
%s的信息!
return;
(5)自定义函数displayemp()在找到员工的信息后,则需进行显示:
voiddisplayemp(EMP*emp,char*filed,char*name)
if(emp)
\n%s:
%s信息如下:
filed,name);
emp->
else
bound('
\n资料库中没有%s为:
%s的员工,请重新确认!
return;
(6)自定义函数findemp()函数用于查询员工信息,在系统的功能菜单中选择查询员工信息的操作后,系统进入一个查询选项列表,用户根据自己的需要选择要使用的查询条件,根据用户输入的条件的不同,系统会调用不同的查询函数,如果系统从信息链表中找到相关的信息就会显示出来:
voidfindemp()
intchoice,ret=0,num;
charstr[13];
do{
\n\t查询员工信息:
30);
\t1.按姓名查询\n"
\t2.按工号查询\n"
\t3.按电话查询\n"
\t4.按QQ号查询\n"
\t0.返回主菜单\n"
\n请选择(0-4):
switch(choice)
{
case'
1'
:
\n请输入要查询员工的姓名:
scanf("
str);
emp1=findname(str);
//调用子函数
displayemp(emp1,"
姓名"
getchar();
break;
2'
\n请输入要查询员工的工号:
emp1=findnum(num);
itoa(num,str,10);
工号"
3'
\n请输入要查询员工的电话:
emp1=findtelephone(str);
电话"
getchar();
4'
\n请输入要查询员工的QQ号:
emp1=findqq(str);
QQ号码"
0'
ret=1;
}
}while(choice<
'
||choice>
if(ret)
EMP*findname(char*name)//按姓名查找员工信息
if(strcmp(name,emp1->
name)==0)//比较输入的名字和链表中记载的名字是否相同
returnemp1;
emp1=emp1->
returnNULL;
EMP*findnum(intnum)//按工号查询
if(num==emp1->
num)
EMP*findtelephone(char*name)//按电话号码查询员工信息
tel_office)==0||strcmp(name,emp1->
tel_home)==0||strcmp(name,emp1->
mobile)==0)
EMP*findqq(char*name)//按QQ号码查询员工信息
qq)==0)
(7)自定义函数resetpwd()用于修改密码。
在系统的功能菜单中选择修改的操作选项后,系统会提示输入旧密码,用户咋正确的输入旧密码后,根据提示即可实现密码的修改:
voidresetpwd()
charpwd[9],pwd1[9];
FILE*fp1;
\n请输入旧密码:
for(i=0;
((pwd[i]=getchar())!
putchar('
pwd[i]='
if(strcmp(password,pwd)!
\n密码错误,请按任意键退出!
getchar();
putchar('
pwd1[i]='
if(strcmp(pwd,pwd1)!
=0)//比较两次输入的密码
\n两次密码输入不一致,请重新输入!
\n\n"
else
if((fp1=fopen("
employee.tex"
i=0;
while(pwd[i])
putw(pwd[i],fp1);
fclose(fp1);
\n密码修改成功,请按任意键退出后,再重新进入!
getch();
(8)主函数程序代码如下:
intmain()
emp_first=emp_end=NULL;
//链表指针初始化
gsave=gfirst=0;
checkfirst();
login();
readdata();
menu();
PAUSE"
return0;
五.测试数据及运行结果
1.正常测试数据和运行结果
第一组:
实现添加员工信息并显示添加后员工的信息的功能,操作如下图:
第二组:
实现查询员工信息的功能,操作如下:
第三组:
实现修改员工信息的功能,并显示修改后员工的信息,操作如下:
2.异常测试数据及运行结果
登陆系统时连续输入3次密码都不正确:
文件在文档中保存出现乱码情况,在运行对话框中文件保存再打开时出现数据存储错误,如下图:
异