【员工管理系统】
问题描述:每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统能够完成员工信息的查询、更新、插入、删除、排序等功能。
基本要求:排序:按不同关键字,对所有员工的信息进行排序;查询:按特定条件查找员工;更新,按编号对某个员工的某项信息进行修改;插入,加入新员工的信息;删除,按编号删除已离职的员工的信息。
选作内容:实现图形用户界面。
通过链表实现
数据结构:
struct workers
{
char name[15];//姓名
char department[18];//单位
char gender;//性别
unsigned int age;//年龄
unsigned long telephone;//电话
unsigned long wage;//工资
unsigned long num;//职工号
struct workers *next;
};
操作实现:
/*插入职工信息,通过链表实现 */
/*具体实现职工信息的插入*/
/*对职工信息的删除操作*/
/*修改操作*/
/*实现对员工信息的查找*/
/*排序*/
/* 输出员工信息 */
/* 显示职工工资情况 计算平均工资 */
#include
#include
#include
#include
using namespace std;
struct workers
{
char name[15];//姓名
char department[18];//单位
char gender;//性别
unsigned int age;//年龄
unsigned long long telephone;//电话
unsigned long wage;//工资
unsigned long num;//职工号
struct workers *next;
char xueli[20];//学历
char zhiwu[20];//职务
char zhuzhi[20];//住址
workers operator=(workers &b)
{
strcpy(name,b.name);
strcpy(department,b.department);
strcpy(xueli,b.xueli);
strcpy(zhiwu,b.zhiwu);
strcpy(zhuzhi,b.zhuzhi);
age=b.age;
num=b.num;
wage=b.wage;
gender=b.gender;
telephone=b.telephone;
}
};
workers *creat_list(workers *head,int n)//创建一个长度为n的链表
{
workers *p,*q;
int i;
q=head;
for(i=0; inext=p;
q=p;
}
}
p->next=NULL;
return head;//返回头指针,这样就可以对链表进行操作
}
void output(workers *head)//输出函数,从链表头部输到尾部
{
workers *p=head;
if(head->next==NULL)
{printf("链表为空!\n");return;}
else
{
cout<<"现存员工信息为:\n";
printf("姓名 单位 性别 年龄 电话");
printf(" 工资 职工号 学历 职务 住址\n");
while(1)
{ p=p->next;
printf("%-15s ",p->name);
printf("%-20s ",p->department);
printf(" %c ",p->gender);
printf("%-5d ",p->age);
printf("%-13lld ",p->telephone);
printf("%-6ld ",p->wage);
printf("%-12ld ",p->num);
printf("%-15s ",p->xueli);
printf("%-15s ",p->zhiwu);
printf("%-15s ",p->zhuzhi);
printf("\n");
if(p->next==NULL)
break;
}
}
}
void input(workers *head,int n)//输入员工信息
{
workers *p=head->next;
while(n>0)
{
cout<<"\n输入员工姓名: ";cin>>p->name;
cout<<"输入员工单位: ";cin>>p->department;
cout<<"输入员工职务: ";cin>>p->zhiwu;
cout<<"输入员工性别: ";cin>>p->gender;
cout<<"输入员工年龄: ";cin>>p->age;
cout<<"输入员工电话: ";cin>>p->telephone;
cout<<"输入员工工资: ";cin>>p->wage;
cout<<"输入员工职工号: ";cin>>p->num;
cout<<"输入员工学历: ";cin>>p->xueli;
cout<<"输入员工住址: ";cin>>p->zhuzhi;
//system("pause");
cout<next;
n--;
}
}
workers *shanchu(workers *head,unsigned long num)//按照职工号删除
{
workers temp;
workers *p=head->next,*q,*ans=head;
if(p->num==num)
head->next=p->next;
else
for(p=head->next;p->next!=NULL;p=p->next)
{
if(p->next->num==num)
{
q=p->next->next;
p->next=q;
break;
}
}
cout<<"删除成功\n";
return ans;
}
void Sortbyage(workers *head)//排序函数,年龄升序
{
workers temp;
workers *p,*q,*max;
for(p=head->next;p->next!=NULL;p=p->next)
{
max=p;
for(q=p->next;q!=NULL;q=q->next)
if(q->age< max->age)
max=q;
if(max!=p) //交换结点的数据域内容,指针内容没变。
{
temp=*p;
*p=*max;
*max=temp;
}
}
}
void SortbyWage(workers *head)//排序函数,工资升序
{
workers temp;
workers *p,*q,*max;
for(p=head->next;p->next!=NULL;p=p->next)
{
max=p;
for(q=p->next;q!=NULL;q=q->next)
if(q->wage wage)
max=q;
if(max!=p) //交换结点的数据域内容,指针内容没变。
{
temp=*p;
*p=*max;
*max=temp;
}
}
}
void SortbyNum(workers *head)//排序函数,工号升序
{
workers temp;
workers *p,*q,*max;
for(p=head->next;p->next!=NULL;p=p->next)
{
max=p;
for(q=p->next;q!=NULL;q=q->next)
if(q->num< max->num)
max=q;
if(max!=p) //交换结点的数据域内容,指针内容没变。
{
temp=*p;
*p=*max;
*max=temp;
}
}
}
void SearchbyNum(workers *head,unsigned long num)//按职工号查询,职工号唯一
{
workers *p=head;
int f=0;
while(1)
{ p=p->next;
if(p->num==num)
{ f=1;
printf("%-15s ",p->name);
printf("%-20s ",p->department);
printf(" %c ",p->gender);
printf("%d ",p->age);
printf("%lld ",p->telephone);
printf("%ld ",p->wage);
printf("%ld ",p->num);
printf("%-15s ",p->xueli);
printf("%-15s ",p->zhiwu);
printf("%-15s ",p->zhuzhi);
printf("\n");break;}
if(p->next==NULL)
break;
}if(f==0)cout<<"查无此人\n";
}
bool check(workers *head,unsigned long num)
{
workers *p=head;
while(1)
{ p=p->next;
if(p->num==num)
return true;
if(p->next==NULL)
break;
}
return false;
}
void SearchbyName(workers *head,char name[20])//按名字查询,可查重名的
{
workers *p=head;
int f=0;
while(1)
{ p=p->next;
if(strcmp(p->name,name)==0)
{ f=1;
printf("%-15s ",p->name);
printf("%-20s ",p->department);
printf(" %c ",p->gender);
printf("%d ",p->age);
printf("%lld ",p->telephone);
printf("%ld ",p->wage);
printf("%ld ",p->num);
printf("%-15s ",p->xueli);
printf("%-15s ",p->zhiwu);
printf("%-15s ",p->zhuzhi);
printf("\n");}
if(p->next==NULL)
break;
}
if(f==0)cout<<"查无此人\n";
}
void charu(workers *head)
{
workers *p=(workers *)malloc(sizeof(workers));
workers *q=head->next;
head->next=p;
p->next=q;
cout<<"\n输入员工姓名: ";cin>>p->name;
cout<<"输入员工单位: ";cin>>p->department;
cout<<"输入员工职务: ";cin>>p->zhiwu;
cout<<"输入员工性别: ";cin>>p->gender;
cout<<"输入员工年龄: ";cin>>p->age;
cout<<"输入员工电话: ";cin>>p->telephone;
cout<<"输入员工工资: ";cin>>p->wage;
cout<<"输入员工职工号: ";cin>>p->num;
cout<<"输入员工学历: ";cin>>p->xueli;
cout<<"输入员工住址: ";cin>>p->zhuzhi;
cout<<"插入完成\n";
}
void xiugai(workers *head,unsigned long num)
{
SearchbyNum(head,num);
shanchu(head,num);
charu(head);
}
void title()
{
printf("*****************员工管理系统********************\n");
printf("* *\n");
printf("* 功能说明: *\n");
printf("* 按下 0 输出员工信息 *\n");
printf("* 按下 1 新建一个链表存储员工信息 *\n");
printf("* 按下 2 按照职工号查询员工信息 *\n");
printf("* 按下 3 按照 姓名 查询员工信息 *\n");
printf("* 按下 4 按照职工号删除员工信息 *\n");
printf("* 按下 5 按照职工号对员工信息进行排序 *\n");
printf("* 按下 6 按照 年龄 对员工信息进行排序 *\n");
printf("* 按下 7 按照 工资 对员工信息进行排序 *\n");
printf("* 按下 8 输入工号可对员工信息进行修改 *\n");
printf("* 按下 9 可新增一个员工的信息 *\n");
printf("* 按下 10 退出系统 *\n");
printf("* *\n");
printf("*************************************************\n");
}
void solve()
{
workers *head=(workers *)malloc(sizeof(workers));
head->next=NULL;
int m;
while(1)
{
title();
int n;
cin>>n;
int flag=0;
switch(n)
{
case 0:output(head);break;
case 1:cout<<"请输入要存储的员工信息的个数\n";cin>>m;creat_list(head,m);input(head,m);break;
case 2:cout<<"请输入要查询的工号\n";int num;cin>>num;SearchbyNum(head,num);break;
case 3:cout<<"请输入要查询的姓名\n";char name[20];cin>>name;SearchbyName(head,name);break;
case 4:cout<<"请输入要删除的职工号\n";unsigned long hao;cin>>hao;if(check(head,hao))shanchu(head,hao);else cout<<"查无此人\n";break;
case 5:cout<<"按照职工号对员工信息进行排序后结果如下:\n";SortbyNum(head);output(head);break;
case 6:cout<<"按照 年龄 对员工信息进行排序后结果如下:\n";Sortbyage(head);output(head);break;
case 7:cout<<"按照 工资 对员工信息进行排序后结果如下:\n";SortbyWage(head);output(head);break;
case 8:cout<<"请输入要修改信息的员工的职工号\n";int aaa;cin>>aaa;xiugai(head,aaa);break;
case 9:cout<<"新增一个员工信息\n";charu(head);break;
case 10:flag=1;break;
default: cout<<"输入有误,重新输入\n";
}
if(flag==1)break;
}
}
int main()
{
solve();
return 0;
}
测试数据:
5
zhangsan
jiaowuchu
zhuzhen
m
39
18846795237
5000
11101
shuoshi
jiashuqu#1*1
lisi
bangongshi
zhiyuan
f
32
18846789454
4500
11505
benke
jiashuqu#2*8
wangwu
yanjiushi
caozuoyuan
f
28
18867887854
4750
11809
benke
jiashuqu#3*5
zhaoliu
baoweichu
baoan
m
42
18564973854
3750
11209
gaozhong
jiashuqu#7*4
zhangsan
jiaowuchu
chuzhang
m
45
13345671238
6600
11001
yanjiusheng
jiashuqu#4*3