C语言课程设计实验报告第1页共17页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];//人员类别C语言课程设计实验报告第2页共17页}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所指的文件,释放文件缓冲区}elseexit(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;C语言课程设计实验报告第3页共17页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;inumberTemp;i++){printf(输入第%d个人事信息\n,i+1);printf(编号:);scanf(%s,temp.NO);printf(姓名:);scanf(%s,temp.name);printf(性别:);scanf(%s,temp.sex);C语言课程设计实验报告第4页共17页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;iNumber;i++){if(strcmp(gh,PAInfo[i].NO)==0)//如果查找到就删除{for(j=i;jNumber-1;j++){PAInfo[j]=PAInfo[j+1];}Number--;}}//将剩余数据写入文件重新一写的方式打开文件把以前的数据擦除了fp=fopen(employee1.dat,wb);for(i=0;iNumber;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);C语言课程设计实验报告第5页共17页for(i=0;iNumber;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;iNumber;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,&PA