第17周 员工管理

第17周 员工管理/* 
2.	*Copyright(c)2015,烟台大学计算机学院 
3.	*All rights reserved 
4.	*文件名称:第17周 员工管理 
5.	*作者:杜亭亭 
6.	*完成日期:2015.12.07 
7.	*版号:v1.0 
8.	*问题描述:
9.	 
10.	*输入描述:员工的信息
11.	*输出描述: 如下图
12.	 
13.	*/  

/*main.c */
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NUM 40
#include "linklist.h"

//主函数
int main()
{
    char ch='y';
    linklist * head;
    head =(linklist *)malloc(sizeof(linklist));
    head->len =0;
    head->next=NULL;
//	loadAddMessage(head);
    printf("\t\t\t\t员工管理系统\n");
    printf("\t******************************************************\n");
    do
    {
        printf("\t\t\t\t操作菜单\n");
        printf("\t1.添加员工\t2.展示所有的员工信息\t3.查询员工信息\n");
        printf("\t4.删除员工\t5.修改员工信息      \t6.排序\n");
        printf("\t7.调用员工信息所有记录\n");
        printf("\t0.退出系统\n");
        printf("\t******************************************************\n");
        printf("\t请选择操作菜单(0-7): ");

        scanf("%c",&ch);
        getchar();
        switch(ch)
        {
        case '1':
            addMessage(head);
            break;
        case '2':
            showAllMessage(head);
            break;
        case '3':
            searchPeople(head);
            break;
        case '4':
            deletePeople(head);
            break;
        case '5':
            editMessage(head);
            break;

        case '6':
            sort(head);
            break;
        case '0':
            saveMessage(head);
            printf("\t保存成功!");
        case '7' :
            loadAddMessage(head);
            printf("所有员工记录调用成功\n");
        }
    }
    while(ch!='0');
    getchar();
    return 0;
}
/* linklist.c */
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NUM 40
#include "linklist.h"

void doAddMessage(linklist	* s)
{
    int i=0,value1=0,j;
    char ch;
    printf("\t请输入员工的姓名(以#号键结束):");
    scanf("%c",&ch);
    while(ch!='#')
    {
        s->people.name[i]=ch;
        i++;
        scanf("%c",&ch);
    }
    for(j=i; j<40; j++)
    {
        s->people.name[j]='\0';
    }
    getchar();
    printf("\t请输入员工的年龄:");
    scanf("%d",&value1);
    s->people.age=value1;

    getchar();
    printf("\t请输入员工的职位(以#号键结束):");
    i=0;
    scanf("%c",&ch);
    while(ch!='#')
    {
        s->people.job[i]=ch;
        i++;
        scanf("%c",&ch);
    }
    for(j=i; j<40; j++)
    {
        s->people.job[j]='\0';
    }

    getchar();
    printf("\t请输入员工的工龄: ");
    scanf("%d",&value1);
    s->people.workTime=value1;
}

//添加员工信息
void addMessage(linklist * head)
{
    char ch;
    //int i=0;//,value1;
    linklist * s,* p;
    s=(linklist *)malloc(sizeof(linklist));
    s->people.num=head->len+1;                      // 开辟空间   S
    printf("\n\t员工的编号为:%d\n",s->people.num);
    doAddMessage(s);                                // 调用函数赋值s
    p=head;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    s->next=p->next;   //单链表插入节点
    p->next=s;
    head->len=head->len +1;
    getchar();

    printf("\t是否继续添加(是、否/y、n):");
    scanf("%c",&ch);
    getchar();
    if(ch=='y'||ch=='Y')
    {
        addMessage(head);   //递归调用
        getchar();
    }
}

//展示所有员工的信息
void showAllMessage(linklist * head)
{
    linklist * p;
    p=head->next;
    printf("\t编号      姓名               年龄       职位              工龄\n");
    while(p!=NULL)
    {
        printf("\t%-10d%-20s%-10d%-20s%-10d",p->people.num,p->people.name,p->people.age,p->people.job,p->people.workTime);
        p=p->next;             // 单链表顺序输出
        printf("\n");
    }
    printf("\n");
}

//按编号查询员工信息
void searchPeopleByNum(linklist * head)
{
    int number,flag=0;
    linklist * p;
    printf("\t请输入你要查询的编号:");
    scanf("%d",&number);
    p=head->next;
    while(p!=NULL)       //单链表查找,直到为空或找到输出
    {
        if(p->people.num==number)
        {
            printf("\t编号      姓名               年龄       职位              工龄\n");
            printf("\t%-10d%-20s%-10d%-20s%-10d",p->people.num,p->people.name,p->people.age,p->people.job,p->people.workTime);
            printf("\n");
            flag=1;   //查找标志
            break;
        }
        else
        {
            p=p->next;
        }
    }
    if(flag==0)
    {
        printf("\t没有查到与你输入编号相匹配的员工信息!\n");
    }
}

