完整word版C语言课程设计人事管理系统.docx
- 文档编号:7940205
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:32
- 大小:234.46KB
完整word版C语言课程设计人事管理系统.docx
《完整word版C语言课程设计人事管理系统.docx》由会员分享,可在线阅读,更多相关《完整word版C语言课程设计人事管理系统.docx(32页珍藏版)》请在冰豆网上搜索。
完整word版C语言课程设计人事管理系统
C语言课程设计实验报告
班级
姓名
学号
实验课程
C
实验名称
人事管理系统
实验成绩
实验日期
任课教师
一、目的(本次课程设计所涉及并要求掌握的知识点。
)
本次课程设计主要涉及c语言的基础语法,以及指针、文件函数、结构体、函数调用等知识点。
二、使用环境(本次上机实践所使用的平台和相关软件。
)
主要采用windowsxp系统环境+visualc++6.0编译环境
三、内容与设计思想
(1.设计思路2.主要数据结构3.主要代码结构4.主要代码段分析。
)
设计思路
1、需求分析
人事档案信息采用文件存储,因而要提供文件的输入输出操作;根据学院人事的变动情况,添加删除记录,因而要提供文件的添加删除操作;根据编号和姓名进项查询,所以要提供文件的查找操作;高级编辑功能,就是提供文件的修改操作;统计功能要提供统计操作;排序功能要提供用排序算法对文件记录的排序;另外还要提供键盘式选择菜单以实现功能选择。
2、总体设计
整体设计为数据输入模块、数据添加模块、数据删除模块、数据查询模块、数据修改模块、数据统计模块、数据排序模块。
主要数据结构
数据结构采用结构体:
StructpersonnelArchiveInfo
{
CharNo[10];//编号
Charname[10];//姓名
Intsex;//性别
Intage;//年龄
Charjob[10];//职务
Charpost[10];//职称
Charpolitic[10];//政治面貌
Charedu_level[10];//最高学历
Charperiod[10];//任职时间
Charstart_time[10];//来院时间
Chartype[10];//人员类别
}PAInfo;
主要代码结构
1.主函数
为使系统执行完每部分功能后能够方便的回到系统主界面,main()函数设计的较简单,只包含一个menu()函数,其余的全部功能都通过menu()函数调用来实现,并通过menu()函数的递归调用实现返回主界面的功能。
voidmain()
{
intflag=0;
intchoose=0;
FILE*fp=NULL;
charyesorno;
system("colorB9");
if((fp=fopen("employee1.txt","rb+"))==NULL)
{
printf("\n=========>提示:
文件不存在,是否要创建一个?
(y)\n");
scanf("%c",&yesorno);
if(yesorno=='y'||yesorno=='Y')
{
//这里仅为了建立文件
fp=fopen("employee1.txt","wb+");
fclose(fp);//关闭fp所指的文件,释放文件缓冲区
}
else
exit(0);
}
else
{
Number=read_file(PAInfo);//要是文件已经有数据将数据初始化到数组中
}
system("cls");
system("colorB9");
while
(1)
{
menu();
system("color20");
printf("\t====>请选择:
");
scanf("%d",&choose);
system("cls");
switch(choose)
{
case0:
exit(0);//退出
break;
case1:
input();
fh();//增加职工信息
break;
case2:
add();
fh();//查看职工信息
break;
case3:
zc_query();
fh();//查找
break;
case4:
num_del();
fh();//删除
break;
case5:
tongji();
fh();//统计
break;
case6:
sort();
fh();//排序
break;
case7:
num_modify();
fh();//修改后返回
break;
case8:
save();
fh();//保存
break;
case9:
disp();
fh();
break;//显示
default:
break;
}
fflush(stdin);
getchar();
system("cls");
}
}
2.各功能模块设计
(1)数据输入模块
看各个数据信息,编号、姓名、性别、年龄、职务、职称、政治面貌、最高学历、任职时间、来院时间、人员类别,在文件中以文本形式存放,每条记录对应一个人员的信息,可以方便信息的管理;而数据读进内存中时,可以以结构体的形式,每一个结构体包含了一个人员的全部信息,多的人员的信息组成了一个结构体数组。
定义如下:
charNO[10];
charname[15];
charsex[5];
intage;
charjob[20];
charpost[20];
charedu_level[10];
charpolitic[20];//政治面貌
charperiod[10];//任职时间
charstart_time[10];//来院时间
chartype[10];//人员类别
(2)数据添加模块
该模块的功能是拥护需要增加新的员工记录,从键盘输入并逐条写入到原来的文件中去,其中输入号码是要防止号码重复,重复时报告错误,重新输入。
为方便用户管理和查看,该模块采用的方式是用先把原来文件中的数据读入内存,保存在内存中,然后在内存中的数据后面增加新的数据,操作完成后用写的方式打开文件,用覆盖的方式写入。
voidadd()//增加职工
{
intnumberTemp=0;
inti=0;
structpersonnelArchiveInfotemp;//临时保存信息
printf("请输入要增加人事信息的个数:
");
scanf("%d",&numberTemp);
for(i=0;i { printf("输入第%d个人事信息\n",i+1); printf("编号: "); scanf("%s",temp.NO); printf("姓名: "); scanf("%s",temp.name); printf("性别: "); scanf("%s",temp.sex); printf("年龄: "); scanf("%d",&temp.age); printf("部门: "); scanf("%s",temp.job); printf("职称: "); scanf("%s",temp.post); printf("学历: "); scanf("%s",temp.edu_level); printf("政治面貌: "); scanf("%s",&temp.politic); printf("任职时间: "); scanf("%s",&temp.period); printf("来院时间: "); scanf("%s",&temp.start_time); printf("人员类别: "); scanf("%s",&temp.type); PAInfo[Number++]=temp;//将刚添加的写入到数组 write_file(&temp);//将刚添加的写入到文件 } printf("添加成功\n"); } (3)数据删除模块 该模块的运行方式与修改模块类似,首先分屏显示所有人员的记录,显示完所有的记录后,由用户输入要删除的人员的号码,根据号码查找相应的记录并将结果显示出来,经用户确认后删除,删除的方法是将文件中的数据读入内存,赋给相应的结构体,并将结构体数组中将删除的后面的数据赋给前一个结构体,然后将相应数据写入文件并保存; voidnum_del()//按编号删除 { FILE*fp=NULL; chargh[60]; inti=0; intj=0; printf("请输入要删除的人事编号: "); scanf("%s",gh); for(i=0;i { if(strcmp(gh,PAInfo[i].NO)==0)//如果查找到就删除 { for(j=i;j { PAInfo[j]=PAInfo[j+1]; } Number--; } } //将剩余数据写入文件重新一写的方式打开文件把以前的数据擦除了 fp=fopen("employee1.dat","wb"); for(i=0;i { fwrite(&PAInfo[i],sizeof(structpersonnelArchiveInfo),1,fp); } fclose(fp); printf("删除成功;\n"); } (4)数据查询模块 voidzc_query()//按职称查找 { charpost[20]; inti=0; printf("请输入要查找人事职称: "); scanf("%s",post); system("cls"); printf("\t编号\t姓名\t性别\t年龄\t部门\t职称\t学历\t政治面貌\t任职时间\t来院时间\t人员类别\n"); for(i=0;i { if(strcmp(post,PAInfo[i].post)==0) { printf("\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n",PAInfo[i].NO,PAInfo[i].name,PAInfo[i].sex,PAInfo[i].age,PAInfo[i].job,PAInfo[i].post,PAInfo[i].edu_level,PAInfo[i].politic,PAInfo[i].period,PAInfo[i].start_time,PAInfo[i].type); } } } (5)数据修改模块 该模块的功能是显示所有信息,考虑到记录较多,采用分屏显示,显示完所有的记录后,由用户输入需要修改的人员的号码,查找成功后,显示查找结果,并询问拥护修改人员的哪部分记录,根据用户选择修改相应的信息,然后保存修改后的结果: voidnum_modify()//修改职工信息 { FILE*fp=NULL; chargh[60]; inti=0; intchangeIndex=0;//changeIndex改变标记 intindex=0; printf("请输入要修改的人事编号: "); scanf("%s",gh); for(i=0;i { if(strcmp(gh,PAInfo[i].NO)==0)//比较输入编号和数组中已有编号 { changeIndex=i;//保存要修改的人的下标 break; } } printf("\t编号\t姓名\t性别\t年龄\t部门\t职称\t学历\t政治面貌\t任职时间\t来院时间\t人员类别\n"); printf("\n\n"); printf("\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n",PAInfo[changeIndex].NO,PAInfo[changeIndex].name,PAInfo[changeIndex].sex,PAInfo[changeIndex].age,PAInfo[changeIndex].job,PAInfo[changeIndex].post,PAInfo[changeIndex].edu_level,PAInfo[changeIndex].politic,PAInfo[changeIndex].period,PAInfo[changeIndex].start_time,PAInfo[changeIndex].type); printf("请重新输入该人事信息"); printf("编号: "); scanf("%s",PAInfo[changeIndex].NO); printf("姓名: "); scanf("%s",PAInfo[changeIndex].name); printf("性别: "); scanf("%s",PAInfo[changeIndex].sex); printf("年龄: "); scanf("%d",&PAInfo[changeIndex].age); printf("部门: "); scanf("%d",PAInfo[changeIndex].job); printf("职称: "); scanf("%s",PAInfo[changeIndex].post); printf("学历: "); scanf("%s",PAInfo[changeIndex].edu_level); printf("政治面貌: "); scanf("%s",&PAInfo[changeIndex].politic); printf("任职时间: "); scanf("%s",&PAInfo[changeIndex].period); printf("来院时间: "); scanf("%s",&PAInfo[changeIndex].start_time); printf("人员类别: "); scanf("%s",&PAInfo[changeIndex].type); //信息修改后重新更新文件里面的数据以保持数据一致性 fp=fopen("employee1.txt","wb+"); for(i=0;i { fwrite(&PAInfo[i],sizeof(structpersonnelArchiveInfo),1,fp);//把ptr所指向n*size个字节输入到fp所指向的文件中 } fclose(fp); printf("\t=======>修改成功\n"); } (6)数据统计模块 该模块的功能是按照用户的要求统计出满足符合条件的所有记录的个数,并将满足条件的记录显示出来。 该模块没有涉及到文件的保存,所以将文件用只读的方式打开,可以防止操作过程中数据的丢失: voidtongji()//统计 { inti,m,k,max,min; doublesum=0.0; for(i=0;i { sum=sum+PAInfo[i].age; } printf("全体人事总年龄为: %f\n",sum); printf("平均年龄为: %f\n",sum/Number); i=0;m=0;max=0; max=PAInfo[m].age; for(i=1;i { if(PAInfo[i].age>max) m=i; max=PAInfo[m].age; } printf("最高年龄为: %d\n",max); printf("\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n",PAInfo[m].NO,PAInfo[m].name,PAInfo[m].sex,PAInfo[m].age,PAInfo[m].job,PAInfo[m].post,PAInfo[m].edu_level,PAInfo[m].politic,PAInfo[m].period,PAInfo[m].start_time,PAInfo[m].type); i=0;k=0;min=0; min=PAInfo[0].age; for(i=1;i { if(PAInfo[i].age k=i; min=PAInfo[k].age; } printf("最低年龄: %d\n",min); printf("\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n",PAInfo[k].NO,PAInfo[k].name,PAInfo[k].sex,PAInfo[k].age,PAInfo[k].job,PAInfo[k].post,PAInfo[k].edu_level,PAInfo[m].politic,PAInfo[m].period,PAInfo[m].start_time,PAInfo[m].type); } (7)数据排序模块 该模块的功能是要求将记录按照年龄或者来院时间进行排序,总体结构是先用sort()函数将文件中的数据调入内存,然后按照选择法排序,并将结果显示出来,然后将排序后的结果保存: voidsort()//排序 { structpersonnelArchiveInfot; intwantNUmber=0; inti=0; intj=0; intk=0; for(i=0;i {k=i; for(j=i+1;j { if(PAInfo[j].age>PAInfo[k].age) k=j; } if(k! =i) { t=PAInfo[i]; PAInfo[i]=PAInfo[k]; PAInfo[k]=t; } } printf("你想输出前几名人事信息: "); scanf("%d",&wantNUmber); if(wantNUmber>Number) { wantNUmber=Number; } printf("\t编号\t姓名\t性别\t年龄\t部门\t职称\t学历\t政治面貌\t任职时间\t来院时间\t人员类别\n"); for(i=0;i { printf("\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n",PAInfo[i].NO,PAInfo[i].name,PAInfo[i].sex,PAInfo[i].age,PAInfo[i].job,PAInfo[i].post,PAInfo[i].edu_level,PAInfo[i].politic,PAInfo[i].period,PAInfo[i].start_time,PAInfo[i].type); } } 四、调试过程(1.测试数据设计2.测试结果分析) 主界面: 选择1: 选择2: 选择3: 选择6: 选择4: 选择9: 五、总结 1.设计中遇到的问题及解决过程 在向文件中添加数据的时候,要在打开文件的时候指定正确的文件操作方式,一开始指定文件的操作方式是w,w只写方式,若文件存在,则原有内容会被清除;若文件不存在,则会建立文件,所以每次添加完一条数据后再次插入一条数据前一条数据会自动清空,这样文件中保存的始终是最后输入的一条数据,这不是理想的结果,后来经过查阅技术文档,发现还有另外文件操作方式即追加a,a: 追加方式打开只写文件,只允许进行写操作,若文件存在,则添加的内容放在文件末尾;若不存在,则建立文件。 通过这种方式操作文件,每添加的一条数据都会自动追加到前一条数据的后面,这种的处理方式是题目所要求的,实现了多条数据的存储。 2.设计中产生的错误及原因分析 经过这一次系统设计编码的过程,我觉得我C语言的文件这一知识点掌握的极为薄弱,导致不能很好的利用一些函数处理问题。 而且,有些时候,脑袋中对问题有求解的思路,但是无法一旦着手写代码的时候却写不出来,我觉得这是我对C语言一些关键知识点的理解不够透彻,还有就是,平时编写C语言的代码量很少,以至于编码的时候不能顺手拈来。 3.设计体会和收获。 三周的C语言课程设计结束了,在这八天的时间里,我自己独立完成了一个程序从构思结构,到编写代码,然后上机调试运行的过程,感觉自己收获很大。 通过解决一个又一个的问题,熟悉了C语言的应用,对计算机语言应用的理解又深了一层,在老师的指导下,学会了模块设计的方法,用流程图表示算法,掌握了用C语言进行程序设计的能力。 在设计过程中,我理解了对于一个较大的程序,不可能一次编写出一个较大的系统,通常要采取自顶向下的设计思想,先设计主函数,再通过完善一个个的功能模块来完成程序的设计过程,在设计过程中要充分理解整个程序的设计思路,采用逐步细化的方式来完成整个程序。 六、附录 1、原代码 #include #include #include structpersonnelArchiveInfo { charNO[10]; charname[15]; charsex[5]; intage; charjob[20]; charpost[20]; charedu_level[10]; charpolitic[20];//政治面貌 charperiod[10];//任职时间 charstart_time[10];//来院时间 chartype[10];//人员类别 }; intread_file(structpersonnelArchiveInfoPAInfo[]); voidmenu(); voidwrite_file(structpersonnelArchiveInfoPAInfo[]); voidadd(); voidinput(); voidzc_query();//按职称查询 voidnum_del();//按编号删除 voidtongji();//统计 voidsort();//排序 voidnum_modify();//按编号修改职工信息 voidsave();//保存信息 voiddisp();//显示职工信息 voidfh();//返回主菜单 s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word 语言 课程设计 人事管理系统