资源描述
C语言课程设计
——人事管理系统
题目要求:
人事管理管理系统
[要求]
某高校主要人员有:在职人员(行政人员、教师、一般员工)、退休人员与临时工。现在,需要存储这些人员得人事档案信息:编号、姓名、性别、年龄、职务、职称、政治面貌、最高学历、任职时间、来院时间、人员类别。其中,人员编号唯一,不能重复。
(1) 添加删除功能:能根据学院人事得变动情况,添加删除记录;
(2) 查询功能:能根据编号与姓名进行查询;
(3) 编辑功能(高级):根据查询对相应得记录进行修改,并存储;
(4) 统计功能:能根据多种参数进行人员得统计(在职人数、党员人数、女工人数、高学历高职称人数(硕士学位以上或者副教授以上)),统计要求同时显示被统计者得信息;
(5) 排序功能:按照年龄、来院时间进行排序;
(6) 保存功能:能对输入得数据进行相应得存储;
一、 需求分析:
根据题目要求,职工信息就是存放在文件中得,所以应该提供相应得文件得输入输出得功能,在程序中应该有添加删除,查询,编辑,统计,排序,保存等程序实现相应得操作,另外菜单式得选择方式选择程序得功能也就是必须需得。另外程序中要求存储得模块,采用得方式均为将原文件中得所有数据读入内存,在内存中处理之后以覆盖得方式写入文件存贮,这样得方法在一定程度上提高了对数据处理得灵活性,较容易理解,但存在处理中遇到以外情况而丢失数据得风险,另外当文件中得数据量很大时,这种方法也存在一定得难度,在本程序中将N定为100,基本上能满足要求;
二、 总体设计:
根据以上需求分析,将程序分成以下几个模块:
1、 新建数据文件(build new data);
2、 添加记录(add data);
3、 删除记录(delete data);
4、 按工号搜索(search by number);
5、 按姓名搜索(search by name);
6、 浏览全部数据(browse all);
7、 修改数据(modify the data);
8、 排序功能(order the volume);
9、 统计功能(data a volume);
系统功能模块图如下:
三、 详细设计;
1、 主函数:
〈1〉需求分析:
为使系统执行完每部分功能后能够方便得回到系统主界面,main()函数设计得较简单,只包含一个menu()函数,其余得全部功能都通过menu()函数调用来实现,并通过menu()函数得递归调用实现返回主界面得功能。
main()函数定义如下:
main()
{menu();}
而menu()定义如下:
〈2〉流程图:
menu()
{int n,w1;
do
{printf("\n\t\t\t\tMENU\n");
printf("\t\t0\tbuild new data\n\n");
printf("\t\t1\tdelete data\n\n");
printf("\t\t2\tadd data\n\n");
printf("\t\t3\tsearch by number\n\n");
printf("\t\t4\tsearch by name\n\n");
printf("\t\t5\tbrowse all\n\n");
printf("\t\t6\tmodify the data\n\n");
printf("\t\t7\torder the volume\n\n");
printf("\t\t8\tdata a volume\n\n");
printf("\t\t9\texit\n\n");
printf("\tplease choice and enter a number [ ]\b\b");
scanf("%d",&n);
if(n<0||n>8)
{w1=1;
getchar();}
else w1=0;
}
while(w1==1);
switch(n)
{case 0:build();break; /*********调用新建数据文件函数*******/
case 1:del();break; /*********调用删除数据函数***********/
case 2:add();break; /*********调用添加数据函数***********/
case 3:snum();break; /*********调用按工号搜索函数*********/
case 4:sname();break; /*********调用按姓名搜索函数*********/
case 5:browse();break; /*********调用浏览数据函数************/
case 6:modify();break; /*********调用修改数据函数************/
case 7:order();break; /*********调用排序函数函数************/
case 8:data();break; /*********调用统计函数****************/
case 9:exit(0); /*********退出*************************/
default:{printf("input error!! please input a number between 0 and 8");menu();}
}}
2、各功能模块设计:
(1)、新建数据文件模块:
<1>、数据结构;
瞧各个数据信息,编号、姓名、性别、年龄、职务、职称、政治面貌、最高学历、任职时间、来院时间、人员类别,均为字符串类型,在文件中以文本形式存放,每条记录对应一个人员得信息,可以方便信息得管理;而数据读进内存中时,可以以结构体得形式,每一个结构体包含了一个人员得全部信息,多得人员得信息组成了一个结构体数组。定义如下:
struct worker
{char num[11];
char name[10];
char sex[2];
char age[3];
char zhiwu[15];
char zhicheng[15];
char zhengzhi[15];
char xueli[15];
char renzhisj[8];
char laiyansj[8];
char leibie[15];
}wk[N],s;
其中N就是宏定义形式定义得字符,临时定义为100,wk[N],为存放人员信息得结构体数组,而S为临时得结构体,用来保存信息处理过程中得临时数据。
〈2〉、流程图如下:
〈3〉、程序:
build() {int i,m,k,p;
FILE *fp;
if((fp=fopen("worker00、txt","w"))==NULL)
{printf("can not build file\n");
printf_back();}
printf("how many workers do you want to input(0-%d)?:",N);
scanf("%d",&m);
k=m;
for(i=0;i<k;i++)
{printf("\nInput %dth worker record、\n",i+1);
input(i);
}
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)
printf("cannot write the data\n\n");
fclose(fp);
printf_back();
}
(2)、追加模块:
〈1〉[需求分析]
该模块得功能就是拥护需要增加新得员工记录,从键盘输入并逐条写入到原来得文件中去,其中输入号码就是要防止号码重复,重复时报告错误,重新输入。为方便用户管理与查瞧,该模块采用得方式就是用先把原来文件中得数据读入内存,保存在内存中,然后在内存中得数据后面增加新得数据,操作完成后用写得方式打开文件,用覆盖得方式写入。
〈2〉流程图:
〈3〉程序:
add()
{int i,m,n,k,p;
FILE *fp;
n=load();
if(n==-1)
menu();
printf("how many workers do you want to add(0-%d)?:[ ]\b\b\b",N-n);
scanf("%d",&m);
k=m+n;
for(i=n+1;i<=k;i++)
{printf("\nInput %dth worker record、\n",i-n+1);
input(i);
}
if((fp=fopen("worker00、txt","w"))==NULL) /*******将数据保存到文件********/
{printf("can not open file\n");
printf_back();}
for(p=0;p<k;p++)
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);
fclose(fp);
printf_back();
}
(3)修改模块:
〈1〉 [需求分析:]
该模块得功能就是显示所有信息,考虑到记录较多,采用分屏显示,显示完所有得记录后,由用户输入需要修改得人员得号码,查找成功后,显示查找结果,并询问拥护修改人员得哪部分记录,根据用户选择修改相应得信息,然后保存修改后得结果;
〈2〉 流程图
〈3〉 程序;
modify()
{
int i,n,k,p,w0=1,w1,w2=0;
FILE *fp;
n=load();
do
{k=-1;
printf_face();
for(i=0;i<=n;i++)
{
if((i!=0)&&(i%10==0))
{printf("\n\nRemember the No、which need modify、\npress any key to continue、、、");
getch();
puts("\n\n");
}
printf_one(i);
}
do
{
printf("\n\nEnter NO、 that you want to modify!\n\t\tNO、[ ]\b\b");
scanf("%s",s、num);
for(i=0;i<n;i++)
if(strcmp(s、num,wk[i]、num)==0);
{k=i;
s=wk[i];
}
if(k==-1)
printf("\n\nNO exit ! please again");
}
while(k==-1);
printf_face();
printf_one(k);
w1=modify_data(k);
if(w1==1)
{printf("\nsuccessful!!\n\nDo yuo want to modify another?\n\n\t\t1\tYes\n\n\t\t2\tBack with save\n\t[ ]\b\b");
scanf("%d",&w0);
w2=1;
}
else
{w0=0;
if(w2==1)
ﻩ wk[k]=s;}
wk[k]=s;
if(w0!=1&&w2==1)
{ fp=fopen("worker00、txt","w");
{for(p=0;p<=n;p++)
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);}
fclose(fp);}
}
while(w0==1);
menu();
}
修改数据函数如下:
modify_data(int i)
{int c,w1;
do
{printf("\nmodify by =>\n\n\t\t1\tNO、\n\t\t2\tname\n\t\t3\tsex\n\t\t4\tage\n\t\t5\tzhiwu\n\t\t6\tzhicheng\n\t\t7
\tzhengzhimianmao\n\t\t8\txueli\n\t\t9\trenzhishijian\n\t\t10\tlaiyuanshijian\n\t\t11\trenyuanleibie\n\n\t\t\t[ ]\b\b");
scanf("%d",&c);
if(c>11||c<1)
printf("choice error!please choose again!");
getchar();
}
while(c>11||c<1);
do
{switch(c)
{case 1:printf("the old number is %s,",wk[i]、num);input_num(i,i-1);break;
case 2:printf("the old name is %s,enter the new name:",wk[i]、name);scanf("%s",wk[i]、name);break;
case 3:printf("the old sex is %s,enter the new sex:",wk[i]、sex);scanf("%1s",wk[i]、sex);break;
case 4:printf("the old age is %s,enter the new age:",wk[i]、age);scanf("%s",wk[i]、age);break;
case 5:printf("the old zhiwu is %s,enter the new zhiwu:",wk[i]、zhiwu);scanf("%s",wk[i]、zhiwu);break;
case 6:printf("the old zhicheng is %s,enter the new zhicheng:",wk[i]、zhicheng);scanf("%s",wk[i]、zhicheng);break;
case 7:printf("the old zhengzhimianmao is %s,enter the new zhengzhimiainmao:",wk[i]、zhengzhi);scanf("%s",wkﻭ
[i]、zhengzhi);break;
case 8:printf("the old zuigaoxueli is %s,enter the new zuigaoxueli:",wk[i]、xueli);scanf("%s",wk[i]、xueli);break;
case 9:printf("the old renzhishijian is %s,enter the new renzhishijian:",wk[i]、renzhisj);scanf("%s",wk[i]、renzhisj);break;
case 10:printf("the old laiyuanshijian is %s,enter the new laiyuanshijian:",wk[i]、laiyansj);scanf("%s",wk[i]、laiyansj);break;
case 11:printf("the old renyuanleibie is %s,enter the new renyuanleibie:",wk[i]、leibie);scanf("%s",wk[i]、leibie);break;
}
printf("now:\n\n");
printf_face();
printf_one(i);
printf("\nare you sure?\n\n\t\t1\tsure\n\t\t2\tNo and remodify\n\t\t3\tback without save in this time\n\t\t\t[ ]\b\b\b");
scanf("%d",&w1);
}
while(w1==2);
return(w1);
}
(4)删除模块:
〈1〉[需求分析]:
该模块得运行方式与修改模块类似,首先分屏显示所有人员得记录,显示完所有得记录后,由用户输入要删除得人员得号码,根据号码查找相应得记录并将结果显示出来,经用户确认后删除,删除得方法就是将文件中得数据读入内存,赋给相应得结构体,并将结构体数组中将删除得后面得数据赋给前一个结构体,然后将相应数据写入文件并保存;
〈2〉流程图:
Y
〈3〉程序;
del()
{
char c;
int i,j,n,k,m,w0=1,w1=0,w2=0;
FILE *fpt;
n=load();
do
{k=-1;
printf_face();
for(i=0;i<=n;i++)
{
if((i!=0)&&(i%10==0))
{printf("\n\nRemember the No、which need delete、\npress any key to continue、、、");
getch();
printf("\n\n");
}
printf_one(i);
}
do
{
printf("\n\nEnter NO、 that you want to delete!\n\t\tNO、[ ]\b\b");
scanf("%s",s、num);
for(i=0;i<=n;i++)
if(strcmp(s、num,wk[i]、num)==0);
{k=i;
s=wk[i];
}
if(k==-1)
printf("\n\nNO exit ! please again");
}
while(k==-1);
printf_face();
printf_one(k);
printf("are you sure to delete the data? \t[y/n]\n\t\t[ ]\b\b");
scanf("%1s",&c);
if(c=='y')
{
for(j=i;j<=n;j++)
wk[j]=wk[j+1];
w1=1;
}
else menu();
if(w1==1)
{printf("\nsuccessful!!\n\nDo yuo want to delete another?\n\n\t\t1\tYes\n\n\t\t2\tBack with save\n\t[]\b\b");
scanf("%d",&w0);
w2=1;
}
if(w0!=1&&w2==1)
{fpt=fopen("worker00、txt","w");
for(m=0;m<n;m++)
fprintf(fpt,"%s\t%s\t%1s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",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);
menu();}
(5)、按号码搜索:
〈1〉[需求分析]:
该模块得功能就是按照输入得人员得号码查找对应得记录,并将其显示,查找成功以后,增加删除与修改等功能,其中删除与修改功能可以通过调用相应得函数来实现。
〈2〉流程图;
〈3〉、程序;
snum()
{FILE *fp;
int i,n,k,p,w1=1,w2,w3,w4;
n=load();
do
{do
{ k=-1;
printf("\n\nEnter the number that you want to search!\n\t\tnumber:[ ]\b\b\b\b\b");
scanf("%s",s、num);
for(i=0;i<=n;i++)
if(strcmp(s、num,wk[i]、num)==0)
{ k=i;
printf_one(k);break;
}
if(k==-1)
{
printf("\n\nNO exist!please");
printf("\n\nAre you again?\n\t\t1\tagain\n\t\t2\tNO and back\n\t\t[ ]\b\b");
scanf("%d",&w1);
if(w1==1)
{snum();
break;}
if(w1==2) menu();break;
} }
while(k==-1&&w1==1);
w4=0;w3=0;
if(k!=-1);
printf("\n\nWhat do you want to do ?\n\t\t1\tsearch another\n\t\t2\tmodify\n\t\t3\tDelete\n\t\t4\tback menu\n\t\t[ ]\b\b");
scanf("%d",&w2);
switch(w2)
{case 1:snum();break;
case 2:w3=modify_data(k);break;/****调用修改数据函数******/
case 3:{printf("\nAre you sure?\n\t\t1\tsure\n\t\t2\tno and back\n\t\t[ ]\b\b");
scanf("%d",&w4);
if(w4==1)
for(p=i;p<=n;p++)
wk[p]=wk[p+1];
break;}
case 4:menu();break;
}
if(w3==1||w4==1)
{fp=fopen("worker00、txt","w");
for(p=0;p<=n;p++)
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);
fclose(fp);}
printf("\n\n\t\tsuccessful!!\n");
printf("\n\nWhat do you want to do?\n\t\t1\tSearch another\n\t\t2\tBack\n\t\t[ ]\b\b");
scanf("%d",&w2);}
while(w2==1);
menu();}
(7) 按姓名搜索。
该模块得结构与按号码查询得结构基本相同;
(8) 浏览模块;
〈1〉 需求分析:
该模块得功能就是显示所有保存在文件中得记录,考虑到记录较多,采用分屏显示得方式;
〈2〉、流程图;
〈3〉程序:
browse()
{int i,j,n;
n=load();
printf_face();
for(i=0;i<=n;i++)
{ if((i!=0)&&(i%10==0))
{printf("\n\nRemember the No、which need delete、\npress any key to continue、、、");
getch();
printf("\n\n");
}
printf_one(i);}
printf("\tThere are %d record、\n",n+1);
printf("press any key to continue、、、");
getch();
menu();}
(9)、排序模块;
〈1〉、[需求分析];
该模块得功能就是要求将记录按照年龄或者来院时间进行排序,总体结构就是先用n=load()函数将文件中得数据调入内存,然后按照选择法排序,并将结果显示出来,然后将排序后得结果保存。
〈2〉 流程图;
〈3〉 程序;
order()
{int i,j,k,n,p,m;
FILE *fp;
n=load();
printf("which do you like to follow?\n\t\t1\tage\n\t\t2\tlaiyuanshijian\n\n");
scanf("%d",&p);
if(p==1)
{for(i=0;i<=n-1;i++)
{for(j=i+1;j<=n;j++)
{if(strcmp(wk[i]、age,wk[j]、age)<0)
{s=wk[i];
wk[i]=wk[j];
wk[j]=s; } } } }
if(p==2)
{for(i=0;i<=n-1;i++)
{for(j=i+1;j<=n;j++)
{if(strcmp(wk[i]、laiyansj,wk[j]、laiyansj)<0)
{s=wk[i];
wk[i]=wk[j];
wk[j]=s;
}}}}
{fp=fopen("worker00、txt","w+");
for(m=0;m<=n;m++)
{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[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)==NULL)
{printf("cannot open the any key to continue、、、、、、");getchar();menu();}}
fclose(fp);}
printf("\n\n");
printf_back();
}
(10)、统计模块
〈1〉、[需求分析];
该模块得功能就是按照用户得要求统计出满足符合条件得所有记录得个数,并将满足条件得记录显示出来。该模块没有涉及到文件得保存,所以将文件用只读得方式打开,可以防止操作过程中数据得丢失。
〈2〉流程图;
〈3〉、程序
data()
{int p;
printf("what kind do you want to data?\n\t\t1\tthe number on duty\n\t\t2\tthe number of Party member\n\t\t3\tthe number of women\n\t\t4\tthe number of high education\n\t\t5\texit\n\n\t\t[ ]\b\b");
scanf("%d",&p);
switch(p)
{
case 1:numduty();break;
case 2:numpm();break;
case 3:numwm();break;
case 4:hiedcation();break;
case 5:menu();break;
dafault:printf("the number must be between 1 and 4,please choose again!"); data();
}
}
该过程中调用了四个函数,numduty()(统计在职人员人数),numpm()(统计党员人数),numwm()(统计女工人数),hieduction()(统计高学历高职称人数),函数得具体定义见后面附录源程序。
并通过在四个函数中调用menu()函数返回到主菜单。
ﻬ上机操作:
1:数据源
2:编译,连接与运行
下面就是各个模块得运行结果得界面图:
1、 主菜单函数界面:
2、输入模块:
新建文件与 添加模块得输入界面基本相同:
3、删除模块:
4、浏览模块;
5、编辑模块:
6、统计模块:
7、排序模块:
附所有源程序:
#define N 100
#include<stdio、h>
struct worker
{
char num[11];
char name[10];
char sex[2];
char age[3];
char zhiwu[15];
char zhicheng[15];
char zhengzhi[15];
char xueli[15];
char renzhisj[8];
char laiyansj[8];
char leibie[15];
}wk[N],s,h;
menu() /********************菜单函数***************/
{
int n,w1;
do
{
printf("\n\t\t\t\tMENU\n");
printf("\t\t0\tbuild new data\n\n");
printf("\t\t1\tdelete data\n\n");
printf("\t\t2\tadd data\n\n");
printf("\t\t3\tsearch by number\n\n");
printf("\t\t4\tsearch by name\n\n");
printf("\t\t5\tbrowse all\n\n");
printf("\t\t6\tmodify the data\n\n");
printf("\t\t7\torder the volume\n\n");
printf("\t\t8\tdata a volume\n\n");
printf("\t\t9\texit\n\n");
printf("\tplease choice and enter a number [ ]\b\b");
scanf("%d",&n);
if(n<0||n>8)
{
w1=1;
getchar();
}
else w1=0;
}
while(w1==1);
switch(n)
{
case 0:build();break;
case 1:del();break;
case 2:add();break;
case 3:snum();break;
case 4:sname();break;
case 5:browse();break;
case 6:modify();break;
case 7:order();break;
case 8:data();break;
case 9:exit(0);
default:{printf("input error!! please input a number between 0 and 8");menu();}
}
}
build() /**************************新建文件*********************/
{int i,m,k,p;
FILE *fp;
if((fp=fopen("worker00、txt","w"))==NULL)
{printf("can not build file\n");
printf_back();}
printf("how many workers do you want to input(0-%d)?:",N);
scanf("%d",&m);
k=m;
for(i=0;i<k;i++)
{printf("\nInput %dth worker record、\n",i+1);
input(i);
}
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
展开阅读全文