管理系统"/>
数据结构实训——员工管理系统
1 课题描述
每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统能够完成员工信息的查询、更新、插入、删除、排序等功能。
2 问题分析和任务定义
(1) 排序:按不同关键字,对所有员工的信息进行排序。
(2) 查询:按特定条件查找员工。
(3) 更新:按编号对某个员工的某项信息进行修改。
(4) 插入:加入新员工的信息。
(5) 删除:按编号删除已离职的员工的信息。
3 逻辑设计
1) 数据类型:
对员工的信息进行分析,因为要可以根据工号进行排序,因而将工号设置为整数型,而姓名、性别、出生年月、学历、职务、电话、住址这些内容设置为字符串类型。并且还要设置一个整数型遍历num来存储此时含有的记录数。
typedef struct
{
int id; //编号
char name[20]; //姓名
char sex[20]; //性别
char born[20]; //出生年月
char edu[20]; //学历
char job[40]; //职务
char tel[20]; //电话
char addr[50]; //住址
} STAFF;
STAFF s[MAX];
int num;
2)抽象数据类型:
ADT Staff {
数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯一标识数据元素的关键字。
数据关系R:数据元素同属一个集合。
input()
操作结果:输入员工信息。
display()
操作结果:浏览员工记录。
my_search()
操作结果:查找员工记录。
my_delete()
操作结果:删除员工记录函数
my_insert()
操作结果:添加员工记录
update()
操作结果:修改员工记录
my_sort()
操作结果:对员工排序
}ADT Staff
3)模块功能:
功能上主要有录入记录,查找记录,增加记录,删除记录,更改记录,对记录排序,显示所有记录这七大模块。其中查找记录和删除记录这一模块既可以根据工号查找,也可以根据姓名查找,灵活方便。而更改记录这一模块则能够修改该员工记录的所有信息。同时对记录排序这一模块需要使用排序算法来实现。
4 详细设计
员工信息结构体:
const int MAX=1e3+10;
typedef struct
{
int id; //编号
char name[20]; //姓名
char sex[20]; //性别
char born[20]; //出生年月
char edu[20]; //学历
char job[40]; //职务
char tel[20]; //电话
char addr[50]; //住址
} STAFF;
STAFF s[MAX];
int num; //人数
<1>输入员工信息函数:void input()
输入多组员工记录,包括工号、姓名、性别、出生年月、学历、职务、电话、住址。
<2>浏览员工记录函数:void display()
打印所有员工的记录,工号、姓名、性别、出生年月、学历、职务、电话、住址
<3>查找员工函数:void my_search()
既可以按照员工的工号也可以按照员工的姓名来查找,然后打印该员工信息。
<4>删除员工记录函数:void dellete()
既可以按照员工的工号也可以按照员工的姓名来删除该员工记录。删除该条记录后num要-1,同时要将该记录后面的记录向前挪一位。
<5>添加员工记录函数:void my_insert()
插入一条新员工的记录,这条记录会添加在顺序表的表尾,同时num要+1。
<6>修改员工记录函数:void update()
先按照员工的姓名或者工号查找到该员工的记录,然后可以对该员工的所有信息都能够修改。
<7>对员工排序函数:void my_sort()
使用快速排序,对员工的编号进行排序。
5 程序编码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
const int MAX=1e3+10;
using namespace std;typedef struct
{int id; //编号char name[20]; //姓名char sex[20]; //性别char born[20]; //出生年月char edu[20]; //学历char job[40]; //职务char tel[20]; //电话char addr[50]; //住址
} STAFF;
STAFF s[MAX];
int num; //人数
int i,j;bool cmpa(STAFF a,STAFF b)
{return a.id<b.id;
}bool cmpb(STAFF a,STAFF b)
{return a.id>b.id;
}void vis()
{printf("\n\n");printf(" 功能列表\n");printf(" 1.录入员工信息\n 2.浏览员工信息\n");printf(" 3.排序员工信息\n 4.查询员工信息\n");printf(" 5.更新员工信息\n 6.插入员工信息\n");printf(" 7.删除员工信息\n 8.退出\n");printf(" 谢谢使用\n");printf("\n");return ;
}void input()
{printf("请输入需要创建信息的职工人数n:\n");scanf("%d",&num);for(i=0; i<num; i++){printf("请输入员工编号:");scanf("%d",&s[i].id);printf("请输入姓名:");cin>>s[i].name;printf("请输入性别:");cin>>s[i].sex;printf("请输入出生年月:");cin>>s[i].born;printf("请输入学历:");cin>>s[i].edu;printf("请输入职务:");cin>>s[i].job;printf("请输入电话:");cin>>s[i].tel;printf("请输入住址:");cin>>s[i].addr;printf("\n");}
}void display()
{printf(" 员工编号 姓名 性别 出生年月 学历 职务 电话 住址\n");for(i=0; i<num; i++){printf("\n%10d%10s%10s%10s%10s%20s%20s%20s\n",s[i].id,s[i].name,s[i].sex,s[i].born,s[i].edu,s[i].job,s[i].tel,s[i].addr);}return ;
}void my_sort()
{int t;while(1){printf("1.编号从小到大\n2.编号从大到小\n请选择:\n");scanf("%d",&t);if(t==1){sort(s,s+num,cmpa);break;}if(t==2){sort(s,s+num,cmpb);break;}printf("输入有误,请重新选择!\n\n");}printf("排序后的记录:\n");display();
}void my_search()
{int t;int tid;char tname[20];while(1){printf("1.按照编号查询员工信息\n2.按照姓名查找员工信息\n3.返回功能列表\n请选择:\n");scanf("%d",&t);if(t==1){printf("请输入要查询的员工工号:\n");scanf("%d",&tid);for(i=0; i<num; i++)if(s[i].id==tid){printf("\n 员工编号 姓名 性别 出生年月 学历 职务 电话 住址\n");printf("\n%10d%10s%10s%10s%10s%20s%20s%20s\n",s[i].id,s[i].name,s[i].sex,s[i].born,s[i].edu,s[i].job,s[i].tel,s[i].addr);break;}if(i==num){printf("查无此人!\n");continue;}elsebreak;}if(t==2){printf("请输入要查询的员工姓名:\n");cin>>tname;for(i=0; i<num; i++)if(strcmp(s[i].name,tname)==0){printf("\n 员工编号 姓名 性别 出生年月 学历 职务 电话 住址\n");printf("\n%10d%10s%10s%10s%10s%20s%20s%20s\n",s[i].id,s[i].name,s[i].sex,s[i].born,s[i].edu,s[i].job,s[i].tel,s[i].addr);break;}if(i==num){printf("查无此人!\n\n");continue;}elsebreak;}if(t==3)break;printf("输入有误,请重新选择!\n\n");}
}void s_change(int i)
{int t;while(1){printf("\n需要进行修改的选项\n 1.员工编号 2.姓名 3.性别 4.出生年月 5.学历 6.职务 7.电话 8.住址\n");printf("请输入你想修改的那一项序号:\n");scanf("%d",&t);if(t>8||t<1){printf("\n选择错误,请重新选择!\n");continue;}else{switch(t){case 1:printf("员工编号更改为:");scanf("%d",&s[i].id);printf("更新成功!!\n");break;case 2:printf("姓名改为: ");memset(s[i].name,0,sizeof(s[i].name));cin>>s[i].name;printf("更新成功!!\n");break;case 3:printf("性别改为: ");memset(s[i].sex,0,sizeof(s[i].sex));cin>>s[i].sex;printf("更新成功!!\n");break;case 4:printf("出生年月改为: ");memset(s[i].born,0,sizeof(s[i].born));cin>>s[i].born;printf("更新成功!!\n");break;case 5:printf("学历改为: ");memset(s[i].edu,0,sizeof(s[i].edu));cin>>s[i].edu;printf("更新成功!!\n");break;case 6:printf("职务改为: ");memset(s[i].job,0,sizeof(s[i].job));cin>>s[i].job;printf("更新成功!!\n");break;case 7:printf("电话改为: ");memset(s[i].tel,0,sizeof(s[i].tel));cin>>s[i].tel;printf("更新成功!!\n");break;case 8:printf("住址改为: ");memset(s[i].addr,0,sizeof(s[i].addr));cin>>s[i].addr;printf("更新成功!!\n");break;}break;}}printf("更新后此员工信息:");printf("\n 员工编号 姓名 性别 出生年月 学历 职务 电话 住址\n");printf("\n%10d%10s%10s%10s%10s%20s%20s%20s\n",s[i].id,s[i].name,s[i].sex,s[i].born,s[i].edu,s[i].job,s[i].tel,s[i].addr);
}void update()
{int t,tt;int tid;char tname[20];while(1){printf("1.按照编号更新员工信息\n2.按照姓名更新员工信息\n3.返回功能列表\n请选择:\n");scanf("%d",&t);if(t==1){printf("请输入要更新的员工工号:\n");scanf("%d",&tid);for(i=0; i<num; i++)if(s[i].id==tid){printf("找到此人,原始记录为:\n");printf("\n 员工编号 姓名 性别 出生年月 学历 职务 电话 住址\n");printf("\n%10d%10s%10s%10s%10s%20s%20s%20s\n",s[i].id,s[i].name,s[i].sex,s[i].born,s[i].edu,s[i].job,s[i].tel,s[i].addr);printf("确认修改此人信息请按1,放弃修改请按其他数字\n");scanf("%d",&tt);if(tt==1)s_change(i);break;}if(i==num){printf("查无此人!\n");continue;}elsebreak;}if(t==2){printf("请输入要更新的员工姓名:\n");cin>>tname;for(i=0; i<num; i++)if(strcmp(s[i].name,tname)==0){printf("找到此人,原始记录为:\n");printf("\n 员工编号 姓名 性别 出生年月 学历 职务 电话 住址\n");printf("\n%10d%10s%10s%10s%10s%20s%20s%20s\n",s[i].id,s[i].name,s[i].sex,s[i].born,s[i].edu,s[i].job,s[i].tel,s[i].addr);printf("确认修改此人信息请按1,放弃修改请按其他数字\n");scanf("%d",&tt);if(tt==1)s_change(i);break;}if(i==num){printf("查无此人!\n\n");continue;}elsebreak;}if(t==3)break;printf("输入有误,请重新选择!\n\n");}
}void my_insert()
{int t;printf("确认添加新的员工信息?\n");while(1){printf("1.添加\n2.返回功能列表\n");scanf("%d",&t);if(t==2)break;if(t==1){printf("请输入员工编号:");scanf("%d",&s[num].id);printf("请输入姓名:");cin>>s[num].name;printf("请输入性别:");cin>>s[num].sex;printf("请输入出生年月:");cin>>s[num].born;printf("请输入学历:");cin>>s[num].edu;printf("请输入职务:");cin>>s[num].job;printf("请输入电话:");cin>>s[num].tel;printf("请输入住址:");cin>>s[num].addr;printf("添加成功!\n");num++;printf("\n是否继续添加员工信息?\n");continue;}printf("输入有误,请重新选择!\n\n");}
}void my_delete()
{int t,tt,tnum=num;int tid;char tname[20];while(1){printf("1.按照编号删除员工信息\n2.按照姓名删除员工信息\n3.返回功能列表\n请选择:\n");scanf("%d",&t);if(t==1){printf("请输入要删除的员工编号:\n");scanf("%d",&tid);for(i=0; i<num; i++)if(s[i].id==tid){printf("找到此人,原始记录为:\n");printf("\n 员工编号 姓名 性别 出生年月 学历 职务 电话 住址\n");printf("\n%10d%10s%10s%10s%10s%20s%20s%20s\n",s[i].id,s[i].name,s[i].sex,s[i].born,s[i].edu,s[i].job,s[i].tel,s[i].addr);printf("确认删除请输入1,不再删除请输其他数字\n");scanf("%d",&tt);if(tt==1){for(j=i; j<num-1; j++){s[j].id=s[j+1].id;strcpy(s[j].name,s[j+1].name);strcpy(s[j].sex,s[j+1].sex);strcpy(s[j].born,s[j+1].born);strcpy(s[j].edu,s[j+1].edu);strcpy(s[j].job,s[j+1].job);strcpy(s[j].tel,s[j+1].tel);strcpy(s[j].addr,s[j+1].addr);}num--;printf("删除成功!!\n");}break;}if(i==tnum){printf("查无此人!\n\n");continue;}elsebreak;}if(t==2){printf("请输入要删除的员工姓名:\n");cin>>tname;for(i=0; i<num; i++)if(strcmp(s[i].name,tname)==0){printf("找到此人,原始记录为:\n");printf("\n 员工编号 姓名 性别 出生年月 学历 职务 电话 住址\n");printf("\n%10d%10s%10s%10s%10s%20s%20s%20s\n",s[i].id,s[i].name,s[i].sex,s[i].born,s[i].edu,s[i].job,s[i].tel,s[i].addr);printf("确认删除请输入1,不再删除请输其他数字\n");scanf("%d",&tt);if(tt==1){for(j=i; j<num-1; j++){s[j].id=s[j+1].id;strcpy(s[j].name,s[j+1].name);strcpy(s[j].sex,s[j+1].sex);strcpy(s[j].born,s[j+1].born);strcpy(s[j].edu,s[j+1].edu);strcpy(s[j].job,s[j+1].job);strcpy(s[j].tel,s[j+1].tel);strcpy(s[j].addr,s[j+1].addr);}num--;printf("删除成功!!\n");}break;}if(i==tnum){printf("查无此人!\n\n");continue;}elsebreak;}if(t==3)break;printf("输入有误,请重新选择!\n\n");}
}int main()
{int n;printf("\n\n!!欢迎进入员工管理系统!!");while(1){vis();printf("请选择你需要操作的步骤(1--8):\n");scanf("%d",&n);if(n>=1&&n<=8){switch(n){case 1:printf(" *****输入员工信息*****\n");printf("\n");input();break;case 2:printf(" *****浏览员工信息*****\n");printf("\n");display();break;case 3:printf(" *****按照编号对员工信息排序*****\n");printf("\n");my_sort();break;case 4:printf(" *****按编号或姓名查询员工信息*****\n");printf("\n");my_search();break;case 5:printf(" *****更新员工信息*****\n");printf("\n");update();break;case 6:printf(" *****添加员工信息*****\n");printf("\n");my_insert();break;case 7:printf(" *****删除员工信息*****\n");printf("\n");my_delete();break;default :return 0;}}else{printf("输入有误,请重新选择!\n");getchar();continue;}}return 0;
}
6 程序调试与测试
1)菜单目录:
2)输入员工信息:
3)显示全部员工信息:
4)查询员工信息:
按姓名和工号查找
5)删除员工信息:
删除后的所有数据:
6)修改员工信息:
7)员工信息排序:
按照员工的编号从小到大排序:
按照员工的编号从大到小排序:
7 结果分析
这里只有员工编号为整数型,其他的都是字符串类型,因而错误类型的输入会造成乱码和死循环的产生。该程序主要是基于结构体数组来实现排序和输出的,因而属于顺序表,遍历输出的时间复杂度是O(n),空间复杂度也是O(n)。同时在这里删除某一员工的记录后,需要将其后面的所有记录都要向前移动一位,会花费一些时间;而插入一条记录只需要早顺序表之后添加即可。排序所使用的快速排序时间复杂度是O(nlogn)~~O(n^2),空间复杂度是O(logn)~~O(n)。
更多推荐
数据结构实训——员工管理系统
发布评论