职工信息管理系统

来源:互联网 发布:淘宝查隐形降权 编辑:程序博客网 时间:2024/04/28 19:02

// 职工管理系统.cpp : Defines the entry point for the console application.

/*

 

题目一:   职工信息管理系统设计 

问题描述:试设计一职工信息管理系统,职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。

实现功能:1、系统以菜单方式工作?

2、职工信息录入功能(职工信息用文件保存)--输入?

3、职工信息浏览功能 --输出?

4、查询和排序功能:(至少一种查询方式)  --算法?

? 按工资查询

? 按学历查询等

5、职工信息删除、修改功能

点:结构体、数组、函数、文件等的应用

    明:系统可录入的职工最大数值为50,要求界面友好,易于操作

 

 

 

程序代码如下:

*/

 

// 职工信息管理.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"

#include "malloc.h"

#include "string.h"

int shouldsave=1;//用于职工信息的保存

 

struct worker

{

       char num[15];//职工号

 

       char name[15];//职工的姓名

 

       int age;//职工的年龄

 

       char graduate[15];//职工的学历

 

       int money;//职工的工资

 

       char address[15];//职工的住址

 

       char tele[15];//职工的电话

 

};

 

struct node

{

       struct worker data;

       struct node *next;//结构体指针

};

 

///////////////////////////////////////////////////主菜单////////////////////////////////////////////////////////

void menu()

{

       printf("/n/n/n");

       printf("*************************************欢迎光临***********************************/n");

       printf("/n/n");

       printf("/t/t 0  退出职工系统/n");

       printf("/t/t 1  录入职工信息/t/t  2 删除职工信息/n");

       printf("/t/t 3  查询职工信息/t/t  4 修改职工信息/n");

       printf("/t/t 5  保存职工信息/t/t  6 显示职工信息/n");

       printf("/n/n");

       printf("********************************************************************************/n");

       printf("                                                      电信10709    tianmo       /n");

    printf("                                                      时候: 200979        /n");

 

}

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void printstart()

{

       printf("--------------------------------------------------------------------------------/n");

}

 

void wrong()

{

       printf("/n======>提示:输入错误!/n");

}

 

void nofind()

{

       printf("/n=====>提示:没有找到相应的职工!/n");

}

 

void printc()//用于输出职工的相关中文信息

{

       printf("职工编号    职工姓名   职工年龄   职工学历  职工工资  职工住址      职工电话/n");

}

 

void printe(struct node *p)//用于输出职工信息

{

       printf("%-s/t%s/t %d/t%s    %d      %s   %s/n",p->data.num,p->data.name,p->data.age,p->data.graduate,p->data.money,p->data.address,p->data.tele);

}

 

////////////////////////////////////////////查找满足要求的节点////////////////////////////////////////////////////////////////

 

struct node *Locate(struct node *head,char findmess[],char nameornum[]) //该函数用于定位连表中符合要求的接点,并返回该指针

{

        struct node *r;

 

        if(strcmp(nameornum,"num")==0) // 按职工编号查询

              {

            r=head->next; //r链接在头指针里面

 

            while(r!=NULL)

                     {

                         if(strcmp(r->data.num,findmess)==0)

 

                         return r;//返回结点

 

                         r=r->next; //结点向后移动1

                     }

              }

        else if(strcmp(nameornum,"name")==0) //按职工姓名查询

              {

                         r=head->next; //r链接在头指针里面

 

                         while(r!=NULL)

                                           {

                                     if(strcmp(r->data.name,findmess)==0)

 

                                     return r; //返回结点

 

                                     r=r->next; //结点向后移动1

                                           }

              }

        return 0;

}

////////////////////////////////////////////////////录入职工信息/////////////////////////////////////////////////////////

 

void Add(struct node *head)

