数据结构实训——员工管理系统

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;
            }
            else
                break;
        }
        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;
            }
            else
                break;
        }
        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;
            }
            else
                break;
        }
        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;
            }
            else
                break;
        }
        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;
            }
            else
                break;
        }
        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;
            }
            else
                break;
        }
        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)。

  • 31
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值