crazylinux 发表于 2011-10-3 09:36:11

自己写的一个员工管理系统

#include <stdio.h>
#include <string.h>
#include "emp.h"
int main(void)
{
    emp_first=emp_end=NULL;
    gsave=gfirst=0;
    checkfirst();
    login();
    readdata();/*从文件中读取员工信息到链表*/
    menu();
    return 0;
}
void login() /*检查密码*/
{
    int i,n=3;
    char pwd;
    do{
      printf("请输入进入系统的密码:");
      for(i=0;i<8 &&((pwd=getch())!=13);i++)
            putch('*');      
      pwd='\0';
      if(strcmp(pwd,password)) /*若密码错误 */
      {
            printf("\n密码错误,请重新输入!\n");
            system("cls");
            n--;
      }else break;
    }while(n>0);
    if(!n)
    {
       printf("非法用户,请关机!\n");
       getch();
       exit(1);
    }
}
void menu()/*菜单*/
{
    char choice;
    system("cls");   
    do{
      printf("\t员工管理系统\n");
      bound('_',30);      
      printf("\t1.输入员工信息\n");
      printf("\t2.查询员工信息\n");
      printf("\t3.显示员工信息\n");
      printf("\t4.修改员工信息\n");
      printf("\t5.删除员工信息\n");
      printf("\t6.统计员工信息\n");
      printf("\t7.重设系统密码\n");
      printf("\t0.退出系统\n");
      bound('_',30);
      printf("\n请选择菜单:");
      do{
            fflush(stdin);
            choice=getchar();
            system("cls");
            switch(choice)
            {
                case '1':      /*输入员工信息*/
                  addemp();
                  break;
                case '2':      /*查询员工信息*/
                  if(gfirst)
                  {
                        printf("系统中还没有员工信息,请先添加员工信息!\n");
                        getch();
                        break;
                  }                  
                  findemp();
                  break;
                case '3':       /*显示员工信息*/
                  if(gfirst)
                  {
                        printf("系统中还没有员工信息,请先添加员工信息!\n");
                        getch();
                        break;
                  }
                  listemp();
                  break;               
                case '4':      /*修改员工信息*/
                  if(gfirst)
                  {
                        printf("系统中还没有员工信息,请先添加员工信息!\n");
                        getch();
                        break;
                  }
                  modifyemp();
                  break;                              
                case '5':    /*删除员工信息*/
                  if(gfirst)
                  {
                        printf("系统中还没有员工信息,请先添加员工信息!\n");
                        getch();
                        break;
                  }
                  delemp();
                  break;            
                case '6':    /*统计员工信息*/
                  if(gfirst)
                  {
                        printf("系统中还没有员工信息,请先添加员工信息!\n");
                        getch();
                        break;
                  }
                  summaryemp();
                  break;            
                case '7':    /*重设系统密码*/
                  resetpwd();
                  break;                                                            
                case '0':    /*退出系统*/
                  savedata();
                  exit(0);
            }
      }while(choice<'0' || choice>'7');
      system("cls"); /*调用清屏函数*/
    }while(1);
}
void readdata(void)/*从文件中获取员工信息,创建链表*/
{
    FILE *fp;
    EMP *emp1;
    if((fp=fopen("emp.dat","rb"))==NULL) /*读方式打开文件*/
    {
      gfirst=1;
      return;
    }
    while(!feof(fp))/*读入文件中的数据,将其添加到链表中*/
    {
      emp1=(EMP *)malloc(sizeof(EMP));
      if(emp1==NULL)
      {
            printf("内存分败!\n");
            getch();
            return;
      }
      fread(emp1,sizeof(EMP),1,fp);
      if(feof(fp)) break;
      if(emp_first==NULL)
      {
            emp_first=emp1;
            emp_end=emp1;
      }else{
            emp_end->next=emp1;
            emp_end=emp1;
      }
      emp_end->next=NULL;
    }
    gfirst=0;
    fclose(fp);
}
void savedata()            /*将链表中的数据保存到文件*/
{
    FILE *fp;
    EMP *emp1;
    if(gsave==0) return ;
    if((fp=fopen("emp.dat","wb"))==NULL) /*写方式打开文件*/
    {
      printf("打开文件emp.dat出错!\n");
      getch();
      return;
    }
    emp1=emp_first;
    while(emp1)
    {
      fwrite(emp1,sizeof(EMP),1,fp);
      emp1=emp1->next;
    }
    gsave=0;            /*设置标志*/
    fclose(fp);
}
   
