目录
题目:
总体设计
详细设计
系统实现
题目
1、需求分析
人事档案信息采用文件存储,要提供文件的输入输出操作;根据学院人事的变动情况,可添加或删除记录,因而要提供文件的添加删除操作;能根据编号和姓名进档案查询,所提供文件的查找操作;可以修改指定成员的指定字段的信息,即提供文件的修改操作;统计功能要提供以不同字段的统计操作;排序功能要提供用排序算法对人员信息进行排序;另外还要提供键盘式选择菜单以实现对上述基本功能选择。
2、总体设计
整体设计为数据浏览模块、数据添加模块、数据删除模块、数据查询模块、数据修改模块、数据统计模块、数据排序模块。
3、详细设计
数据结构采用结构体:
struct peopleRecord{
char No[10]; //编号
char name[10]; //姓名
char sex[10]; //性别
int age; //年龄
char job[10]; //职务
char post[20]; //职称
char politic[10]; //政治面貌
char edu_level[10]; //最高学历
char period[10]; //任职时间
char start_time[10]; //来院时间
char type[10]; //人员类别
}
1)数据浏览模块
采用fread和fopen把文件中的员工信息写读入程序,并输出显示。
2)数据添加模块
用追加的方式采用fwrite或fprintf把新增员工信息写入人事档案文件。
3)数据删除模块
根据人员编号查找要删除的人员,从文件中读一条记录,查看编号是否要删除,如果是,则舍弃,不再写入文件;否则重新写入文件。
4)数据查询模块
把编号和姓名作为查询字段,用基本查找算法查找人事档案文件,把符合查找要求的记录输出。
5)数据修改模块
查找要修改的记录,修改之。先用fread或fscanf读记录,若是要修改的记录,则修改信息,把修改后的信息写入文件;否则直接写入文件。
6)数据排序模块
通过菜单选择年龄或者来院时间,把数据从文件中读出来,任意选择一种排序算法对记录进行排序,输出排序结果。
7)数据统计模块
通过菜单选择统计字段:在职人数、党员人数、女工人数、高学历人数、高职称人数。
例如选择党员人数。
总体设计
1.功能模块分析
2.程序流程图
详细设计
1.数据结构
人员信息采用如下结构体:
typedef struct peopleRecord{
char No[10]; //编号
char name[10]; //姓名
char sex[10]; //性别
int age; //年龄
char job[10]; //职务
char post[20]; //职称
char politic[10]; //政治面貌
char edu_level[10]; //最高学历
char period[10]; //任职时间
char start_time[10]; //来院时间
char type[10]; //人员类别
} P_tab; //定义学院人事记录表
2.函数
1)全部函数
主函数main、
菜单选项函数Options、
文件重写入函数save、
文件读入函数open、
文件追加写入函数save_end、
信息添加函数Det_add、
信息删除函数Det_del、
信息修改函数Det_modi、
信息浏览函数Det_show、
信息统计函数Det_count、
信息查找函数Det_seek、
信息排序函数Det_sort,
共十二个函数。
2)关键函数
①文件读入函数open:
②数据删除函数Det_del:
③数据修改函数Det_modi:
系统实现
1.源代码
#include#include #include #define N 50 typedef struct peopleRecord{ char No[10]; //编号 char name[10]; //姓名 char sex[10]; //性别 int age; //年龄 char job[10]; //职务 char post[20]; //职称 char politic[10]; //政治面貌 char edu_level[10]; //最高学历 char period[10]; //任职时间 char start_time[10]; //来院时间 char type[10]; //人员类别 } P_tab; //定义学院人事记录表 P_tab pr[N]; //定义结构体数组 //本程序全部模块函数 void save(); //清除原文件所有内容,将数据重写入文件 int open(); //文件打开函数,主要是用来获取当前文件中数据项个数 void save_end(); //从文件尾部将新数据写入文件 void Det_show(); //数据展示,将当前文件中数据全部打印到屏幕上 void Det_seek(); //按名字查找文件中对应数据项 void Det_add(); //添加函数,从文件尾写入信息 void Det_sort(); //排序函数,根据输入的字段来排序 void Det_del(); //删除函数,删除文件中对应的数据项 void Det_modi(); //修改函数,根据输入的字段查找对应数据项,在修改对应数据项的内容 void Det_count(); //根据输入字段统计文件中满足条件的对应数据项个数 void Options(int option); //菜单开关 int i,flag=1,menu; int main(){ printf("nttt ++++++++++++++++++++++++nttt + 欢迎使用人事管理系统 +nttt ++++++++++++++++++++++++n"); // system ("color 1F"); //程序面板颜色 while (flag){ do{ printf("n ******************菜单栏******************n"); printf("tt*t ① 录入新人员tt *n"); printf("tt*t ② 删除指定人员tt *n"); printf("tt*t ③ 修改指定人员tt *n"); printf("tt*t ④ 查询指定人员tt *n"); printf("tt*t ⑤ 浏览人员表tt *n"); printf("tt*t ⑥ 统计人数tt *n"); printf("tt*t ⑦ 人员排序tt *n"); printf("tt*t ⑧ 退出系统tt *n"); printf(" ******************************************n"); printf("n"); printf("请输入选项:"); scanf("%d", &menu); }while (menu>8 || menu<1); Options(menu); } } void Options(int option){ switch (option){ case 1:Det_add(); break; case 2:Det_del(); break; case 3:Det_modi(); break; case 4:Det_seek(); break; case 5:Det_show(); break; case 6:Det_count(); break; case 7:Det_sort(); break; case 8:printf("nt谢谢使用(^V^)!n");flag=0;exit(0); } } void save_end(int m){ int i; FILE*fp; if ((fp=fopen("P_tab.txt","a"))==NULL){ printf ("cannot open filen"); exit(0); } for (i=0; i N){ if(m>N)printf("n!!!太大了!!!请修改程序N值后再来!!!n"); //判断本程序是否能满足需求 exit(0); } else{ for(i=0; i 11||c<1){ //判断选项是否正常选项 printf("n选择错误!!!!n"); return; } sign=0; } } } } else if(t==2){ printf("n请输入姓名:"); scanf("%s",&no_or_na); for(i=0; sign&&i 11||c<1){ //判断选项是否正常选项 printf("n选择错误!!!!n"); return; } sign=0; } } } } else { printf("nt输入错误!!!n"); return; } if(sign==1) printf("n对不起,查无此人!n"); if(n==1){ switch(c){ case 1: printf("编号改为: "); scanf("%s",&temp); strcpy(pr[i-1].No,temp); break; case 2: printf("姓名改为: "); scanf("%s",&temp); strcpy(pr[i-1].name,temp); break; case 3: printf("性别改为: "); getchar(); scanf("%s",&temp); strcpy( pr[i-1].sex,temp); break; case 4: printf("年龄改为: "); scanf("%d",&age); pr[i-1].age=age; break; case 5: printf("职务改为: "); scanf("%s",&temp); strcpy(pr[i-1].job,temp); break; case 6: printf("职称改为: "); scanf("%s",&temp); strcpy(pr[i-1].post,temp); break; case 7: printf("政治面貌改为: "); scanf("%s",&temp); strcpy(pr[i-1].politic,temp); break; case 8: printf("最高学历改为: "); scanf("%s",&temp); strcpy(pr[i-1].edu_level,temp); break; case 9: printf("任职时间改为: "); scanf("%s",&temp); strcpy(pr[i-1].period,temp); break; case 10: printf("来院时间改为: "); scanf("%s",&temp); strcpy(pr[i-1].start_time,temp); break; case 11: printf("人员类别改为: "); scanf("%s",&temp); strcpy(pr[i-1].type,temp); break; } printf("n是否确定所修改的信息?n 是-请按①; 不-重新修改请按②:n"); scanf("%d",&b); if(b==2)return; printf("修改成功!!!n"); printf("浏览修改后的所有人员信息:n"); save(m); Det_show(); } } void Det_count(){ int i,t,a=0,b=0,c=0,d=0; int m=open(); //打开文件获取信息及数据项个数 char politic[10]= {"党员"}; char sex[10]= {"女"}; char level[10]= {"博士"}; char post[10]={"职称3"}; printf("可统计项:"); printf("①在职人数t②党员人数t③女工人数t④高学历人数(博士)t⑤高职称人数(职称3)n"); printf("请输入要统计的类型:"); scanf("%d",&t); printf("n"); switch(t){ //统计字段选项开关 case 1: printf("在职人数为:%dn",m);break; case 2: for(i=0; i pr[i+1].age){ temp=pr[i]; pr[i]=pr[i+1]; pr[i+1]=temp; } } } sign=1; } else if(n==2){ //起泡排序从小到大 for(j=0;j 0){ temp=pr[i]; pr[i]=pr[i+1]; pr[i+1]=temp; } } } sign=1; } if(sign){ //判断是否按字排序好了 printf("排好了!!!!n"); save(m); Det_show(); } else printf("!!!出错了!!n"); }
2.运行截图
1)浏览人员表。运行程序,根据菜单提示选择“录浏览人员表”功能即输入“5”。(已提前录入部分信息)。
2)录入新成员。根据菜单提示(因菜单部分和图 5-1所示菜单一致,故以下图片均未截取菜单部分)选择“录入新成员”功能即输入“1”;输入录入人数为“1”;然后依次输入添加人员的各项信息。
3)删除指定成员。根据菜单提示选择“删除指定成员”功能即输入“2”;然后输入要删除的员工姓名“王五”;找到该人员信息后确认删除及输入“1”。
4)修改指定成员。根据菜单提示选择“修改指定成员”功能即输入“3”;选择查找字段为“名字”即输入“2”,根据提示查找姓名输入“张三”;确认修改该人员信息输入“1”;选择修改字段为“职务”输入“5”;修改职务输入“职务3”;确认修改信息输入“1”。
5)查询指定成员。根据菜单提示选择“查询指定成员”功能即输入“4”;按编号查找输入“1006”。
6)统计人数。根据菜单提示选择“统计人数”功能即输入“6”;选择统计字段为“党员人数”输入“2”。
7)人员排序。根据菜单提示选择“人员排序”功能即输入“7”,选择以年龄排序,输入“1”。
8)退出系统。根据菜单提示选择“退出系统”功能即输入“8”。
3.不足:因为本人水平有限,所以并没有使用动态数组和动态链表等更优的方案,面对输入数据较多时,还需修改程序。以及可能存在其他的问题和不足。



