版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言课程设计实验报告第 PAGE17页 共 NUMPAGES17页C语言课程设计实验报告班 级姓 名学 号实验课程 C实验名称 人事管理系统实验成绩 实验日期 任课教师目的(本次 课程设计 所涉及并要求掌握的知识点。)本次课程设计主要涉及c语言的基础语法,以及指针、文件函数、结构体、函数调用等知识点。二、使用环境 (本次上机实践所使用的平台和相关软件。 )主要采用windows xp系统环境+visual c+6.0编译环境三、内容与设计思想 (1 设计思路 2 主要数据结构 3 主要代码结构 4 主要代码段分析 。 )设计思路1、需求分析 人事档案信息采用文件存储,因而要提供文件的输入输出
2、操作;根据学院人事的变动情况,添加删除记录,因而要提供文件的添加删除操作;根据编号和姓名进项查询,所以要提供文件的查找操作;高级编辑功能,就是提供文件的修改操作;统计功能要提供统计操作;排序功能要提供用排序算法对文件记录的排序;另外还要提供键盘式选择菜单以实现功能选择。2、总体设计 整体设计为数据输入模块、数据添加模块、数据删除模块、数据查询模块、数据修改模块、数据统计模块、数据排序模块。主要数据结构数据结构采用结构体:Struct personnelArchiveInfo Char No10; /编号 Char name10; /姓名 Int sex; /性别 Int age; /年龄 Ch
3、ar job10; /职务 Char post10; /职称 Char politic10; /政治面貌 Char edu_level10; /最高学历 Char period10; /任职时间 Char start_time10; /来院时间 Char type10; /人员类别PAInfo;主要代码结构1.主函数为使系统执行完每部分功能后能够方便的回到系统主界面,main()函数设计的较简单,只包含一个menu()函数,其余的全部功能都通过menu()函数调用来实现,并通过menu()函数的递归调用实现返回主界面的功能。void main() int flag=0; int choose=
4、0; FILE *fp=NULL; char yesorno; system(color B9); 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); /要是文件已经有数据 将数据初始化到数组
5、中 system(cls); system(color B9); while(1) menu(); system(color 20); printf(t=请选择:); scanf(%d,&choose); system(cls); switch(choose) case 0: exit(0); /退出 break; case 1: input(); fh();/增加职工信息 break; case 2: add(); fh();/查看职工信息 break; case 3: zc_query(); fh();/ 查找 break; case 4: num_del(); fh();/删除 brea
6、k; case 5: tongji(); fh();/统计 break; case 6: sort(); fh();/排序 break; case 7: num_modify(); fh();/修改后返回 break; case 8: save(); fh();/保存 break; case 9: disp(); fh(); break;/显示 default: break; fflush(stdin); getchar(); system(cls); 2.各功能模块设计(1)数据输入模块看各个数据信息,编号、姓名、性别、年龄、职务、职称、政治面貌、最高学历、任职时间、来院时间、人员类别,在文
7、件中以文本形式存放,每条记录对应一个人员的信息,可以方便信息的管理;而数据读进内存中时,可以以结构体的形式,每一个结构体包含了一个人员的全部信息,多的人员的信息组成了一个结构体数组。定义如下: char NO10; char name15; char sex5; int age; char job20; char post20; char edu_level10;char politic20; /政治面貌char period10; /任职时间 char start_time10; /来院时间 char type10; /人员类别(2)数据添加模块该模块的功能是拥护需要增加新的员工记录,从键盘
8、输入并逐条写入到原来的文件中去,其中输入号码是要防止号码重复,重复时报告错误,重新输入。为方便用户管理和查看,该模块采用的方式是用先把原来文件中的数据读入内存,保存在内存中,然后在内存中的数据后面增加新的数据,操作完成后用写的方式打开文件,用覆盖的方式写入。void add()/增加职工 int numberTemp=0; int i=0; struct personnelArchiveInfo temp; /临时保存信息 printf(请输入要增加人事信息的个数:); scanf(%d,&numberTemp); for(i=0;inumberTemp;i+) printf(输入第%d个人事
9、信息n,i+1); printf(编号:); scanf(%s,temp.NO); printf(姓名:); scanf(%s,); printf(性别:); scanf(%s,temp.sex); printf(年龄:); scanf(%d,&temp.age); printf(部门:); scanf(%s,temp.job); printf(职称:); scanf(%s,temp.post); printf(学历:); scanf(%s,_level); printf(政治面貌:); scanf(%s,&temp.politic); printf(任职时间
10、:); scanf(%s,&temp.period);printf(来院时间:); scanf(%s,&temp.start_time);printf(人员类别:); scanf(%s,&temp. type); PAInfoNumber+=temp; /将刚添加的写入到数组 write_file(&temp); /将刚添加的写入到文件 printf(添加成功n);(3)数据删除模块该模块的运行方式与修改模块类似,首先分屏显示所有人员的记录,显示完所有的记录后,由用户输入要删除的人员的号码,根据号码查找相应的记录并将结果显示出来,经用户确认后删除,删除的方法是将文件中的数据读入内存,赋给相应的
11、结构体,并将结构体数组中将删除的后面的数据赋给前一个结构体,然后将相应数据写入文件并保存;void num_del()/按编号删除 FILE *fp=NULL; char gh60; int i=0; int j=0; printf(请输入要删除的人事编号:); scanf(%s,gh); for(i=0;iNumber;i+) if (strcmp(gh,PAInfoi.NO)=0) /如果查找到就删除 for (j=i;jNumber-1;j+) PAInfoj=PAInfoj+1; Number-; /将剩余数据写入文件 重新一写的方式打开文件 把以前的数据擦除了 fp=fopen(em
12、ployee1.dat,wb); for (i=0;iNumber;i+) fwrite(&PAInfoi,sizeof(struct personnelArchiveInfo),1,fp); fclose(fp); printf(删除成功;n);(4)数据查询模块void zc_query()/按职称查找 char post20; int i=0; printf(请输入要查找人事职称:); scanf(%s,post); system(cls); printf(t编号t姓名t性别t年龄t部门t职称t学历t政治面貌t任职时间t来院时间t人员类别n); for (i=0;iNumber;i+)
13、if (strcmp(post,PAInfoi.post)=0) printf(t%st%st%st%dt%st%st%st%st%st%st%snn,PAInfoi.NO,PAI,PAInfoi.sex,PAInfoi.age,PAInfoi.job,PAInfoi.post,PAI_level,PAInfoi.politic,PAInfoi.period,PAInfoi.start_time,PAInfoi.type); (5)数据修改模块该模块的功能是显示所有信息,考虑到记录较多,采用分屏显示,显示完所有的记录后,由用户输入需要修改的人员的号码,查找成功
14、后,显示查找结果,并询问拥护修改人员的哪部分记录,根据用户选择修改相应的信息,然后保存修改后的结果:void num_modify() /修改职工信息 FILE *fp=NULL; char gh60; int i=0; int changeIndex=0; /changeIndex 改变标记 int index=0; printf(请输入要修改的人事编号:); scanf(%s,gh); for (i=0;iNumber;i+) if (strcmp(gh,PAInfoi.NO)=0) /比较输入编号和数组中已有编号 changeIndex=i; /保存要修改的人的下标 break; pri
15、ntf(t编号t姓名t性别t年龄t部门t职称t学历t政治面貌t任职时间t来院时间t人员类别n); printf(nn);printf(t%st%st%st%dt%st%st%st%st%st%st%snn,PAInfochangeIndex.NO,PAInfochangeI,PAInfochangeIndex.sex,PAInfochangeIndex.age,PAInfochangeIndex.job,PAInfochangeIndex.post,PAInfochangeI_level,PAInfochangeIndex.politic,PAInfochan
16、geIndex.period,PAInfochangeIndex.start_time,PAInfochangeIndex.type); printf(请重新输入该人事信息); printf(编号:); scanf(%s,PAInfochangeIndex.NO); printf(姓名:); scanf(%s,PAInfochangeI); printf(性别:); scanf(%s,PAInfochangeIndex.sex); printf(年龄: ); scanf(%d,&PAInfochangeIndex.age); printf(部门:); scanf(%d,PAI
17、nfochangeIndex.job); printf(职称:); scanf(%s,PAInfochangeIndex.post); printf(学历:); scanf(%s,PAInfochangeI_level); printf(政治面貌:); scanf(%s,&PAInfochangeIndex.politic); printf(任职时间:); scanf(%s,&PAInfochangeIndex.period); printf(来院时间:); scanf(%s,&PAInfochangeIndex.start_time); printf(人员类别:); scan
18、f(%s,&PAInfochangeIndex. type); /信息修改后重新更新文件里面的数据 以保持数据一致性 fp=fopen(employee1.txt,wb+); for (i=0;i修改成功n);(6)数据统计模块该模块的功能是按照用户的要求统计出满足符合条件的所有记录的个数,并将满足条件的记录显示出来。该模块没有涉及到文件的保存,所以将文件用只读的方式打开,可以防止操作过程中数据的丢失:void tongji()/统计 int i,m,k,max,min; double sum=0.0; for(i=0;iNumber;i+) sum=sum+PAInfoi.age; prin
19、tf(全体人事总年龄为:%fn,sum); printf(平均年龄为:%fn,sum/Number); i=0;m=0;max=0; max=PAInfom.age; for(i=1;imax) m=i; max=PAInfom.age; printf(最高年龄为:%dn,max); printf(t%st%st%st%dt%st%st%st%st%st%st%snn,PAInfom.NO,PAI,PAInfom.sex,PAInfom.age,PAInfom.job,PAInfom.post,PAI_level,PAInfom.politic,PAInfom
20、.period,PAInfom.start_time,PAInfom.type); i=0;k=0;min=0; min=PAInfo0.age; for(i=1;iNumber;i+) if (PAInfoi.agemin) k=i; min=PAInfok.age; printf(最低年龄:%dn,min); printf(t%st%st%st%dt%st%st%st%st%st%st%snn,PAInfok.NO,PAI,PAInfok.sex,PAInfok.age,PAInfok.job,PAInfok.post,PAI_level,PAInfom.
21、politic,PAInfom.period,PAInfom.start_time,PAInfom.type); (7)数据排序模块该模块的功能是要求将记录按照年龄或者来院时间进行排序,总体结构是先用sort()函数将文件中的数据调入内存,然后按照选择法排序,并将结果显示出来,然后将排序后的结果保存:void sort()/排序 struct personnelArchiveInfo t; int wantNUmber=0; int i=0; int j=0; int k=0; for(i=0;iNumber-1;i+) k=i; for(j=i+1;jPAInfok.age) k=j; if
22、(k!=i) t=PAInfoi; PAInfoi=PAInfok; PAInfok=t; printf(你想输出前几名人事信息:); scanf(%d,&wantNUmber); if (wantNUmberNumber) wantNUmber=Number; printf(t编号t姓名t性别t年龄t部门t职称t学历t政治面貌t任职时间t来院时间t人员类别n); for(i=0;iwantNUmber;i+) printf(t%st%st%st%dt%st%st%st%st%st%st%snn,PAInfoi.NO,PAI,PAInfoi.sex,PAInfoi.age,P
23、AInfoi.job,PAInfoi.post,PAI_level,PAInfoi.politic,PAInfoi.period,PAInfoi.start_time,PAInfoi.type); 四、调试过程 (1 测试数据设计 2 测试结果分析 )主界面:选择1:选择2:选择3:选择6:选择4:选择9:五、总结 设计中遇到的问题及解决过程 在向文件中添加数据的时候,要在打开文件的时候指定正确的文件操作方式,一开始指定文件的操作方式是w,w 只写方式,若文件存在,则原有内容会被清除;若文件不存在,则会建立文件,所以每次添加完一条数据后再次插入一条数据前一条数据会自动清空,这样
24、文件中保存的始终是最后输入的一条数据,这不是理想的结果,后来经过查阅技术文档,发现还有另外文件操作方式即追加a,a:追加方式打开只写文件,只允许进行写操作,若文件存在,则添加的内容放在文件末尾;若不存在,则建立文件。通过这种方式操作文件,每添加的一条数据都会自动追加到前一条数据的后面,这种的处理方式是题目所要求的,实现了多条数据的存储。设计中产生的错误及原因分析 经过这一次系统设计编码的过程,我觉得我C语言的文件这一知识点掌握的极为薄弱,导致不能很好的利用一些函数处理问题。而且,有些时候,脑袋中对问题有求解的思路,但是无法一旦着手写代码的时候却写不出来,我觉得这是我对C语言一些关键知识点的理解
25、不够透彻,还有就是,平时编写C语言的代码量很少,以至于编码的时候不能顺手拈来。3 设计体会和收获。三周的C语言课程设计结束了,在这八天的时间里,我自己独立完成了一个程序从构思结构,到编写代码,然后上机调试运行的过程,感觉自己收获很大。通过解决一个又一个的问题,熟悉了C语言的应用,对计算机语言应用的理解又深了一层,在老师的指导下,学会了模块设计的方法,用流程图表示算法,掌握了用C语言进行程序设计的能力。在设计过程中,我理解了对于一个较大的程序,不可能一次编写出一个较大的系统,通常要采取自顶向下的设计思想,先设计主函数,再通过完善一个个的功能模块来完成程序的设计过程,在设计过程中要充分理解整个程序
26、的设计思路,采用逐步细化的方式来完成整个程序。六、附录 1、原代码 #include #include #include struct personnelArchiveInfo char NO10; char name15; char sex5; int age; char job20; char post20; char edu_level10;char politic20; /政治面貌char period10; /任职时间 char start_time10; /来院时间 char type10; /人员类别;int read_file(struct personnelArchiveIn
27、fo PAInfo);void menu();void write_file(struct personnelArchiveInfo PAInfo);void add(); void input();void zc_query(); /按职称查询void num_del(); /按编号删除void tongji(); /统计void sort(); /排序void num_modify(); /按编号修改职工信息void save(); /保存信息void disp(); /显示职工信息void fh(); /返回主菜单struct personnelArchiveInfo PAInfo300
28、; /这个数组用来保存所有的职工信息 和文件里面的一致int Number=0; /记录总的职工人数 也就是数组/文件里面的职工人数void menu() system(cls); system(color B9); printf(t*n); printf(t* *n); printf(t* 人事信息管理系统 *n); printf(t* *n); printf(t* 1 输入人事信息 2 增加人事信息 *n); printf(t* 3 查找人事信息 4 删除人事信息 *n); printf(t* 5 统计人事信息 6 人事年龄排列 *n); printf(t* 7 修改人事信息 8 保存人事
29、信息 *n); printf(t* 9 显示人事信息 0 退出管理系统 *n); printf(t* *n); printf(t*n); printf(t*数信院*n); void main() int flag=0; int choose=0; FILE *fp=NULL; char yesorno; system(color B9); if(fp=fopen(employee1.txt,rb+)=NULL) printf(n=提示:文件不存在,是否要创建一个?(y)n); scanf(%c,&yesorno); if(yesorno=y|yesorno=Y) /这里仅为了建立文件 fp=f
30、open(employee1.txt,wb+); fclose(fp); /关闭fp所指的文件,释放文件缓冲区 else exit(0); else Number=read_file(PAInfo); /要是文件已经有数据 将数据初始化到数组中 system(cls); system(color B9); while(1) menu(); system(color 20); printf(t=请选择:); scanf(%d,&choose); system(cls); switch(choose) case 0: exit(0); /退出 break; case 1: input(); fh(
31、);/增加职工信息 break; case 2: add(); fh();/查看职工信息 break; case 3: zc_query(); fh();/ 查找 break; case 4: num_del(); fh();/删除 break; case 5: tongji(); fh();/统计 break; case 6: sort(); fh();/排序 break; case 7: num_modify(); fh();/修改后返回 break; case 8: save(); fh();/保存 break; case 9: disp(); fh(); break;/显示 defau
32、lt: break; fflush(stdin); getchar(); system(cls); void save() printf(t=程序在运行时已自动保存n);void fh() printf(t=按Enter键返回主菜单n);void num_modify() /修改职工信息 FILE *fp=NULL; char gh60; int i=0; int changeIndex=0; /changeIndex 改变标记 int index=0; printf(请输入要修改的人事编号:); scanf(%s,gh); for (i=0;iNumber;i+) if (strcmp(gh
33、,PAInfoi.NO)=0) /比较输入编号和数组中已有编号 changeIndex=i; /保存要修改的人的下标 break; printf(t编号t姓名t性别t年龄t部门t职称t学历t政治面貌t任职时间t来院时间t人员类别n); printf(nn);printf(t%st%st%st%dt%st%st%st%st%st%st%snn,PAInfochangeIndex.NO,PAInfochangeI,PAInfochangeIndex.sex,PAInfochangeIndex.age,PAInfochangeIndex.job,PAInfochangeIndex.
34、post,PAInfochangeI_level,PAInfochangeIndex.politic,PAInfochangeIndex.period,PAInfochangeIndex.start_time,PAInfochangeIndex.type); printf(请重新输入该人事信息); printf(编号:); scanf(%s,PAInfochangeIndex.NO); printf(姓名:); scanf(%s,PAInfochangeI); printf(性别:); scanf(%s,PAInfochangeIndex.sex); prin
35、tf(年龄: ); scanf(%d,&PAInfochangeIndex.age); printf(部门:); scanf(%d,PAInfochangeIndex.job); printf(职称:); scanf(%s,PAInfochangeIndex.post); printf(学历:); scanf(%s,PAInfochangeI_level); printf(政治面貌:); scanf(%s,&PAInfochangeIndex.politic); printf(任职时间:); scanf(%s,&PAInfochangeIndex.period); printf
36、(来院时间:); scanf(%s,&PAInfochangeIndex.start_time); printf(人员类别:); scanf(%s,&PAInfochangeIndex. type); /信息修改后重新更新文件里面的数据 以保持数据一致性 fp=fopen(employee1.txt,wb+); for (i=0;i修改成功n);void disp() /输出所有职工信息 int i=0;system(color 2); printf(t编号tt姓名t性别t年龄t部门t职称t学历t政治面貌t任职时间t来院时间t人员类别n); printf(nn);for (i=0;iNumbe
37、r;i+) printf(t%st%st%st%dt%st%st%st%stt%stt%stt%snn,PAInfoi.NO,PAI,PAInfoi.sex,PAInfoi.age,PAInfoi.job,PAInfoi.post,PAI_level,PAInfoi.politic,PAInfoi.period,PAInfoi.start_time,PAInfoi.type); void sort()/排序 struct personnelArchiveInfo t; int wantNUmber=0; int i=0; int j=0; int k=0; f
38、or(i=0;iNumber-1;i+) k=i; for(j=i+1;jPAInfok.age) k=j; if(k!=i) t=PAInfoi; PAInfoi=PAInfok; PAInfok=t; printf(你想输出前几名人事信息:); scanf(%d,&wantNUmber); if (wantNUmberNumber) wantNUmber=Number; printf(t编号t姓名t性别t年龄t部门t职称t学历t政治面貌t任职时间t来院时间t人员类别n); for(i=0;iwantNUmber;i+) printf(t%st%st%st%dt%st%st%st%st%st
39、%st%snn,PAInfoi.NO,PAI,PAInfoi.sex,PAInfoi.age,PAInfoi.job,PAInfoi.post,PAI_level,PAInfoi.politic,PAInfoi.period,PAInfoi.start_time,PAInfoi.type); void tongji()/统计 int i,m,k,max,min; double sum=0.0; for(i=0;iNumber;i+) sum=sum+PAInfoi.age; printf(全体人事总年龄为:%fn,sum); printf(平均年龄为:%fn,
40、sum/Number); i=0;m=0;max=0; max=PAInfom.age; for(i=1;imax) m=i; max=PAInfom.age; printf(最高年龄为:%dn,max); printf(t%st%st%st%dt%st%st%st%st%st%st%snn,PAInfom.NO,PAI,PAInfom.sex,PAInfom.age,PAInfom.job,PAInfom.post,PAI_level,PAInfom.politic,PAInfom.period,PAInfom.start_time,PAInfom.type
41、); i=0;k=0;min=0; min=PAInfo0.age; for(i=1;iNumber;i+) if (PAInfoi.agemin) k=i; min=PAInfok.age; printf(最低年龄:%dn,min); printf(t%st%st%st%dt%st%st%st%st%st%st%snn,PAInfok.NO,PAI,PAInfok.sex,PAInfok.age,PAInfok.job,PAInfok.post,PAI_level,PAInfom.politic,PAInfom.period,PAInfom.start_ti
42、me,PAInfom.type); void num_del()/按编号删除 FILE *fp=NULL; char gh60; int i=0; int j=0; printf(请输入要删除的人事编号:); scanf(%s,gh); for(i=0;iNumber;i+) if (strcmp(gh,PAInfoi.NO)=0) /如果查找到就删除 for (j=i;jNumber-1;j+) PAInfoj=PAInfoj+1; Number-; /将剩余数据写入文件 重新一写的方式打开文件 把以前的数据擦除了 fp=fopen(employee1.dat,wb); for (i=0;i
43、Number;i+) fwrite(&PAInfoi,sizeof(struct personnelArchiveInfo),1,fp); fclose(fp); printf(删除成功;n);void zc_query()/按职称查找 char post20; int i=0; printf(请输入要查找人事职称:); scanf(%s,post); system(cls); printf(t编号t姓名t性别t年龄t部门t职称t学历t政治面貌t任职时间t来院时间t人员类别n); for (i=0;iNumber;i+) if (strcmp(post,PAInfoi.post)=0) pri
44、ntf(t%st%st%st%dt%st%st%st%st%st%st%snn,PAInfoi.NO,PAI,PAInfoi.sex,PAInfoi.age,PAInfoi.job,PAInfoi.post,PAI_level,PAInfoi.politic,PAInfoi.period,PAInfoi.start_time,PAInfoi.type); void add()/增加职工 int numberTemp=0; int i=0; struct personnelArchiveInfo temp; /临时保存信息 printf(请输入要增加人事信息的个数:); scanf(%d,&numberTemp); for(i=0;inumberTemp;i+) printf(输入第%d个人事信息n,i+1); printf(编号:); scanf(%s,temp.NO); printf(姓名:); scanf(%s,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人住房借款合同
- 审计风险评估协议
- 高级语言课程设计记事本
- 商品选购协议案例
- 技术咨询协议书
- 水产店转租协议书经典版
- 图书馆文献传递服务协议
- 商务楼租赁协议案例
- 钢筋混凝土如何课程设计
- 2024年规范地下车位租赁合同范本
- 工程设计管理岗位面试问题
- 培训机构校长竞聘
- 企业微信指导手册管理员版
- 孙子兵法中的思维智慧智慧树知到期末考试答案2024年
- 尿管滑脱不良事件分析
- 临床试验方案偏离处理流程
- 盘扣脚手架搭设方案及交底
- JTT327-2016 公路桥梁伸缩装置通用技术条件
- 定量化学分析实验室的整理、整顿、清扫
- (高清版)TDT 1037-2013 土地整治重大项目可行性研究报告编制规程
- 山东省青岛市市南区2023-2024学年九年级上学期期中数学试题
评论
0/150
提交评论