目录
题目
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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("\n\t\t\t ++++++++++++++++++++++++\n\t\t\t + 欢迎使用人事管理系统 +\n\t\t\t ++++++++++++++++++++++++\n");
// system ("color 1F"); //程序面板颜色
while (flag){
do{
printf("\n ******************菜单栏******************\n");
printf("\t\t*\t ① 录入新人员\t\t *\n");
printf("\t\t*\t ② 删除指定人员\t\t *\n");
printf("\t\t*\t ③ 修改指定人员\t\t *\n");
printf("\t\t*\t ④ 查询指定人员\t\t *\n");
printf("\t\t*\t ⑤ 浏览人员表\t\t *\n");
printf("\t\t*\t ⑥ 统计人数\t\t *\n");
printf("\t\t*\t ⑦ 人员排序\t\t *\n");
printf("\t\t*\t ⑧ 退出系统\t\t *\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("\n\t谢谢使用(^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 file\n");
exit(0);
}
for (i=0; i<m; i++) /*将内存中职工的信息输出到磁盘文件中去*/
if (fwrite(&pr[i],sizeof(P_tab),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
/*文件重写入操作函数*/
void save(int m){
int i;
FILE*fp;
if ((fp=fopen("P_tab.txt","w"))==NULL){ /*判断文件是否能打开*/
printf ("cannot open file\n");
exit(0);
}
for (i=0; i<m; i++) /*将内存中职工的信息输出到磁盘文件中去*/
if (fwrite(&pr[i],sizeof(P_tab),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
/*文件读操作函数*/
int open(){
FILE*fp;
int i=0;
if((fp=fopen("P_tab.txt","r"))==NULL){ // 判断文件是否能打开
printf ("cannot open file\n");
exit(0);
}
else{
do{
fread(&pr[i],sizeof(P_tab),1,fp); //读文件数据
i++; //并记录文件中数据项个数(重要)
}
while(feof(fp)==0); //直到读到文件尾结束
}
fclose(fp);
return(i-1); //返回文件数据项个数,应为for循环结束时i多加1,所以应该返回i-1
}
/*浏览显示函数 */
void Det_show(){
int i;
int m=open(); //打开文件获取信息及数据项个数
printf("\n -----------------------------------------------------------------------------------------------------------------");
printf("\n | 编 号 姓 名 性 别 年 龄 职 务 职 称 政治面貌 最高学历 任职时间 来院时间 人员类别 |\n");
printf(" -----------------------------------------------------------------------------------------------------------------\n");
for(i=0; i<m; i++) /*m为输入部分的员工人数*/
printf("%8s%8s%7s%8d%10s%9s%10s%12s%15s%14s%10s\n",pr[i].No,pr[i].name,pr[i].sex,pr[i].age,pr[i].job,pr[i].post,pr[i].politic,pr[i].edu_level,pr[i].period,pr[i].start_time,pr[i].type); //用数组下标
printf("\n按任意键继续……\n");
getchar();
getchar();
}
/*信息增加函数*/
void Det_add(){
int i,m,n;
printf("请输入需要添加信息的人员人数:\n");
scanf("%d",&m);
if(m<=0)printf("输入错误!!!\n"); //判断是否为正常值
else if(m>N){
if(m>N)printf("\n!!!太大了!!!请修改程序N值后再来!!!\n"); //判断本程序是否能满足需求
exit(0);
}
else{
for(i=0; i<m; i++){
printf("[增加人员信息%d]\n",i+1);
printf("请输入编号:");
scanf("%s", pr[i].No);
printf("请输入姓名:");
scanf("%s", pr[i].name);
printf("请输入性别:");
scanf("%s", pr[i].sex);
printf("请输入年龄:");
scanf("%d", &(pr[i].age));
printf("请输入职务:");
scanf("%s", pr[i].job);
printf("请输入职称:");
scanf("%s", pr[i].post);
printf("请输入政治面貌:");
scanf("%s", pr[i].politic);
printf("请输入最高学历:");
scanf("%s", pr[i].edu_level);
printf("请输入任职时间:");
scanf("%s", pr[i].period);
printf("请输入来院时间:");
scanf("%s", pr[i].start_time);
printf("请输入人员类别:");
scanf("%s", pr[i].type);
printf("-----------------------\n");
}
printf("员工信息添加成功!!!");
save_end(m); //将新数据写入文件尾
printf("\n\t现有记录如下:");
Det_show(); //展示一下写入后的文件
}
}
/*人员信息删除函数*/
void Det_del(){
int m=open(); //打开文件获取信息及数据项个数
int i,j,n,t,sign=0;
char no_or_na[10];
printf("请输入要删除的员工的编号或姓名:");
scanf("%s",&no_or_na);
for(i=0;i<m;i++){
if((strcmp(pr[i].No,no_or_na)==0)||(strcmp(pr[i].name,no_or_na))==0){ //顺序查找
sign=1; //找到了sign置
printf("\n已找到此人,原始记录为:\n");
printf("\n -----------------------------------------------------------------------------------------------------------------");
printf("\n | 编 号 姓 名 性 别 年 龄 职 务 职 称 政治面貌 最高学历 任职时间 来院时间 人员类别 |\n");
printf(" -----------------------------------------------------------------------------------------------------------------\n");
printf("%8s%8s%7s%8d%10s%9s%10s%12s%15s%14s%10s\n",pr[i].No,pr[i].name,pr[i].sex,pr[i].age,pr[i].job,pr[i].post,pr[i].politic,pr[i].edu_level,pr[i].period,pr[i].start_time,pr[i].type);
printf("\n确实要删除此人信息请按①,不删除请按 ② \n");
scanf("%d",&n);
if(n==1){ /*如果删除,则其他的信息都往上移一行*/
if(i<m-1){
for(j=i;j<m-1;j++){
pr[j]=pr[j+1];
m--;
}
}
else m=m-1;
save(m);
printf("已删除!!");
}
}
else if(i==m) printf("\n对不起,查无此人!\n"); //如果遍历整个文件斗殴没找到则输出未找到信息
}
printf("\n按任意键继续……\n");
getchar();
getchar();
}
/*人员查找函数*/
void Det_seek(){
char no_or_na[10];
int i,n;
int m=open(); //打开文件获取信息及数据项个数
printf("以编号查询请按① 以名字查询请按②:");
scanf("%d",&n); //获取查询字段
if(n==1){
printf("\n请输入编号:");
scanf("%s",&no_or_na);
for(i=0;i<m;i++)
if(strcmp(no_or_na,pr[i].No)==0){ //遍历查找编号
printf("\n已找到此人,其记录为:\n");
printf("\n -----------------------------------------------------------------------------------------------------------------");
printf("\n | 编 号 姓 名 性 别 年 龄 职 务 职 称 政治面貌 最高学历 任职时间 来院时间 人员类别 |\n");
printf(" -----------------------------------------------------------------------------------------------------------------\n");
printf("%8s%8s%7s%8d%10s%9s%10s%12s%15s%14s%10s\n",pr[i].No,pr[i].name,pr[i].sex,pr[i].age,pr[i].job,pr[i].post,pr[i].politic,pr[i].edu_level,pr[i].period,pr[i].start_time,pr[i].type);
break;
}
}
else if(n==2){
printf("\n请输入姓名:");
scanf("%s",&no_or_na);
for(i=0;i<m;i++)
if(strcmp(no_or_na,pr[i].name)==0){ //遍历查找名字
printf("\n已找到此人,其记录为:\n");
printf("\n -----------------------------------------------------------------------------------------------------------------");
printf("\n | 编 号 姓 名 性 别 年 龄 职 务 职 称 政治面貌 最高学历 任职时间 来院时间 人员类别 |\n");
printf(" -----------------------------------------------------------------------------------------------------------------\n");
printf("%8s%8s%7s%8d%10s%9s%10s%12s%15s%14s%10s\n",pr[i].No,pr[i].name,pr[i].sex,pr[i].age,pr[i].job,pr[i].post,pr[i].politic,pr[i].edu_level,pr[i].period,pr[i].start_time,pr[i].type);
break;
}
}
else printf("输入有错误!!!");
if(i==m) printf("\n对不起,查无此人\n"); //如果遍历后没找到输出没找到信息
printf("\n");
printf("\n按任意键继续……\n");
getchar();
getchar();
}
/*信息修改函数*/
void Det_modi(){
char no_or_na[10];
char temp[10];
char sex[10]; //性别
int age;
int b=0,c=0,i=0,n=0,t=0,sign=1;
int m=open(); //获取文件项个数
printf("以编号查询请按① 以名字查询请按②:");
scanf("%d",&t); //获取查询字段
if(t==1){
printf("\n请输入编号:");
scanf("%s",&no_or_na);
for(i=0; sign&&i<m; i++){
if(strcmp(pr[i].No,no_or_na)==0){
printf("\n已找到此人,原始记录为:\n");
printf("\n -----------------------------------------------------------------------------------------------------------------");
printf("\n | 编 号 姓 名 性 别 年 龄 职 务 职 称 政治面貌 最高学历 任职时间 来院时间 人员类别 |\n");
printf(" -----------------------------------------------------------------------------------------------------------------\n");
printf("%8s%8s%7s%8d%10s%9s%10s%12s%15s%14s%10s\n",pr[i].No,pr[i].name,pr[i].sex,pr[i].age,pr[i].job,pr[i].post,pr[i].politic,pr[i].edu_level,pr[i].period,pr[i].start_time,pr[i].type);
printf("\n确实要修改此人信息请按①; 不修改请按②\t");
scanf("%d",&n);
if(n==1){
printf("\n需要进行修改的选项\n ①编号 ②姓名 ③性别 ④年龄 ⑤职务 ⑥职称 ⑦政治面貌 ⑧最高学历 ⑨任职时间 ⑩来院时间 11.人员类别\n");
printf("请输入你想修改的那一项序号:");
scanf("%d",&c);
if(c>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<m; i++){
if(strcmp(pr[i].name,no_or_na)==0){
printf("\n已找到此人,原始记录为:\n");
printf("\n -----------------------------------------------------------------------------------------------------------------");
printf("\n | 编 号 姓 名 性 别 年 龄 职 务 职 称 政治面貌 最高学历 任职时间 来院时间 人员类别 |\n");
printf(" -----------------------------------------------------------------------------------------------------------------\n");
printf("%8s%8s%7s%8d%10s%9s%10s%12s%15s%14s%10s\n",pr[i].No,pr[i].name,pr[i].sex,pr[i].age,pr[i].job,pr[i].post,pr[i].politic,pr[i].edu_level,pr[i].period,pr[i].start_time,pr[i].type);
printf("\n确实要修改此人信息请按①; 不修改请按②\t");
scanf("%d",&n);
if(n==1){
printf("\n需要进行修改的选项\n ①编号 ②姓名 ③性别 ④年龄 ⑤职务 ⑥职称 ⑦政治面貌 ⑧最高学历 ⑨任职时间 ⑩来院时间 11.人员类别\n");
printf("请输入你想修改的那一项序号:");
scanf("%d",&c);
if(c>11||c<1){ //判断选项是否正常选项
printf("\n选择错误!!!!\n");
return;
}
sign=0;
}
}
}
}
else {
printf("\n\t输入错误!!!\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("在职人数为:%d\n",m);break;
case 2:
for(i=0; i<m; i++)
if(strcmp(politic,pr[i].politic)==0)
a++;
printf("党员人数为:%d\n",a);
break;
case 3:
for(i=0; i<m; i++)
if(strcmp(sex,pr[i].sex)==0)
b++;
printf("女工人数为:%d\n",b);
break;
case 4:
for(i=0; i<m; i++)
if(strcmp(level,pr[i].edu_level)==0)
c++;
printf("高学历人数为:%d\n",c);
break;
case 5:
for(i=0; i<m; i++)
if(strcmp(post,pr[i].post)==0)
d++;
printf("高职称人数为:%d\n",d);
break;
default:
break;
}
printf("\n");
printf("\n按任意键继续……\n");
getchar();
getchar();
}
/*数据排序函数*/
void Det_sort(){
int i,j,n,m,s,sign=0;
P_tab temp; //定义结构体类型的交换变量
m=open();
printf("\n可排序选项:①年龄 ②来院时间\n");
printf("\n请输入您要排序的选项:");
scanf("%d",&n); //获取排序字段
if(n==1){ //起泡排序从小到大
for(j=0;j<m;j++){
for(i=0;i<m-j-1;i++){
if(pr[i].age>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<m;j++){
for(i=0;i<m-j-1;i++){
if((strcmp(pr[i].start_time,pr[i+1].start_time))>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.不足:因为本人水平有限,所以并没有使用动态数组和动态链表等更优的方案,面对输入数据较多时,还需修改程序。以及可能存在其他的问题和不足。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/34231.html