void addemp()/*输入员工信息*/
{
    FILE *fp;
    EMP *emp1;
    int i=0;
    char choice='y';
    if((fp=fopen("emp.dat","ab"))==NULL)/*追加模式打开*/
    {
      printf("打开文件emp.dat出错!\n");
      getch();
      return;
    }   
    do{
      i++;
      emp1=(EMP *)malloc(sizeof(EMP));
      if(emp1==NULL)
      {
            printf("内存分配失败,按任意键返回!\n");
            getch();
            return;
      }
      printf("输入第%d个员工的信息:\n",i);
      bound('_',20);
      printf("工号:");/*输入工号 */
      scanf("%d",&emp1->num);
      printf("职务:");/*输入职务 */
      scanf("%s",emp1->duty);
      printf("姓名:");/*输入姓名 */
      scanf("%s",emp1->name);
      printf("性别:");/*输入性别 */
      scanf("%s",emp1->sex);
      printf("年龄:"); /*年龄*/
      scanf("%d",emp1->age);
      printf("文化程度:");/*输入文化程度 */
      scanf("%s",&emp1->edu);
      printf("工资:");/*输入工资 */
      scanf("%d",&emp1->salary);
      printf("办公电话:");
      scanf("%s",emp1->tel_office);
      printf("家庭电话:");
      scanf("%s",emp1->tel_home);
      printf("移动电话:");
      scanf("%s",emp1->mobile);
      printf("QQ:");
      scanf("%s",emp1->qq);
      printf("地址:");
      scanf("%s",emp1->address);
      
      emp1->next=NULL;
      if(emp_first==NULL)
      {
            emp_first=emp1;
            emp_end=emp1;
      }else{      
            emp_end->next=emp1;
            emp_end=emp1;
      }
      fwrite(emp_end,sizeof(EMP),1,fp);
      gfirst=0;
      printf("\n");
      bound('_',20);
      printf("\n是否继续输入?(y/n)");
      fflush(stdin);
      choice=getchar();
      if(toupper(choice)!='Y')
      {
            fclose(fp);
            printf("\n输入完毕,任意键返回\n");
            getch();
            return;
      }
      system("cls");
    }while(1);
}
void listemp()/*显示员工信息 */
{
    EMP *emp1;
    printf("\n员工列表:\n");
    bound('_',25);
    emp1=emp_first;
    while(emp1)
    {
      printf("工号:%d\n",emp1->num);
      printf("姓名:%s\n",emp1->name);
      printf("职务:%s\n",emp1->duty);         
      printf("性别:%s\n",emp1->sex);
      printf("年龄:%d\n",emp1->age);
      printf("文化程度:%s\n",emp1->edu);
      printf("工资:%d\n",emp1->salary);
      printf("办公电话:%s\n",emp1->tel_office);
      printf("家庭电话:%s\n",emp1->tel_home);
      printf("移动电话:%s\n",emp1->mobile);
      printf("QQ号码:%s\n",emp1->qq);
      printf("住址:%s\n",emp1->address);
      bound('_',25);
      emp1=emp1->next;
    }
    printf("\n按任意键返回\n");
    getch();
    return;
}
void modifyemp()/*修改员工信息*/
{
    EMP *emp1;
    char name,*str;
    int choice;
    printf("\n输入要修改员工的姓名:");
    scanf("%s",&name);
    emp1=findname(name);                  
    displayemp(emp1,"姓名",name);
    if(emp1)
    {
      printf("\n选择要修改的项目:\n");
      bound('_',35);
      printf("1.修改职务       2.修改文化程度\n");
      printf("3.修改工资       4.修改办公电话\n");
      printf("5.修改家庭电话   6.修改移动电话\n");
      printf("7.修改QQ号码   8.修改住址\n");
      printf("0.返回\n");
      bound('_',35);
      printf("请选择:");
      do{
            fflush(stdin);
            choice=getchar();
            switch(choice)
            {
                case '1':
                  str=modi_field("职务",emp1->duty,10);
                  if(str!=NULL)
                  {
                        strcpy(emp1->duty,str);
                        free(str);
                  }
                  break;
                case '2':
                  str=modi_field("文化程度",emp1->edu,10);
                  if(str!=NULL)
                  {
                        strcpy(emp1->edu,str);
                        free(str);
                  }
                  break;
                case '3':
                  emp1->salary=modi_salary(emp1->salary);
                  break;
                case '4':
                  str=modi_field("办公电话", emp1->tel_office,13);
                  if(str!=NULL)
                  {
                        strcpy(emp1->tel_office,str);
                        free(str);
                  }
                  break;                  
                case '5':
                  str=modi_field("家庭电话", emp1->tel_home,13);
                  if(str!=NULL)
                  {
                        strcpy(emp1->tel_home,str);
                        free(str);
                  }
                  break;                  
                case '6':
                  str=modi_field("移动电话", emp1->mobile,12);
                  if(str!=NULL)
                  {
                        strcpy(emp1->mobile,str);
                        free(str);
                  }
                  break;
                case '7':
                  str=modi_field("QQ号码", emp1->qq,10);
                  if(str!=NULL)
                  {
                        strcpy(emp1->qq,str);
                        free(str);
                  }
                  break;
                case '8':
                  str=modi_field("住址", emp1->address,30);
                  if(str!=NULL)
                  {
                        strcpy(emp1->address,str);
                        free(str);
                  }
                  break;                                                                  
                case '0':
                  return;
            }
      }while(choice<'0' || choice>'8');
      gsave=1;
      savedata();
      printf("\n修改完成,按任意键返回。\n");
      getch();
    }
    return;
}
int modi_salary(int s)/*修改工资*/
{
    int salary;
    printf("原工资:%d\n",s);
    printf("新工资:");
    scanf("%d",&salary);
    return(salary);
}
char *modi_field(char *field,char *s,int n) /*通用文字字段修改函数*/
{
    char *str;
    str=malloc(sizeof(char)*n);
    if(str==NULL)
    {
      printf("内存分配失败,按任意键返回!\n");
      getch();
      return NULL;
    }
    printf("原%s:%s\n",field,s);
    printf("修改为(不超过%d个字符):",n);
    scanf("%s",str);
    return str;
}
void delemp()/*删除员工信息 */
{
    int i=0,find=0;
    EMP *emp1,*emp2;
    char name,choice;
    system("cls");
    printf("\n输入要删除员工的姓名:");/*输入员工姓名 */
    scanf("%s",name);
    emp1=emp_first;
    emp2=emp1;
    while(emp1)
    {
      if(strcmp(emp1->name,name)==0)
      {
            find=1;
            system("cls");
            printf("员工:%s 信息如下:\n",emp1->name);
            bound('_',25);
            printf("工号:%d\n",emp1->num);
            printf("职务:%s\n",emp1->duty);
            printf("姓名:%s\n",emp1->name);
            printf("性别:%s\n",emp1->sex);
            printf("年龄:%d\n",emp1->age);
            printf("文化程度:%s\n",emp1->edu);
            printf("工资:%d\n",emp1->salary);
            printf("办公电话:%s\n",emp1->tel_office);
            printf("家庭电话:%s\n",emp1->tel_home);
            printf("移动电话:%s\n",emp1->mobile);
            printf("QQ号码:%s\n",emp1->qq);
            printf("住址:%s\n",emp1->address);
            bound('_',25);
            printf("真的要删除该员工的信息吗?(y/n)");
            fflush(stdin);
            choice=getchar();
            if(choice!='y' && choice!='Y') return;
            if(emp1==emp_first) emp_first=emp1->next ;
            else emp2->next=emp1->next;
            free(emp1);
            gsave=1;
            savedata(); /*保存数据*/
            return;
      }else{
            emp2=emp1;
            emp1=emp1->next;
      }   
    }
    if(!find)
    {
      bound('_',30);
      printf("未找到姓名为:%s 的信息!\n",name);
      getch();
    }
    return;
}
void findemp()/*查询员工信息*/
{
    int choice,ret=0,num;
    char str;
    EMP *emp1;
    system("cls");
    do{
      printf("\t查询员工信息\n");
      bound('_',25);      
      printf("\t1.按姓名查询\n");
      printf("\t2.按工号查询\n");
      printf("\t3.按电话查询\n");
      printf("\t4.按QQ号查询\n");
      printf("\t0.返回主菜单\n");
      bound('_',25);
      printf("\n请选择菜单:");
      do{
            fflush(stdin);
            choice=getchar();
            system("cls");
            switch(choice)
            {
                case '1':      /*按姓名查询*/
                  printf("\n输入要查询员工的姓名:");
                  scanf("%s",str);
                  emp1=findname(str);                  
                  displayemp(emp1,"姓名",str);
                  getch();
                  break;
                case '2':      /*按工号查询*/
                  printf("\n输入要查询员工的工号:");
                  scanf("%d",&num);
                  emp1=findnum(num);
                  itoa(num,str,10);                  
                  displayemp(emp1,"工号",str);
                  getch();
                  break;
                case '3':       /*按电话查询*/
                  printf("\n输入要查询员工的电话:");
                  scanf("%s",str);
                  emp1=findtelephone(str);                  
                  displayemp(emp1,"电话",str);
                  getch();
                  break;               
                case '4':      /*按QQ号码查询*/
                  printf("\n输入要查询员工的QQ号码:");
                  scanf("%s",str);
                  emp1=findqq(str);                  
                  displayemp(emp1,"QQ号码",str);
                  getch();
                  break;
                case '0':    /*返回主菜单*/
                     ret=1;
                     break;
            }
      }while(choice<'0' || choice>'4');         
      system("cls");
      if(ret) break;
    }while(1);   
}
EMP *findname(char *name) /*按姓名在链表中查找*/
{
    EMP *emp1;
    emp1=emp_first;
    while(emp1)
    {
      if(strcmp(name,emp1->name)==0) return emp1;
      emp1=emp1->next;
    }
    return NULL;
}
EMP *findnum(int num)/*按工号查询*/
{
    EMP *emp1;
    emp1=emp_first;
    while(emp1)
    {
      if(num==emp1->num) return emp1;
      emp1=emp1->next;
    }
    return NULL;
}
EMP *findtelephone(char *name)/*按电话查询*/
{
    EMP *emp1;
    emp1=emp_first;
    while(emp1)
    {
      if((strcmp(name,emp1->tel_office)==0) ||
            (strcmp(name,emp1->tel_home)==0) ||
            (strcmp(name,emp1->mobile)==0))
            return emp1;
      emp1=emp1->next;
    }
    return NULL;
}
EMP *findqq(char *name)/*按QQ号码查询*/
{
    EMP *emp1;
    emp1=emp_first;
    while(emp1)
    {
      if(strcmp(name,emp1->qq)==0) return emp1;
      emp1=emp1->next;
    }
    return NULL;
}
void displayemp(EMP *emp,char *field,char *name) /*显示查找员工信息*/
{
    if(emp)
    {                     
      printf("\n%s:%s 信息如下:\n",field,name);
      bound('_',20);
      printf("工号:%d\n",emp->num);
      printf("职务:%s\n",emp->duty);
      printf("姓名:%s\n",emp->name);
      printf("性别:%s\n",emp->sex);
      printf("年龄:%d\n",emp->age);
      printf("文化程度:%s\n",emp->edu);
      printf("工资:%d\n",emp->salary);
      printf("办公电话:%s\n",emp->tel_office);
      printf("家庭电话:%s\n",emp->tel_home);
      printf("移动电话:%s\n",emp->mobile);
      printf("QQ号码:%s\n",emp->qq);
      printf("住址:%s\n",emp->address);
      bound('_',20);
    }else{
      bound('_',40);
      printf("系统中没有%s为:%s 的员工信息!\n",field,name);      
    }
    return;
}