//按照姓名查找员工信息
void searchPeopleByName(linklist * head)
{
    int j=0, i=0,flag=0;
    char a,ch[40];
    linklist * p;
    p=head->next;
    getchar();
    printf("\t请输入你要查询的姓名(以#号键结束):");
    scanf("%c",&a);
    while(a!='#')
    {
        ch[i]=a;
        i++;               //i记录输入需要查找的字符长度
        scanf("%c",&a);
    }
    while(p!=NULL)       //单链表查找,直到为空或找到输出
    {
        for(j=0; j<strlen(ch); j++)
        {
            if(p->people.name[j]!=ch[j])
                break;
        }
        if(i==j)     //字符长度相同时,查找成功
        {
            printf("\t编号      姓名               年龄       职位              工龄\n");
            printf("\t%-10d%-20s%-10d%-20s%-10d",p->people.num,p->people.name,p->people.age,p->people.job,p->people.workTime);
            printf("\n");
            flag=1;   //查找标志(等于1时成功)
            break;
        }
        else
            p=p->next;
    }
    if(flag==0)         //查找标志(等于0时不成功)
    {
        printf("\t没有查到与你输入姓名相匹配的员工信息!\n");
    }
}

//查询员工信息
void searchPeople(linklist * head)
{
    char ch='y';
    if(head->next==NULL)
    {
        printf("\t目前暂无存储任何人员信息,无法进行任何查询操作!\n");
    }
    else
    {

        printf("\t1.按编号查询。\n");
        printf("\t2.按姓名查询。\n");
        printf("\t3.退出查询界面。\n");
        printf("\t******************************************************\n");
        printf("\t请选择操作菜单(1-3): ");
        scanf("%c",&ch);
        switch(ch)
        {
        case '1':
            searchPeopleByNum(head);
            break;
        case '2':
            searchPeopleByName(head);
            break;
        case '3':
            break;
        }
    }
    getchar();
}
//根据编号删除员工信息
void deletePeopleByNum(linklist * head)
{
    int number,flag=0;
    linklist * p,* q;
    printf("\t请输入你要删除的编号:");
    scanf("%d",&number);
    p=head->next;
    q=head;
    while(p!=NULL)
    {
        if(p->people.num==number)
        {
            q->next=p->next;         //删除对应的节点
            free(p);
            flag=1;
            break;
        }
        else
        {
            q=q->next;      //节点到不到时指针只想下一个,Q在前,P在后
            p=p->next;
        }
    }
    if(flag==0)
    {
        printf("\t没有查到与你输入编号相匹配的员工信息!\n");
    }
    else
    {
        printf("\t删除成功!\n");
    }
}


//根据姓名删除 员工信息
void deletePeopleByName(linklist * head)
{
    int j=0, i=0,flag=0;
    char a,ch[40];
    linklist * p,*q;
    p=head->next;               //Q在前,P在后
    q=head;
    getchar();
    printf("\t请输入你要查询的姓名(以#号键结束):");
    scanf("%c",&a);
    while(a!='#')
    {
        ch[i]=a;
        i++;   //I记录字符长度
        scanf("%c",&a);
    }
    while(p!=NULL)        //单链表查找,直到为空或找到输出
    {
        for(j=0; j<strlen(ch); j++)
        {
            if(p->people.name[j]!=ch[j])
                break;
        }
        if(i==j)       //字符长度相同,删除节点
        {
            q->next=p->next;
            free(p);
            flag=1;
            break;
        }
        else
        {
            q=q->next;
            p=p->next;
        }
    }
    if(flag==0)
    {
        printf("\t没有查到与你输入姓名相匹配的员工信息!\n");
    }
    else
    {
        printf("\t删除成功!\n");
    }
}