{

       struct node *p,*p1,*p2;

 

       char num[20];

 

       p1=head;//把头指针付给p1

 

       p2=p1->next;//p2连接在p1后面

 

       while(p1->next !=NULL)//p1放在最后

       {

              p1=p1->next; //结点向后移动一

       }

       while(1)//利用无穷循环

       {

              printf("/n");

 

              printf("请您输入职工号(0返回上一级菜单):");

 

              scanf("%s",num);

 

              if(strcmp(num,"0")==0)//技术性处理返回主菜单

              {

                     break;

              }

              while(p2)//利用循环在记录里面查找,看该职工号是否已经存在

              {

                     if(strcmp(p2->data.num,num)==0)

                     {

                            printf("/n");

 

                            printf("====>提示职工号为'%s'已经存在,若要修改,请选择'4'/n",num);

 

                            printf("/n");

 

                            printstart();//调用函数

 

                            printf("/n");

 

                            printc();//调用函数

 

                            printf("/n");

 

                            printe(p2);//调用函数

 

 

                            printstart();//调用函数

 

                            printf("/n");

 

                     }

 

                     p2=p2->next;//结点向后移动1

              }

 

              p=(struct node *)malloc(sizeof(struct node));//申请一个动态存储区域,它的大小为sizeof(struct node)

 

              strcpy(p->data.num,num);

 

              printf("请您输入职工的姓名:");

 

        scanf("%s",p->data.name); //注意:因为name是首地址,故不用加上'&'

 

        getchar(); //用于接收enter

 

        printf("请你输入职工的年龄:");

 

        scanf("%d",&p->data.age); //注意:因为age是整型数值,必须用上'&'

 

        getchar();  //用于接收enter

 

        printf("请你输入职工的学历:");

 

        scanf("%s",p->data.graduate); //注意:因为graduate是首地址,故不用加上'&'

 

        getchar();  //用于接收enter

 

        printf("请输入职工的工资:");

 

        scanf("%d",&p->data.money);

 

        getchar();  //用于接收enter

 

        printf("请输入职工的住址:");

 

        scanf("%s",p->data.address);//注意:因为address是首地址,故不用加上'&'

 

           getchar(); //用于接收enter

 

              printf("请输入职工的电话号码:");

 

              scanf("%s",p->data.tele);

 

        getchar(); //用于接收enter

 

           p->next =NULL;//p后面指空

 

              p1->next =p;//p连接在p1的后面

 

              p1=p;//p赋给p1

 

              shouldsave=1;//用于后面的保存

 

       }

}

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void  Qur(struct node *head) // 查询职工信息