void summaryemp()/*员工统计*/
{
    EMP *emp1;
    int sum=0,num=0,man=0,woman=0;
    emp1=emp_first;
    while(emp1)
    {
      num++;/*员工人数*/
      sum+=emp1->salary;
      if(strcmp(emp1->sex,"男")==0) man++;
      else woman++;
      emp1=emp1->next;
    }
    printf("\n员工统计信息:\n");
    bound('_',20);
    printf("总人数:%d\n",num);
    printf("男:%d\n",man);
    printf("女:%d\n",woman);
    printf("工资总额:%d\n",sum);
    bound('_',20);
    printf("按任意键返回!\n");
    getch();
    return;
}

crazylinux 发表于 2011-10-3 09:36:51

void resetpwd()/*重设密码*/
{
    char pwd,pwd1,ch;
    int i;
    FILE *fp1;
    system("cls");
    printf("\n请输入旧密码:");   
    for(i=0;i<8 &&((pwd=getch())!=13);i++)
      putch('*');
    pwd='\0';
    if((strcmp(password,pwd))!=0)
    {
      printf("\n密码输入错误,按任意键返回!\n");
      getch();
      return;
    }
    do{
      printf("\n输入新密码(最多8位):");
      for(i=0;i<8 &&((pwd=getch())!=13);i++)
            putch('*');
      printf("\n再次确认密码:");
      for(i=0;i<8 && ((pwd1=getch())!=13);i++)
            putch('*');   
      pwd='\0';
      pwd1='\0';
      if(strcmp(pwd,pwd1)!=0)
            printf("\n两次输入的密码不同,请重新输入!\n\n");
      else break;
    }while(1);
    if((fp1=fopen("config.dat","wb"))==NULL)
    {
      printf("\n创建系统配置文件失败,按任意键退出系统!\n");
      getch();
      exit(1);
    }
    i=0;
    while(pwd)
    {
       putw(pwd,fp1);
       i++;
    }      
    fclose(fp1);
    printf("\n密码修改成功,按任意键返回!\n");
    getch();
    return;
}      
void checkfirst() /*首次初始化*/
{
    FILE *fp,*fp1;
    char pwd,pwd1,ch;
    int i;
    if((fp=fopen("config.dat","rb"))==NULL) /*配置文件为空,表示为新系统*/
    {
      printf("\n新系统,还未进行初始化,单击任意键进行初始化操作。\n");
      bound('_',50);
      getch();
      do{
            printf("\n设置登录系统的密码(最多8位):");
            for(i=0;i<8 &&((pwd=getch())!=13);i++)
                putch('*');
            printf("\n再次确认密码:");
            for(i=0;i<8 && ((pwd1=getch())!=13);i++)
                putch('*');   
            pwd='\0';
            pwd1='\0';
            if(strcmp(pwd,pwd1)!=0)
                printf("\n两次输入的密码不同,请重新输入!\n\n");
            else break;
      }while(1);
      if((fp1=fopen("config.dat","wb"))==NULL)
      {
            printf("\n创建系统配置文件失败,按任意键退出系统!\n");
            getch();
            exit(1);
      }
      i=0;
      while(pwd)
      {
         putw(pwd,fp1);
         i++;
      }      
      fclose(fp1);
      printf("\n\n系统配置成功,按任意键退出系统,再重新进入!\n");
      getch();
      exit(1);
    }else{
      i=0;
      while(!feof(fp) && i<8)
            pwd=getw(fp);
      pwd='\0';
      if(i>=8) i--;
      while(pwd!=-1 && i>=0)
            i--;
      pwd='\0';
      strcpy(password,pwd);
    }
}
void bound(char ch,int n) /*显示分隔线*/
{
   while(n--)
         putch(ch);
   printf("\n");
   return;
}