//删除员工信息
void deletePeople(linklist * head)
{
    char ch='y';
    if(head->next==NULL)
    {
        printf("\t目前暂无存储任何人员信息,无法进行任何删除操作!\n");
    }
    else
    {

        printf("\t1.按编号删除。\n");
        printf("\t2.按姓名删除。\n");
        printf("\t3.退出删除界面。\n");
        printf("\t******************************************************\n");
        printf("\t请选择操作菜单(1-3): ");
        scanf("%c",&ch);
        switch(ch)
        {
        case '1':
            deletePeopleByNum(head);
            break;
        case '2':
            deletePeopleByName(head);
            break;
        case '3':
            break;
        }
    }
    getchar();
}
//执行修改某个字段的信息
void doEditSome(linklist * p)
{
    int i=0;
    //max=0,
    int value1=0,j;
    int flag=0;
    char str1[4],str2[40],ch;
    char a[]="姓名";
    char b[]="年龄";
    char c[]="职位";
    char d[]="工龄";
    getchar();
    printf("\t请输入你要修改的字段名称(以#号键结束):");
    scanf ("%c",&ch);
    while(ch!='#')    //输入要查找的字段名
    {
        str1[i]=ch;
        i++;
        scanf("%c",&ch);
    }

    for(i=0; i<strlen(a); i++)
    {
        if(a[i]==str1[i])  //相同字符
            flag=1;
        else                 //不同字符
        {
            flag=0;
            break;         //跳出循环
        }
    }
    if(flag==0)         //与第二个字段比配
    {
        for(i=0; i<strlen(b); i++)
        {
            if(b[i]==str1[i])
                flag=2;
            else
            {
                flag=0;
                break;
            }
        }
    }
    if(flag==0)          //与第三个字段比配
    {
        for(i=0; i<strlen(c); i++)
        {
            if(c[i]==str1[i])
                flag=3;
            else
            {
                flag=0;
                break;
            }
        }
    }
    if(flag==0)         //与第四个字段比配
    {
        for(i=0; i<strlen(d); i++)
        {
            if(d[i]==str1[i])
                flag=4;
            else
            {
                flag=0;
                break;
            }
        }
    }
    getchar();
    if(flag==0)     //比配都不成功
    {
        printf("\t没有找到您要修改的字段!\n");
    }
    else if(flag==1)                                       //比配都成功,输入相应的字段要改的内容
    {
        printf("\t请输入该字段的值(以#号键结束):");
        i=0;
        scanf ("%c",&ch);
        while(ch!='#')
        {
            str2[i]=ch;
            i++;
            scanf("%c",&ch);
        }
        for(j=i; j<40; j++)
        {
            str2[j]='\0';
        }
        for(i=0; i<40; i++)
        {
            p->people.name[i]=str2[i];
        }
    }
    else if(flag==2)
    {
        printf("\t请输入该字段的值:");
        scanf("%d",&value1);
        p->people.age=value1;
    }
    else if(flag==3)
    {
        printf("\t请输入该字段的值(以#号键结束):");
        i=0;
        scanf ("%c",&ch);
        while(ch!='#')
        {
            str2[i]=ch;
            i++;
            scanf("%c",&ch);
        }
        for(j=i; j<40; j++)
        {
            str2[j]='\0';
        }
        for(i=0; i<40; i++)
        {
            p->people.job[i]=str2[i];
        }
    }
    else
    {
        printf("\t请输入该字段的值:");
        scanf("%d",&value1);
        p->people.workTime=value1;
    }
}


//修改
void edit(linklist * head,char ch)
{
    int number,flag=0;
    linklist * p,* q;
    printf("\t请输入你要修改信息的编号:");
    scanf("%d",&number);
    p=head->next;
    q=head;
    while(p!=NULL)
    {
        if(p->people.num==number)
        {
            if(ch=='1')                 //修改整条记录
            {
                doAddMessage(p);
            }
            if(ch=='2')                   //修改部分
            {
                doEditSome(p);
            }

            flag=1;
            break;
        }
        else
        {
            q=q->next;
            p=p->next;
        }
    }
    if(flag==0)
    {
        printf("\t没有查到与你输入编号相匹配的员工信息!\n");
    }
    else
    {
        printf("\t修改成功!\n");
    }
}

//修改员工信息
void editMessage(linklist * head)
{
    char ch='y';
    if(head->next==NULL)
    {
        printf("\t目前暂无存储任何人员信息,无法进行任何删除操作!\n");
    }
    else
    {

        printf("\t1.修改整条记录。\n");
        printf("\t2.修改部分。\n");
        printf("\t3.退出修改界面。\n");
        printf("\t******************************************************\n");
        printf("\t请选择操作菜单(1-3): ");
        scanf("%c",&ch);
        switch(ch)
        {
        case '1':
            edit(head,ch);
            break;
        case '2':
            edit(head,ch);
            break;
        case '3':
            break;
        }
    }
    getchar();
}
//实现 三种条件的排序
void sortAll(linklist * head,char a)
{
    linklist * p,* q,*s;
    int flag=0;
    int i=0;
    for(i=0; i<head->len; i++)
    {
        flag=0;
        p=head;
        q=p->next;
        s=q->next;
        while(s!=NULL)
        {
            if((q->people.age < s->people.age)&&a=='1')
            {
                q->next=s->next;   //s 后新节点
                s->next=q;         //新节点赋值q
                p->next=s;         //  head后为S
                flag=1;
            }
            if((q->people.workTime < s->people.workTime)&&a=='2')
            {
                q->next=s->next;
                s->next=q;
                p->next=s;
                flag=1;
            }
            if((q->people.num > s->people.num)&&a=='3')
            {
                q->next=s->next;
                s->next=q;
                p->next=s;
                flag=1;
            }
            p=p->next;   // 顺序不变p q s,p指head
            q=p->next;
            s=q->next;
        }
        if(flag==0)
            break;
    }
    printf("\t排序完成,请继续操作!\n");
}