{

     int sel;

 

     char findmess[20];

 

     struct node *p;

 

     if(head->next==NULL) //判断head后面是否连接有内容

        {

                  printf("/n=====>提示:没有职工信息可以查询!/n");

                

        }

 

     printf("/n=====>1按职工编号查找/n=====>2按职工姓名查找/n");

 

     scanf("%d",&sel);

 

     if(sel==1)//按职工编号查询

        {

                  printf("请你输入要查找的书籍的编号:");

 

                  scanf("%s",findmess);

 

                  p=Locate(head,findmess,"num"); //调用locate函数,并且返回指向要查找职工编号的指针

 

                  if(p)

                              {

                             printf("/t/t/t/t查找结果/n");

 

                             printstart(); //调用函数

 

                             printc();//调用函数

 

                             printe(p); //调用函数

 

                             printstart(); //调用函数

                              }

                  else

                         nofind();

        }

     else if(sel==2) //按职工姓名查询

        {

              printf("请你输入要查找的职工名字:");

 

              scanf("%s",findmess);

 

              p=Locate(head,findmess,"name"); //调用locate函数,并且返回指向要查找职工名字的指针

 

              if(p)

                       {

                          printf("/t/t/t/t查找结果/n");

 

                          printstart(); //调用函数

 

                          printc(); //调用函数

 

                          printe(p); //调用函数

 

                          printstart(); //调用函数

                       }

              else

                          nofind();

        }

     else

           wrong();

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void  Delete(struct node *head) //删除职工信息

{

          int sel;

 

          struct node *p1,*p2;

 

          char findmess[20];

 

         if(head->next==NULL) //判断head后面是否连接有内容

               {

                       printf("/n提示:没有职工信息可以删除!/n");

                    

               }

         printf("/n=====>1按职工编号删除/n=====>2按职工姓名删除/n");

 

         scanf("%d",&sel);

 

         if(sel==1)

               {

                        printf("请你输入要删除的职工编号:");

 

                        scanf("%s",findmess);

 

                        p1=Locate(head,findmess,"num"); //调用locate函数,并且返回指向要查找职工编号的指针

 

                        if(p1)

                                          {

                                     p2=head;

 

                                     while(p2->next!=p1) //利用循环找到要指向删除职工编号的指针p1

                                                                {

                                           p2=p2->next;

                                                                }

 

                                     p2->next=p1->next; //p1后面的一个指针连接在p2->next,从而删除了p1->data.num

 

                                     free(p1); //释放p1所占的内存

 

                                     printf("/n提示:该书籍已经成功删除!/n");

 

                                     shouldsave=1; //用于后面的保存

                                          }

                        else

                                          {

                                 nofind();

                                          }

               }

         else if(sel==2)

               {

                       printf("请你输入要删除的职工姓名:");

 

                       scanf("%s",findmess);

 

                       p1=Locate(head,findmess,"name"); //调用locate函数,并且返回指向要查找职工姓名的指针

 

                       if(p1)

                                      {

                                     p2=head;

 

                                     while(p2->next!=p1) //利用循环找到要指向删除的职工编号的指针p1

                                                                {

                                           p2=p2->next;

                                                                }

 

                                     p2->next=p1->next; //p1后面的一个指针连接在p2->next,从而删除了p1->data.name

 

                                     free(p1); //释放p1所占的内存

 

                                     printf("/n提示:该书籍已经成功删除!/n");

 

                                     shouldsave=1;//用于后面的保存

                                      }

                       else

                                      {

                                     nofind();

                                      }

               }

         else

                      

                      wrong();

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void  Modify(struct node *head) //职工信息的修改

{

           struct node *p;

 

            char findmess[20];

 

            if(head->next==NULL)

                     {

                             printf("/n=====>提示:没有资料可以修改!/n");

 

                     }

 

            printf("请你输入要修改的职工编号:");

 

            scanf("%s",findmess);

 

            p=Locate(head,findmess,"num"); //调用locate函数,并且返回指向要修改职工编号的指针

 

           if(p)

                 {

                                                  printf("请您输入新的职工编号:");

 

                                                  scanf("%s",p->data.num); //注意:因为num是首地址,故不用加上'&'

 

                                                  getchar(); //用于接收enter

 

                                                  printf("请您输入新的职工姓名:");

 

                                                  scanf("%s",p->data.name); //注意:因为name是首地址,故不用加上'&'

 

                                                  getchar(); //用于接收enter

 

                                                  printf("请您输入新的职工年龄:");

 

                                                  scanf("%d",&p->data.age); //注意:因为age是整型数值,必须用上'&'

 

                                                  getchar(); //用于接收enter

 

                                                  printf("请您输入新的职工学历:");

 

                                   scanf("%s",p->data.graduate);

 

                                                  getchar(); //用于接收enter

 

                                                  printf("请您输入新的职工工资:");

 

                                                  scanf("%d",&p->data.money);

 

                                                  printf("请您输入新的职工住址:");

 

                                                  scanf("%s",p->data.address);

 

                                                  printf("请您输入新的职工电话:");

 

                                scanf("%ld",p->data.tele);

 

                            printf("/n=====>提示:资料修改成功!/n");

 

                                                  shouldsave=1;

                 }

          else

                     nofind();

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void   Save(struct node *head) //保存职工的相关信息

{

          FILE* fp;

 

          struct node *p;

 

          int flag=1,count=0;

 

          fp=fopen("D://worker","wb"); //为输出打开一个二进制的文件

 

          if(fp==NULL)

                {

                    printf("/n=====>提示:重新打开文件时发生错误!/n");

 

                    exit(1); //注意:逃离函数,它在stdlib库里面

                }

 

          p=head->next; //p连接在head的后面

 

          while(p) //判断p是否为空,以便进行循环

                {

                     if(fwrite(p,sizeof(struct node),1,fp)==1) //p中的内容写到fp

                                    {

                                                                      p=p->next; //p向后移动一

 

                                                                   count++;//用于统计保存职工信息记录的数目

                                    }

                                    else

                                    {

                                                                      flag=0;

                                                                      break; //如果fwrite(p,sizeof(struct node),1,fp)返回值不是一,提前跳出循环

                                    }

                }

         if(flag==1)

               {

                               printf("/n=====>提示:文件保存成功.(%d条记录已经保存)./n",count);

                               shouldsave=0;

               }

         fclose(fp); //关闭fp文件

}

 

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void   Display(struct node *head) //用于显示保存的职工相关信息

{

             int count=0;

 

             struct node *p;

 

             p=head->next; //p连接在head的后面

 

             if(p==NULL)

                      {

                        printf("/n=====>提示:没有资料可以显示!/n");

 

                      }

             printf("/t/t/t/t显示结果/n");

 

             printstart();

 

             printc();

 

             printf("/n");

 

             while(p) //利用循环把职工的所有信息全部显示

                      {

                           printe(p);

 

                           p=p->next; //p向后移动一

                      }

                     printstart();

 

                     printf("/n");

 

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

int main(int argc, char* argv[])

{

       printf("/n/n/n/t/t/t/t职工信息管理系统/n");

      

       FILE  *fp;

 

       int count=0,n;

 

       char jian,ch;

 

       struct node *head,*p1,*p2;

 

       head=p1=(struct node *)malloc(sizeof(struct node));

 

       head->next=NULL;

 

       p1=head;

 

       if((fp=fopen("D://worker","rb"))==NULL)

       {

              printf("文件还不存在,是否新建?(Y/N):");

 

                     scanf("%c",&jian);

 

              if(jian=='Y'||jian=='y')

              {

                     fp=fopen("D://worker","wb");

              }

              else

              {

                     exit(0);

              }

       }

      

       while(!feof(fp))//判断文件是否全部读完

       {

                     p2=(struct node *)malloc(sizeof(struct node));

 

                     if(fread(p2,sizeof(struct node),1,fp))//把文件中的内容接入链表

                     /************************注意:是把读取的文件中的内容接入p2中,所以要借助p1p2记录下来************************/

                     {

                            p2->next=NULL;

 

                            p1->next=p2;

 

                            p1=p2;//关键的技术处理部分,否则会出现覆盖的问题

                           

                            count++;

                     }

 

             

       }

 

       fclose(fp);

 

       while(1)

       {

              menu();

 

              printf("请您选择:");

 

              scanf("%d",&n);

 

              if(n==0)

              {

                     getchar();

 

                  printf("/n====>提示:资料已改动,是否将改动保存到文件中?(y/n)/n");

 

                     scanf("%c",&ch);

 

                     if(ch=='y'||ch=='Y')

 

                  Save(head); //调用函数

 

                     printf("/n=====>提示:您已经推出系统 !/n");

 

                     break;

              }

 

                  switch(n)

                            {

                                   case 1:Add(head);break;

 

                                   case 2:Delete(head);break;

 

                                   case 3:Qur(head);break;

 

                                   case 4:Modify(head);break;

 

                                   case 5:Save(head);break;

 

                                   case 6:Display(head);break;

 

                                   default:wrong();break;

                            }

 

       }

    return 0;

}

原创粉丝点击