crazylinux 发表于 2011-10-3 09:39:37

crazylinux 发表于 2011-10-3 09:36 static/image/common/back.gif
void resetpwd()/*重设密码*/
{
    char pwd,pwd1,ch;


再此提醒一下,此部分代码是单独的一部分,相当于Java里面自己写的一个类,可以在员工管理系统里调用此类里的任何一个函数。

emp.h

typedef struct employee /*员工信息 */
{
    int num;/*工号 */
    char duty;
    char name;/*姓名 */
    char sex;/*性别 */
    unsigned char age;/*年龄 */
    char edu;
    int salary;/*工资 */
    char tel_office; /*办公电话*/
    char tel_home;/*家庭电话*/
    char mobile;    /*移动电话*/
    char qq;   /*QQ号码*/
    char address;   /*地址*/
    struct employee *next;
}EMP;
char password;   /*保存密码*/
EMP *emp_first,*emp_end;
char gsave,gfirst;
void addemp(void);   /*增加员工信息*/
void findemp(void);/*查询员工信息*/
void listemp(void);/*员工列表*/
void modifyemp(void);/*修改员工信息*/
void summaryemp(void); /*统计员工信息*/
void delemp(void);   /*删除员工*/
void resetpwd();   /*重设密码*/
void readdata(void);/*从文件中获取员工信息,创建链表*/
void savedata(void); /*将链表中的数据保存到文件*/
int modi_salary(int s);/*修改工资*/
char *modi_field(char *field,char *s,int n); /*通过文字字段修改函数*/
EMP *findname(char *name); /*按姓名在链表中查找*/
EMP *findnum(int num);/*按工号查询*/
EMP *findtelephone(char *name);/*按电话查询*/
EMP *findqq(char *name);/*按QQ号码查询*/
void displayemp(EMP *emp,char *field,char *name); /*显示查找员工信息*/
void checkfirst(void); /*首次初始化*/
void bound(char ch,int n); /*显示分隔线*/
void login();/*检查密码*/
void menu();   /*显示菜单*/

san千。 发表于 2011-10-3 09:50:15

求学- - 路过 - -。

jrvf 发表于 2011-10-3 10:02:02

看得晕晕的

crazylinux 发表于 2011-10-3 10:07:02

jrvf 发表于 2011-10-3 10:02 static/image/common/back.gif
看得晕晕的

先看emp.h,这是一个类,主要东西全在这里。emp.c大部分都是调用类里的函数

libocdf 发表于 2011-10-3 11:33:41

楼主把源码的文件发论坛供大家下载吧。我还以为是MFC写的。。唉,不过还是来顶贴了。

掌心的呵护 发表于 2011-10-4 00:04:38

从上面一直拖到最下面。。。。

不忘 发表于 2011-10-4 00:15:38

好给力》。琢磨多久了,哥们:o

Y.H 发表于 2011-10-6 20:24:33

本帖最后由 Y.H 于 2011-10-6 20:25 编辑

我希望把代码用那两个代码尖括号<>括起来。
并且在括起来之前在VC中把格式搞好,(习惯加花括号最好把花括号加起。)

还有我看了一下那个CheckFirst函数,总感觉有点不对。可能是因为格式吧我总看不通顺。


但是个人感觉最好是发一部分代码出来。
另外的全部压缩好打包。


crazylinux 发表于 2011-10-6 20:42:52

Y.H 发表于 2011-10-6 20:24 static/image/common/back.gif
我希望把代码用那两个代码尖括号括起来。
并且在括起来之前在VC中把格式搞好,(习惯加花括号最好把花括号 ...

谢谢哥们提的意见

bubyday 发表于 2011-10-7 15:11:54

现在都是基于网页的吧。。。
页: [1]
查看完整版本: 自己写的一个员工管理系统