//单链表排序
void sort(linklist * head)
{
    char ch='y';
    if(head->next==NULL)
    {
        printf("\t目前暂无存储任何人员信息,无法进行任何排序操作!\n");
    }
    else if(head->next->next==NULL)
    {
        printf("\t只有一条数据无需进行排序!\n");
    }
    else
    {

        printf("\t1.按年龄排序。\n");
        printf("\t2.按工龄排序。\n");
        printf("\t3.恢复原顺序。\n");
        printf("\t4.退出排序界面。\n");
        printf("\t******************************************************\n");
        printf("\t请选择操作菜单(1-4): ");
        scanf("%c",&ch);
        switch(ch)
        {
        case '1':
            sortAll(head,ch);
            break;
        case '2':
            sortAll(head,ch);
            break;
        case '3':
            sortAll(head,ch);
            break;
        case '4':
            break;
        }
    }
    getchar();
}

//退出时保存将文件保存到文件中
void saveMessage(linklist * head)
{
    FILE * fp;
    linklist *p,*p0;
    fp=fopen("message.txt","w+");
    p=head;
    if(fp==NULL)
    {
        printf("\n\t文件保存失败!\n请重新启动本系统...\n");
        exit(0);
    }
    while(p!=NULL)
    {
        //将链表中的信息写入文件中
        if(fwrite(p,sizeof(linklist),1,fp)!=1)
        {
            printf("\n\t写入文件失败!\n请重新启动本系统!\n");
        }
        p0=p;
        p=p->next;
        free(p0);
    }
    head=NULL;
    fclose(fp);
}
//登录时加载信息
void loadAddMessage(linklist * head)
{
    FILE *fp;
    linklist *p1,*p2,*p3;
    int flag=0;
    fp=fopen("message.txt","r");
    p1=(linklist *)malloc(sizeof(linklist));
    fread(p1,sizeof(linklist),1,fp);
    p3 = p2=head;
    //读出信息,重新链入链表
    while(! feof(fp))
    {
        p1=(linklist *)malloc(sizeof(linklist));
        fread(p1,sizeof(linklist),1,fp);
        p2->next=p1;
        p3=p2;
        p2=p1;
        flag=1;
    }
    p3->next=NULL;
    if(p3->people.num < 1)
    {
        head->len=0;
        head->next=NULL;
    }
    else if(flag==1)
    {
        head->len=p3->people.num;
    }
    else
    {
        head->len=0;
    }
    free(p1);
    fclose(fp);
}


/* linklist.h */
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
//#include "linklist.h"
typedef struct{
	int num; //编号
	char name[MAX_NUM];//姓名
	int age; //年龄
	char job[MAX_NUM];//职位;
	int workTime;// 工龄
}People;

typedef struct node{
	People people;
	struct node * next;
	int len;//表示链表长度
}linklist;

//添加员工信息

void addMessage(linklist *head);
void doAddMessage(linklist	* s);
//展示所有员工的信息
void showAllMessage(linklist * head);

//按编号查询员工信息
void searchPeopleByNum(linklist * head);
//按照姓名查找员工信息
void searchPeopleByName(linklist * head);

//查询员工信息
void searchPeople(linklist * head);
//根据编号删除员工信息
void deletePeopleByNum(linklist * head);
//根据姓名删除 员工信息
void deletePeopleByName(linklist * head);
//删除员工信息
void deletePeople(linklist * head);
//执行修改某个字段的信息
void doEditSome(linklist * p);


//修改
void edit(linklist * head,char ch);
//修改员工信息
void editMessage(linklist * head);
//实现 三种条件的排序
void sortAll(linklist * head,char a);

//单链表排序
void sort(linklist * head);

//退出时保存将文件保存到文件中
void saveMessage(linklist * head);
//登录时加载信息
void loadAddMessage(linklist * head);

#endif // LINKLIST_H_INCLUDED

*运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值