C语言人事管理系统Word格式.docx
《C语言人事管理系统Word格式.docx》由会员分享,可在线阅读,更多相关《C语言人事管理系统Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
voidmenu()
{
intn,w1;
do
{
printf("
\n\t\t\t\t菜\t单\n"
);
printf("
\n\t\t0\t新建档案信息\n\n"
\t\t1\t删除信息\n\n"
\t\t2\t追加信息\n\n"
\t\t3\t搜索查找信息\n\n"
\t\t4\t浏览所有信息\n\n"
\t\t5\t修改信息\n\n"
\t\t6\t信息排序\n\n"
\t\t7\t信息统计\n\n"
\t\t8\t离开\n\n"
\t\t请选择您要进行的操作[]\b\b"
/**显示一系列功能并提示选择**/
scanf("
%d"
&
n);
if(n<
0||n>
8)
{
w1=1;
getchar();
}
elsew1=0;
}
while(w1==1);
/**输入n并判断是否属于0到8**/
switch(n)
case0:
build();
break;
case1:
del();
case2:
add();
case3:
search();
case4:
browse();
case5:
modify();
case6:
order();
case7:
data();
case8:
exit(0);
default:
{printf("
输入错误!
请重新输入"
menu();
}
/**根据n的值调用各功能函数**/
2、各功能模块设计:
(1)、新建档案信息模块:
<
1>
、数据结构;
看各个数据信息,编号、姓名、性别、年龄、职务、职称、政治面貌、最高学历、任职时间、来院时间、人员类别,均为字符串类型,在文件中以文本形式存放,每条记录对应一个人员的信息,可以方便信息的管理;
而数据读进内存中时,可以以结构体的形式,每一个结构体包含了一个人员的全部信息,多的人员的信息组成了一个结构体数组。
定义如下:
structworker
{charnum[11];
charname[10];
charsex[2];
charage[3];
charzhiwu[15];
charzhicheng[15];
charzhengzhi[15];
charxueli[15];
charrenzhisj[8];
charlaiyansj[8];
charleibie[15];
}wk[N],s;
其中N是宏定义形式定义的字符,临时定义为100,wk[N],为存放人员信息的结构体数组,而S为临时的结构体,用来保存信息处理过程中的临时数据。
〈2〉、流程图如下:
〈3〉、程序:
intbuild()
inti,m,n,p;
FILE*fp;
if((fp=fopen("
worker00.txt"
"
w"
))==NULL)
cannotbuildfile\n"
printf_back();
/*输入用户要输入的学生的个数N*/
您要输入的人数是(0-%d)?
:
"
N);
m);
n=m;
for(i=0;
i<
n;
i++)
\n请输入第%d个工作人员的信息\n"
i+1);
input(i);
/*从0到N调用输入函数input*/
for(p=0;
p<
=i;
p++)
if((fprintf(fp,"
%s\t%s\t%1s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n"
wk[p].num,wk[p].name,wk[p].sex,wk[p].age,wk[p].zhiwu,wk[p].zhicheng,wk[p].zhengzhi,wk[p].xueli,wk[p].renzhisj,wk[p].laiyansj,wk[p].leibie))!
=1)
cannotwritethedata\n\n"
/*将结构体数组中的数据写入文件*/
fclose(fp);
/*关闭文件*/
(2)、追加模块:
〈1〉[需求分析]
该模块的功能是拥护需要增加新的员工记录,从键盘输入并逐条写入到原来的文件中去,其中输入号码是要防止号码重复,重复时报告错误,重新输入。
为方便用户管理和查看,该模块采用的方式是用先把原来文件中的数据读入内存,保存在内存中,然后在内存中的数据后面增加新的数据,操作完成后用写的方式打开文件,用覆盖的方式写入。
〈3〉程序:
intadd()
n=load();
/*调用加载函数load将文件中的数据读入内存*/
if(n==-1)
\n对不起,还没有档案,请新建一个档案\n"
menu();
您要追加的人数是(0-%d)?
[]\b\b\b"
N-n);
/*输入要追加的人员个数m*/
for(i=n+1;
=m+n;
\n追加第%d个工作人员的信息\n"
i-n);
/*从n到k调用输入函数input(i)*/
a+"
cannotopenfile\n"
/*调用*/
for(p=n+1;
p++)fprintf(fp,"
wk[p].num,wk[p].name,wk[p].sex,wk[p].age,wk[p].zhiwu,wk[p].zhicheng,wk[p].zhengzhi,wk[p].xueli,wk[p].renzhisj,wk[p].laiyansj,wk[p].leibie);
/*从0到k以覆盖的方式写入文件并保存*/
}(3)修改模块:
〈1〉[需求分析:
]
该模块的功能是显示所有信息,考虑到记录较多,采用分屏显示,显示完所有的记录后,由用户输入需要修改的人员的号码,查找成功后,显示查找结果,并询问拥护修改人员的哪部分记录,根据用户选择修改相应的信息,然后保存修改后的结果;
〈2〉流程图
〈3〉程序;
modify()
inti,n,k,p,w0=1,w1,w2=0;
k=-1;
printf_face();
=n;
i++)printf_one(i);
do
printf("
\n\n请输入你要修改的信息的编号\n\t\t编号:
[]\b\b"
%s"
s.num);
{
if(strcmp(s.num,wk[i].num)==0)
{
k=i;
s=wk[i];
}
}
if(k==-1)printf("
\n\n没有找到您所需的信息!
请重新输入!
\n"
}while(k==-1);
printf_face();
printf_one(k);
w1=modify_data(k);
if(w1==1)
\n修改成功!
\n\n要继续修改吗?
\n\n\t\t1\t是\n\n\t\t2\t保存并返回\n\t[]\b\b"
w0);
w2=1;
else
w0=0;
if(w2==1)
wk[k]=s;
if(w0!
=1&
&
w2==1)
{
fp=fopen("
for(p=0;
fprintf(fp,"
}while(w0==1);
menu();
修改数据函数如下:
modify_data(inti)
intc,w1;
\n请选择需要修改的项=>
\n\n\t\t1\t编号\n\t\t2\t姓名\n\t\t3\t性别\n\t\t4\t年龄\n\t\t5\t职务\n\t\t6\t职称\n\t\t7\t政治面貌\n\t\t8\t学历\n\t\t9\t任职时间\n\t\t10\t来院时间\n\t\t11\t在职类别\n\n\t\t\t[]\b\b"
c);
if(c>
11||c<
1)printf("
错误,请重新选择!
}while(c>
1);
switch(c)
case1:
printf("
旧的编号是%s,"
wk[i].num);
input_num(i,i-1);
旧的姓名是%s,请输入新的姓名:
wk[i].name);
scanf("
旧的性别是%s,请输入新的性别:
wk[i].sex);
%1s"
旧的年龄是%s,请输入新的年龄:
wk[i].age);
旧的职务是%s,请输入新的职务:
wk[i].zhiwu);
旧的职称是%s,请输入新的职称:
wk[i].zhicheng);
旧的政治面貌是%s,请输入新的政治面貌:
wk[i].zhengzhi);
旧的学历是%s,请输入新的学历:
wk[i].xueli);
case9:
旧的任职时间是%s,请输入新的任职时间:
wk[i].renzhisj);
case10:
旧的来院时间是%s,请输入新的来院时间:
wk[i].laiyansj);
case11:
旧的在职类别是%s,请输入新的在职类别:
wk[i].leibie);
now:
\n\n"
printf_one(i);
\n确定修改吗?
\n\n\t\t1\t是\n\t\t2\t重新修改\n\t\t3\t返回并不保存\n\t\t\t[]\b\b\b"
w1);
}while(w1==2);
return(w1);
(4)删除模块:
〈1〉[需求分析]:
该模块的运行方式与修改模块类似,首先分屏显示所有人员的记录,显示完所有的记录后,由用户输入要删除的人员的号码,根据号码查找相应的记录并将结果显示出来,经用户确认后删除,删除的方法是将文件中的数据读入内存,赋给相应的结构体,并将结构体数组中将删除的后面的数据赋给前一个结构体,然后将相应数据写入文件并保存;
Y
intdel()
charc;
inti,j,n,k,m,w0,w1=0,w2=0;
FILE*fpt;
/*fpt?
*/
\n\n请输入您想要删除的人员的编号!
\n\t\tNO.[]\b\b"
if(strcmp(s.num,wk[i].num)==0);
k=i;
if(k==-1)
\n\n对不起,这个编号不存在!
请重新输入"
while(k==-1);
确定要删除吗?
\t请输入y或者n\n\t\t[]\b\b"
if(c=='
y'
)
for(j=i;
j<
j++)wk[j]=wk[j+1];
if(c=='
n'
)menu();
else
\n错误,请输入y或者n\n"
menu();
\n删除成功!
\n\n您要继续删除吗?
\n\n\t\t1\t是\n\n\t\t2\t保存并返回\n\t[]\b\b"
if(w0==2&
fpt=fopen("
for(m=0;
m<
m++)
fprintf(fpt,"
wk[m].num,wk[m].name,wk[m].sex,wk[m].age,wk[m].zhiwu,wk[m].zhicheng,wk[m].zhengzhi,wk[m].xueli,wk[m].renzhisj,wk[m].laiyansj,wk[m].leibie);
fclose(fpt);
while(w0==1);
}(5)、按号码搜索:
该模块的功能是按照输入的人员的号码查找对应的记录,并将其显示,查找成功以后,增加删除和修改等功能,其中删除和修改功能可以通过调用相应的函数来实现。
〈2〉流程图;
〈3〉、程序;
snum()
{
inti,k,w1=1,w2,w3,n;
k=-1;
\n\n请输入您要查询的编号!
\n\t\tnumber:
[]\b\b\b\b\b"
if(strcmp(s.num,wk[i].num)==0)
{
printf_one(k);
break;
printf("
\n\n您查询的编号不存在!
\n\n您要继续查询吗?
\n\t\t1\t继续\n\t\t2\t返回\n\t\t[]\b\b"
if(w1==2)
menu();
break;
if(w1!
w1!
=2)
printf("
\n对不起,请输入1或2\n"
\n请重新输入\n"
}while(k==-1&
=2);
if(k!
=-1)
w3=0;
\n要继续查询吗?
\n\t\t1\t继续\n\t\t2\t返回菜单\n\t\t[]\b\b"
scanf("
w3);
if(w3==2)
break;
if(w3!
w3!
=2)
search();
}while(k!
=-1&
w3==1);
}(6)按姓名搜索。
该模块的结构与按号码查询的结构基本相同;
(7)浏览模块;
该模块的功能是显示所有保存在文件中的记录,考虑到记录较多,采用分屏显示的方式;
〈2〉、流程图;
browse()
inti,j,n;
/*调load函数将所有的数据调入内存*/
/*调用表头函数*/
\t总计有%d个工作人员\n"
n+1);
按任意键继续..."
getch();
(9)、排序模块;
〈1〉、[需求分析];
该模块的功能是要求将记录按照年龄或者来院时间进行排序,总体结构是先用n=load()函数将文件中的数据调入内存,然后按照选择法排序,并将结果显示出来,然后将排序后的结果保存。
order()
inti,j,k,n,p;
请选择您要排序的项\n\t\t1\t年龄\n\t\t2\t来院时间\n\n"
p);
if(p==1)
for(i=0;
=n-1;
for(j=i+1;
j++)
if(strcmp(wk[i].age,wk[j].age)<
0)
s=wk[i];
wk[i]=wk[j];
wk[j]=s;
for(k=0;
k<
k++)printf_one(k);
if(p==2)
if(strcmp(wk[i].laiyansj,wk[j].laiyansj)<
wk[j]=s;
\n按任意键返回菜单:
[]\n"
if(!
p||p)
}(10)、统计模块
该模块的功能是按照用户的要求统计出满足符合条件的所有记录的个数,并将满足条件的记录显示出来。
该模块没有涉及到文件的保存,所以将文件用只读的方式打开,可以防止操作过程中数据的丢失。
〈3〉、程序
data()
intp,w;
请选择您要统计的项目?
\n\t\t1\t在职人数\n\t\t2\t党员人数\n\t\t3\t女工人数\n\t\t4\t高学历人员统计\n\t\t5\texit\n\n\t\t[]\b\b"
switch(p