该系统具有以下主要功能:
- 添加人员信息:在有空间的前提下,用户输入人员的工号、姓名、性别、联系电话和 QQ 号等信息,系统会自动检查编号的唯一性,确保不重复。
- 查找人员信息:提供按工号和姓名两种查找方式,找到后会显示相应人员的详细信息。
- 修改人员信息:可以按工号或姓名进行修改,修改时编号不能更改。
- 删除人员信息:同样支持按工号和姓名删除,删除前会进行确认。
- 统计人员数量:能给出当前公司人员的总数。
- 显示人员信息:可以展示全体人员的信息或指定单个人员的信息。
- 保存和读取文件:能将人员信息保存到指定文件,也能从文件中读取人员信息。
- 排序人员信息:提供插入排序和冒泡排序两种方式,可对人员按工号进行排序。
#include<stdio.h> #include<stdlib.h> //内存管理 #include<string.h> //字符串操作#define MaxSize 20 //数据元素结构 typedef struct { int no; //工号char name[20]; //姓名int sex; //性别char tel[14]; //联系电话char qq[12]; //QQ号 }ElemType; //顺序表结构 typedef struct {ElemType list[MaxSize];int length; }SeqList;void Edit(SeqList *L); //修改子菜单 void Delete(SeqList *L) ; //删除子菜单 void Search(SeqList *L); //查找子菜单 void Sort(SeqList *L); //排序子菜单/功能函数 void Add(SeqList *L); //添加人员信息 void PrintList(SeqList *L); //显示全体人员信息 void PrintList(SeqList *L,int i); //显示单个人员信息 void Total(SeqList *L); //统计人员数量void Edit_num(SeqList *L); //按编号修改 void Edit_name(SeqList *L); //按姓名修改 void Delete_num(SeqList *L); //按编号删除 void Delete_name(SeqList *L); //按姓名删除 void Save(SeqList *L); //存文件 void Read(SeqList *L); //读文件 void Search_name(SeqList *L); //按姓名查找 void Search_num(SeqList *L); //按编号查找 void InsertSort(SeqList *L); //折半插入排序 void BubbleSort(SeqList *L); //冒泡排序int main() {printf(" ### 欢迎进入人员管理系统 ###\n");//顺序表初始化//SeqList *L; ///L=(SeqList *)malloc(sizeof( SeqList)); //分配内存L->length=0;int choice=1;while(choice!=0){printf("ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");printf("| |\n");printf("|1.添加 2.查找 3.修改 4.统计 5.删除 6.显示 7.保存 8.读取 9.排序 0.返回|\n");printf("| |\n");printf("ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");printf("输入您操作的选项:");scanf("%d",&choice);switch(choice){case 1:Add(L); //添加人员信息break;case 2:Search(L);break; case 3:Edit(L);//修改break;case 4:Total(L); //人员数量统计break;case 5:Delete(L);break;case 6:PrintList(L); //显示所有人员信息break;case 7:Save(L);//保存break;case 8:Read(L); //读文件break;case 9:Sort(L);//排序break;case 0:free(L); //释放内存printf("退出成功!\n");break;default:printf("无此选项,请重试!\n");break;}}printf(" ooooo欢迎您使用本系统!ooooo\n");return 0; }void Add(SeqList *L) //添加人员 { if(L->length>=MaxSize) {printf("空间已满,不能添加!!!\n");return;}printf("正在添加人员......\n");printf("请输入数据(工号 姓名 性别(0或1) 联系电话 QQ号):\n");scanf("%d%s%d%s%s",&L->list[L->length].no,L->list[L->length].name , &L->list[L->length].sex , L->list[L->length].tel ,L->list[L->length].qq);//下面代码保证编号唯一性//for(int i=0;i<L->length;i++) {if(L->list[L->length].no==L->list[i].no){ printf("该编号已存在,添加失败!\n");return ;}}printf("添加成功!!!\n\n");L->length++; // 调整人员个数 }/***显示顺序表中数据***/ void PrintList(SeqList *L) { if (L->length==0) {printf("没有人员信息!\n");return;}int i;printf("学号 姓名 性别 电话 QQ号\n");for( i=0 ; i<L->length ; i++){ printf("%d\t%s\t",L->list[i].no,L->list[i].name ); if(L->list[i].sex)printf("男");else printf("女");printf("\t%s\t%6s\n", L->list[i].tel ,L->list[i].qq); } }void PrintList(SeqList *L,int i) //显示第i个人员信息 { if(i<0||i>L->length-1){printf("输出错误!\n");return;}printf("学号 姓名 性别 电话 QQ号\n");printf("%d\t%s\t",L->list[i].no,L->list[i].name ); if(L->list[i].sex)printf("男");else printf("女");printf("\t%s\t%6s\n", L->list[i].tel ,L->list[i].qq); }void Total(SeqList *L) //统计人员数目 {printf("公司人员总人数为:%d人\n",L->length); }修改功能/ / void Edit(SeqList *L) //修改子菜单 {if (L->length==0) {printf("没有人员信息!\n");return;}int choice=1; do{printf(" ooooo编辑ooooo\n");printf("|| ||\n");printf("|| 1 : 按工号 2 : 按姓名 0 :退出 ||\n");printf("|| ||\n");printf("oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");printf("请输入您的选择:");scanf("%d",&choice);switch(choice){case 1:Edit_num(L);//printf("按工号修改!\n");break;case 2:Edit_name(L);//printf("按姓名修改!\n");break;case 0:printf("您已安全退出子菜单!\n");break;default:printf("没有此选项,请重选!\n");break;}}while(choice!=0); }//按人员编号修改记录信息 void Edit_num(SeqList *L) {int x;printf("请输入要修改的人员的编号:");scanf("%d",&x);for(int i=0;i<L->length;i++){if(L->list[i].no==x){PrintList(L,i);printf("\n");printf("请输入数据(工号 姓名 性别(0或1) 联系电话 QQ号):\n");scanf("%d%s%d%s%s",&L->list[i].no,L->list[i].name , &L->list[i].sex , L->list[i].tel,L->list[i].qq);while(L->list[i].no!=x){printf("编号不能修改!");printf("请输入数据(工号 姓名 性别(0或1) 联系电话 QQ号):\n");scanf("%d%s%d%s%s",&L->list[i].no,L->list[i].name , &L->list[i].sex , L->list[i].tel,L->list[i].qq);}printf("修改成功!\n");PrintList(L,i);return;}}printf("该人员不存在!\n"); }//按姓名修改记录信息————需要处理重名情况 void Edit_name(SeqList *L) {char nam[20],c1;printf("请输入要编辑的人员的姓名:");scanf("%s",nam);for(int i=0;i<L->length;i++){if(strcmp(L->list[i].name,nam)==0){ int n=L->list[i].no;PrintList(L,i);printf("\n");printf("要修改这条记录吗?(是:y/Y,否:n/N):");fflush(stdin); scanf("%c",&c1);if(c1=='y'||c1=='Y') {printf("请输入数据(工号 姓名 性别(0或1) 联系电话 QQ号):\n");scanf("%d%s%d%s%s",&L->list[i].no,L->list[i].name , &L->list[i].sex , L->list[i].tel,L->list[i].qq);while(L->list[i].no!=n){printf("编号不能修改!");printf("请输入数据(工号 姓名 性别(0或1) 联系电话 QQ号):\n");scanf("%d%s%d%s%s",&L->list[i].no,L->list[i].name , &L->list[i].sex , L->list[i].tel,L->list[i].qq);}printf("修改成功!\n");PrintList(L,i);return ;}} } printf("该人员不存在!\n"); }删除功能/ / void Delete(SeqList *L) //删除子菜单 {if (L->length==0) {printf("没有人员信息!\n");return;}int choice; do{printf(" ooooo删除ooooo\n");printf("|| ||\n");printf("|| 1 : 按工号 2 : 按姓名 0 :退出 ||\n");printf("|| ||\n");printf("oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");printf("请输入您的选择:");scanf("%d",&choice);switch(choice){case 1:Delete_num(L);break;case 2:Delete_name(L);break;case 0:printf("您已安全退出删除功能!\n");break;default:printf("没有此选项,请重选!\n");break;}}while(choice!=0); }void Delete_num(SeqList *L) /按编号进行删除 { char c1;int x;printf("请输入要删除的技术人员的编号:");scanf("%d",&x);for(int i=0;i<L->length;i++){if(L->list[i].no==x){PrintList(L,i); break;}} if(i>=L->length){printf("无此技术人员!");return ;} printf("是否删除此项(是:y/Y,否:n/N):");fflush(stdin); scanf("%c",&c1);if(c1=='y'||c1=='Y'){for(int k=i;k<L->length-1;k++){L->list[k]=L->list[k+1]; //从i开始,后往前覆盖}printf("删除成功!\n");L->length--; //人数减一return ;}elseprintf("没有删除该技术人员!\n"); } void Delete_name(SeqList *L) /按姓名进行删除---有重名情况 { char c1;char nam[20];printf("请输入要删除的技术人员的姓名:");scanf("%s",nam);for(int i=0;i<L->length;i++){if(strcmp(L->list[i].name,nam)==0){ PrintList(L,i);printf("要删除这条记录吗?(是:y/Y,否:n/N):");fflush(stdin); scanf("%c",&c1);if(c1=='y'||c1=='Y') break;}} if(i>=L->length){printf("无此技术人员!");return ;} printf("再次确认删除该记录?(是:y/Y,否:n/N):");fflush(stdin); scanf("%c",&c1);if(c1=='y'||c1=='Y'){ for(int k=i;k<L->length-1;k++) //删除{L->list[k]=L->list[k+1];}printf("删除成功!\n");L->length--; //人数减一 return ;}elseprintf("没有删除该技术人员!\n"); } /void Save(SeqList *L) /存文件 {FILE *fp = NULL;fp = fopen("D:\\人员管理.txt", "w");if(!fp){ printf("文件打开出错\n");return;}for (int i=0;i<L->length;i++){fprintf(fp,"\n%d\t",L->list[i].no); //写进磁盘保存,以下同理fprintf(fp,"%s\t",L->list[i].name);fprintf(fp,"%d\t",L->list[i].sex);fprintf(fp,"%s\t",L->list[i].tel);fprintf(fp,"%s",L->list[i].qq);}printf("保存成功!\n");fclose(fp);}void Read(SeqList *L) /读文件 {FILE *fp = NULL;fp = fopen("D:\\人员管理.txt", "r");if(!fp){ printf("文件打开出错\n");return;}int i=0;while(!feof(fp)){fscanf(fp, "%d%s%d%s%s", &L->list[i].no,L->list[i].name,&L->list[i].sex,L->list[i].tel,L->list[i].qq);i++;}L->length=i;printf("读取成功!\n");fclose(fp); }/ void Search(SeqList *L) //查找子菜单 {if (L->length==0) {printf("没有人员信息!\n");return;}int choice;do{printf(" ooooo查找ooooo\n");printf("|| ||\n");printf("|| 1 : 按工号 2 : 按姓名 0 :退出 ||\n");printf("|| ||\n");printf("oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");printf("请输入您的选择:");scanf("%d",&choice);switch(choice){case 1:Search_num(L);break;case 2:Search_name(L);break;case 0:printf("您已安全退出查找功能!\n");break;default:printf("没有此选项,请重选!");break;}}while(choice!=0); }void Search_num(SeqList *L) //按编号进行查找 {int x;printf("请输入要查找的人员的编号:");scanf("%d",&x);for(int i=0;i<L->length;i++){if(L->list[i].no==x){printf("oooooooooooo找到这个人员了,其信息为:oooooooooooo\n"); PrintList(L,i); return;} } printf("该技术人员不存在!\n"); } void Search_name(SeqList *L) //按姓名进行查找 { int flag=0;char nam[20];printf("请输入要查找的人员的姓名:");scanf("%s",nam);for(int i=0;i<L->length;i++){if(strcmp(L->list[i].name,nam)==0){ if(flag) printf("oooooooooooo又找到了一个,其信息为:oooooooooooo\n");else printf("oooooooooooo 找到了,其信息为: oooooooooooo\n");PrintList(L,i); flag=1;} }if(!flag) printf("该人员不存在!\n"); }/// void Sort(SeqList *L) //排序子菜单 {if (L->length==0) {printf("没有人员信息!\n");return;}int choice;do{printf(" ooooo排序ooooo\n");printf("|| ||\n");printf("|| 1 : 插入排序 2 : 冒泡排序 0 :退出 ||\n");printf("|| ||\n");printf("oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");printf("请输入您的选择:");scanf("%d",&choice);switch(choice){case 1:InsertSort(L);break;case 2:BubbleSort(L);break;case 0:printf("您已安全退出排序功能!\n");break;default:printf("没有此选项,请重选!");break;}}while(choice!=0); }///折半插入排序算法/// void InsertSort(SeqList *L) { int i, j, low, high, mid ; ElemType temp;for (i=1; i<L->length; i++){ temp= L->list[i]; low=0 ; high=i-1 ; while (low<=high){ mid=(low+high)/2;if ( temp.no< L->list[mid].no) high=mid-1 ;else low=mid+1 ; } /* 查找插入位置 */for (j=i-1; j>=high+1; j--) L->list[j+1]=L->list[j]; L->list[high+1]=temp; /* 插入到相应位置 */}printf("排序完毕!\n");PrintList(L); } //冒泡排序/// void BubbleSort(SeqList *L) { int i,j,over;ElemType p;for(i=0;i<L->length-1;i++){over=1;for(j=1;j<L->length-i;j++){if(L->list[j].no<L->list[j-1].no){ p=L->list[j];L->list[j]=L->list[j-1];L->list[j-1]=p;over=0;}}if(over) break;}printf("排序完毕!\n");PrintList(L); }