该系统具有以下主要功能:
- 添加人员信息:在有空间的前提下,用户输入人员的工号、姓名、性别、联系电话和 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 ; } else printf("没有删除该技术人员!\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 ; } else printf("没有删除该技术人员!\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); }