资源描述
本科生C语言课程设计论文
课程名称 C语言课程设计
教师姓名 朱莉
本科生姓名 李百蝉
本科生学号 20111002986
本科生专业 地质学
所在院系 地球科学学院
日 期: 20一三年12月26日
目 录
目 录 2
1.课程论文题目 3
2.程序设计思路 3
3.功能模块图 4
4.程序代码 4
5.程序运行结果 30
6.课程设计总结 32
7.致谢 32
8.参考文献 32
一 课程论文题目
某高校主要人员有:在职人员(行政人员、教师、一般员工)、退休人员和临时工。现在,需要存储这些人员的人事档案信息:编号、姓名、性别、年龄、职务、职称、政治面貌、最高学历、任职时间、来院时间、人员类别。其中,人员编号唯一,不能重复。
(1) 添加删除功能:能根据学院人事的变动情况,添加删除记录;
(2) 查询功能:能根据编号和姓名进行查询;
(3) 编辑功能(高级):根据查询对相应的记录进行修改,并存储;
(4) 统计功能:能根据多种参数进行人员的统计(在职人数、党员人数、女工人数、高学历高职称人数(硕士学位以上或者副教授以上)),统计要求同时显示被统计者的信息;
(5) 排序功能:按照年龄、来院时间进行排序;
(6) 保存功能:能对输入的数据进行相应的存储;
二 程序设计思路
根据题目要求,人事信息是存放在文件中的,所以应该提供相应的文件的输入输出的功能,在程序中应该有添加删除,查询,编辑,统计,排序,保存等程序实现相应的操作,另外菜单式的选择方式选择程序的功能也是必须需的。另外程序中要求存储的模块,采用的方式均为将原文件中的所有数据读入内存,在内存中处理之后以覆盖的方式写入文件中重新储存,这样的方法容易理解、容易编写,但当文件中的数据量很大时,这种方法也存在一定的难度,在本程序中将M定为2000,也即最多可储存的职工人数为2000;
根据以上需求分析,将程序分成以下几个模块:
1.添加和删除
****添加人员信息并保存(1)
****按名称和编号查询与删除记录并保存(2)
2.查询与编辑
****按名称和编号查询
****重新编辑信息并保存
3. 统计
****统计在职人数
****统计党员人数
****统计女工人数
****统计硕士以上学历和副教授以上职称人数
****将统计得到的信息保存在worker3.txt文件中
4. 排序
****按年龄进行排序(1)
****按来院时间进行排序(2)
三 功能模块图
四 程序代码
1、 主函数:
主函数设计的比较简单,只提供输入、处理和输出部分的函数调用。其中各功能模块用菜单方式选择。其流程图如下
程序
开始
显示一系列功能
根据n的值调用个功能模块函数
结束
输入n,判断是否是0~4
N
Y
main()
{
int n,w;
do
{
puts("\t\t***********************高校人事管理*************************\n\n\n");
puts("\t\t\t\t 1.添加或删除\n");
puts("\t\t\t\t 2.查询与编辑\n");
puts("\t\t\t\t 3.统计\n");
puts("\t\t\t\t 4.排序\n");
puts("\t\t\t\t 5.退出\n");
puts("\t\t*************************************************************\n");
printf("选择你要的服务(1-5): [ ]\b\b");
scanf("%d",&n);
if(n<1||n>5)
{
w=1;
getchar();
}
else w=0;
}
while(w==1);
switch(n)
{
case 1:retify();main();break;
case 2:sear_edit();main();break;
case 3:stat();main();break;
case 4:row();main();break;
case 5:exit(0);break;
}
}
struct worker
{
int num;
char name[20];
char sex[10];
int old;
char zhicheng[20];
char zhiwei[20];
char mianmao[20];
char xueli[20];
int come_time;
int work_time;
int leibie;
}wor[N];
1.添加与删除模块,此模块有(1),(2)两个模块构成。
void retify()
{
int n,w;
do
{
puts("\t\t***************删除或添加人员的信息****************\n\n\n\n\n");
puts("\t\t\t\t 1.添加");
puts("\t\t\t\t 2.删除");
printf("请选择服务(1-2): [ ]\b\b");
scanf("%d",&n);
if(n<1||n>2)
{
w=1;
getchar();
}
else w=0;
}
while(w==1);
switch(n)
{
case 1:tianjia();break;
case 2:shanchu();break;
}
}
(1).添加模块:
开始
输入你要添加人的信息并且显示在屏幕中
对原文件进行添加并保存
void tianjia()
{
FILE *fp;
int i,number;
struct worker wor_t[N];
printf("您要添加的人的人数:");
scanf("%d",&number);
printf("输入添加人的信息:\n");
for(i=0;i<number;i++)
{
printf("编号:\n");scanf("%d",&wor_t[i].num);
printf("姓名:\n"); scanf("%s",wor_t[i].name);
printf("性别:\n");scanf("%s",wor_t[i].sex);
printf("年龄:\n");scanf("%d",&wor_t[i].old);
printf("职称:\n");scanf("%s",wor_t[i].zhicheng);
printf("职位:\n");scanf("%s",wor_t[i].zhiwei);
printf("政治面貌:\n");scanf("%s",wor_t[i].mianmao);
printf("学历:\n");scanf("%s",wor_t[i].xueli);
printf("来院时间:\n");scanf("%d",&wor_t[i]xe_time);
printf("在院工作时间:\n");scanf("%d",&wor_t[i].work_time);
printf("在职与否:在职请按1,不在职请按2\n");scanf("%d",&wor_t[i].leibie);
printf("您刚才输入的人的信息\n");
printf("%d %s %s %d %s %s %s %s %d %d %d \n",wor_t[i].num,wor_t[i].name,wor_t[i].sex,wor_t[i].old,wor_t[i].zhicheng,wor_t[i].zhiwei,wor_t[i].mianmao,wor_t[i].xueli,wor_t[i]xe_time,wor_t[i].work_time,wor_t[i].leibie);
}
if((fp=fopen("D:\\txt\\worker.txt","a+"))==NULL)
{
printf("\nCannot open file\n"); exit(0);
}
for(i=0;i<number;i++)
{
fprintf(fp,"\n%d %s %s %d %s %s %s %s %d %d %d",wor_t[i].num,wor_t[i].name,wor_t[i].sex,wor_t[i].old,wor_t[i].zhicheng,wor_t[i].zhiwei,wor_t[i].mianmao,wor_t[i].xueli,wor_t[i]xe_time,wor_t[i].work_time,wor_t[i].leibie);
}
fclose(fp);
}
(2).删除模块
该模块的功能是根据编号和姓名先查询出该人的信息,然后从原文件中删除该人的信息。流程图如下,
开始
输入要删除记录的编号和姓名
该人存在与否?
显示:该人在????
删除原文件中该人的信息并且保存
Y
N
程序
void shanchu()
{
FILE *fp,*fp1;
int i,number,k,j,m;
struct worker worker1[M],worker2[M];
int a[N];
char b[N][20];
printf("您要删除的人的人数:\n");
scanf("%d",&number);
for(i=0;i<number;i++)
{
printf("输入删除人的信息的编号和姓名:\n");
printf("输入删除人的编号:\n");scanf("%d",&a[i]);
printf("输入删除人的姓名:\n");scanf("%s",b[i]);
printf("您刚才输入的人的信息的编号和姓名:\n");
printf("%d %s\n",a[i],b[i]);
}
if((fp=fopen("worker.txt","r"))==NULL)
{
printf("\nCannot open file\n");
getch();
exit(0);
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%d %s %s %d %s %s %s %s %d %d %d\n",&worker2[i].num,worker2[i].name,worker2[i].sex,&worker2[i].old,worker2[i].zhicheng,worker2[i].zhiwei,worker2[i].mianmao,worker2[i].xueli,&worker2[i]xe_time,&worker2[i].work_time,&worker2[i].leibie);
k=i;
m=0;
for(i=0;i<k;i++)
{
for(j=0;j<number;j++)
{
if(worker2[i].num==a[j]||!strcmp(worker2[i].name,b[j]))break;
}
if(j==number)worker1[m]=worker2[i],m++;
}
printf("输出公司更改后所有人员的信息:\n编号 姓名 性别 年龄 职称 职位 面貌 学历 来院时间 工作时间 在职与否\n");
if((fp1=fopen("worker.txt","w"))==NULL)
{
printf("\nCannot open file\n");
getch();
exit(0);
}
for(i=0;i<m;i++)
{
printf(" %d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
fprintf(fp1," %d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
}
fclose(fp1);
getch();
}
2,查询和编辑功能:
首先,输入你要查询的人的编号和姓名,电脑将显示出该人的信息,并提问你是否要对该人的信息重新进行编辑,若选择了重新编辑的选项就重新输入该人的信息,此时将显示该人的信息并且对原文件进行修改和保存。
开始
输入你要查询人的编号和姓名
显示该人的信息
是否重新编辑该信息?
该人是否存在?
显示该人不存在
重新输入该人的信息
显示你刚才输入的信息,并且保存到原文件里
void sear_edit()
{
FILE *fp,*fp1;
struct worker wor_people ,worker1[M];
int i,k,m,n;
printf("你想查询谁?\n");
printf("输入你想查询的人的编号和姓名 \n");
printf("输入你想查询的人的编号 \n");scanf("%d",&wor_people.num);
printf("输入你想查询的人的姓名 \n");scanf("%s",wor_people.name);
if((fp=fopen("worker.txt","r"))==0)
{
printf("\nCannot open file\n");getch();
exit(0);
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%d %s %s %d %s %s %s %s %d %d %d",&worker1[i].num,worker1[i].name,worker1[i].sex,&worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,&worker1[i]xe_time,&worker1[i].work_time,&worker1[i].leibie);
k=i;m=-1;
for(i=0;i<k;i++)
{
if(wor_people.num==worker1[i].num||!(strcmp(wor_people.name,worker1[i].name)))
{
printf("%d %s %s %d %s %s %s %s %d %d %d",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
m=i;
}
}
fclose(fp);
if(m==-1)
{
printf("\n这个人不存在???");exit(0);getch();
}
printf("\n你想重新编辑这个人的信息吗?\n ");
printf("如果你想,请按 1\n如果不想请按 2\n");
scanf("%d",&n);
if(n==1)
{
{
printf("这个人的初始信息:\n");
printf("\n%d %s %s %d %s %s %s %s %d %d %d\n",worker1[m].num,worker1[m].name,worker1[m].sex,worker1[m].old,worker1[m].zhicheng,worker1[m].zhiwei,worker1[m].mianmao,worker1[m].xueli,worker1[m]xe_time,worker1[m].work_time,worker1[m].leibie);
printf(" 输入新的信息\n");
printf("编号:\n");scanf("%d",&worker1[m].num);
printf("姓名:\n"); scanf("%s",worker1[m].name);
printf("性别:\n");scanf("%s",worker1[m].sex);
printf("年龄:\n");scanf("%d",&worker1[m].old);
printf("职称:\n");scanf("%s",worker1[m].zhicheng);
printf("职位:\n");scanf("%s",worker1[m].zhiwei);
printf("政治面貌:\n");scanf("%s",worker1[m].mianmao);
printf("学历:\n");scanf("%s",worker1[m].xueli);
printf("来院时间:\n");scanf("%d",&worker1[m]xe_time);
printf("在院工作时间:\n");scanf("%d",&worker1[m].work_time);
printf("在职与否:在职请按1,不在职请按2\n");scanf("%d",&worker1[i].leibie);
printf("您刚才输入的人的信息\n");
printf("\n%d %s %s %d %s %s %s %s %d %d %d\n",worker1[m].num,worker1[m].name,worker1[m].sex,worker1[m].old,worker1[m].zhicheng,worker1[m].zhiwei,worker1[m].mianmao,worker1[m].xueli,worker1[m]xe_time,worker1[m].work_time,worker1[m].leibie);
}
if((fp1=fopen("worker.txt","w"))==0)
{
printf("\nCannot open file\n"); exit(0);
}
for(i=0;i<k;i++)
fprintf(fp1,"%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
fclose(fp1);
}
}
3,根据各个参数进行统计:
****统计在职人数
****统计党员人数
****统计女工人数
****统计硕士以上学历和副教授以上职称人数
****将统计得到的信息保存在worker3.txt文件中
void stat()
{
FILE *fp,*fp1;
int w_num,d_num,wo_num,x_c_num,i,k;
struct worker worker1[M];
puts("\t\t*******************统计人数菜单********************\n\n");
printf("\t\t\t\t 各种人员的人数");
puts("\n\n\t\t**************************************************\n");
if((fp=fopen("worker.txt","r"))==0)
{
printf("\nCannot open file\n");
exit(0);
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%d %s %s %d %s %s %s %s %d %d %d",&worker1[i].num,worker1[i].name,worker1[i].sex,&worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,&worker1[i]xe_time,&worker1[i].work_time,&worker1[i].leibie);
k=i;
fclose(fp);
w_num=0,d_num=0,wo_num=0,x_c_num=0;
printf("女职工人数\n");
for(i=0;i<k;i++)
{
if(!(strcmp(worker1[i].sex,"w")))
w_num++,
printf("%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
}
printf("女职工人数有%d人\n",w_num);
printf("党员人数\n");
for(i=0;i<k;i++)
{
if(!(strcmp(worker1[i].mianmao,"dang")))
d_num++,
printf("%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
}
printf("党员人数有%d人\n",d_num);
printf("在职人员\n");
for(i=0;i<k;i++)
{
if(worker1[i].leibie==1)
wo_num++,
printf("%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
}
printf("在职人员有%d人\n",wo_num);
printf("高职称高学历人数\n");
for(i=0;i<k;i++)
{
if(!(strcmp(worker1[i].xueli,"doc"))) {x_c_num++;
printf("%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
continue;}
if(!(strcmp(worker1[i].xueli,"mas"))) {x_c_num++;
printf("%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
continue;}
if(!(strcmp(worker1[i].zhicheng,"Professor"))) {x_c_num++;
printf("%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
continue;}
if(!(strcmp(worker1[i].zhicheng,"a_professor"))) {x_c_num++;
printf("%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
continue;}
}
printf("高职称高学历人数有%d人\n",x_c_num);
if((fp1=fopen("worker3.txt","w"))==NULL)
{
printf("\nCannot open file\n");
exit(0);
}
fprintf(fp1,"%d %d %d %d ",w_num,d_num,wo_num,x_c_num);
fclose(fp1);
}
4.排序模块:该模块有两个子模块构成,按年龄和来源时间对原文件里的信息进行排序并且将排序分别保存在old_row.txt和comingtime_row.txt中。
开始
选择你要进行排序的参数
选择1就按年龄进行排序
选择2就按来院时间进行排序
显示按相应参数进行排序的结果并且分别保存在相应的 文件夹里
void row()
{
int n, w;
do
{
puts("\t\t************按年龄和来院时间排序*****************\n\n");
puts("\t\t\t\t 1.按年龄排序\n");
puts("\t\t\t\t 2.按来院时间排序\n");
puts("\n\n\t\t**********************************************\n");
printf(" 选择数字后就可排序(1-2): [ ]\b\b");
scanf("%d",&n);
if(n<1||n>2)
{
w=1;
getchar();
}
else w=0;
}
while(w==1);
switch(n)
{
case 1:old_row();break;
case 2:comingtime_row();break;
}
}
(1).按年龄对人员进行排序:
void old_row()
{
FILE *fp,*fp1;
struct worker wor_people ,worker1[M];
int i,j,k;
if((fp=fopen("worker.txt","r"))==NULL)
{
printf("\nCannot open file\n");
exit(0);
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%d %s %s %d %s %s %s %s %d %d %d\n",&worker1[i].num,worker1[i].name,worker1[i].sex,&worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,&worker1[i]xe_time,&worker1[i].work_time,&worker1[i].leibie);
k=i;
for(i=0;i<k;i++)
{
for(j=i+1;j<k;j++)
{
if(worker1[i].old>worker1[j].old)
{
wor_people=worker1[i];worker1[i]=worker1[j];worker1[j]=wor_people;
}
}
}
if((fp1=fopen("old_row.txt","w"))==0)
{
printf("\nCannot open file\n");
}
for(i=0;i<k;i++)
{
printf("%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
fprintf(fp1,"%d %s %s %d %s %s %s %s %d %d %d\n",worker1[i].num,worker1[i].name,worker1[i].sex,worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,worker1[i]xe_time,worker1[i].work_time,worker1[i].leibie);
}
fclose(fp1);
}
(2).按来院时间对人员进行排序
void comingtime_row()
{
FILE *fp,*fp1;
struct worker wor_people ,worker1[M];
int i,j,k;
if((fp=fopen("worker.txt","r"))==NULL)
{
printf("\nCannot open file\n");
exit(0);
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%d %s %s %d %s %s %s %s %d %d %d\n",&worker1[i].num,worker1[i].name,worker1[i].sex,&worker1[i].old,worker1[i].zhicheng,worker1[i].zhiwei,worker1[i].mianmao,worker1[i].xueli,&worker1[i]xe_time,&worker1[i].work_time,&worker1[i].leibie);
k=i;
for(i=0;i<k;i++)
{
f
展开阅读全文