c语言版员工管理系统,linux终端运行

3 篇文章 0 订阅


#include<stdio.h>
#include<string.h>
#include <stdlib.h>

//显示界面
void show()
{
 int i=0;
 for(i=0;i<50;i++)
  printf("*");
 printf("\n*");
 for(i=0;i<15;i++)
  printf(" ");
 printf("人员信息管理系统");
 for(i=0;i<17;i++)
  printf(" ");
 printf("*\n");
 for(i=0;i<50;i++)
  printf("*");
 printf("\n*");
 for(i=0;i<10;i++)
  printf(" ");
 printf("1.录入信息");
 for(i=0;i<10;i++)
  printf(" ");
 printf("2.按id查询  *\n*");
 for(i=0;i<10;i++)
  printf(" ");
 printf("3.按姓名精确查询");
 for(i=0;i<4;i++)
  printf(" ");
 printf("4.按姓名模糊查询  *\n*");
 for(i=0;i<10;i++)
  printf(" ");
 printf("5.更改信息");
 for(i=0;i<10;i++)
  printf(" ");
 printf("6.删除信息        *\n*");
 for(i=0;i<10;i++)
  printf(" ");
 printf("7.显示成员信息");
 printf("      0.退出            *\n");
 for(i=0;i<50;i++)
  printf("*");
 printf("\n");
}

//判断字符匹配&&*(str1+j)
int indexof(const char *str,const char *str1)
{
 int i=0,j=0;
 for(i=0;*(str+i);i++)
 {
  if(*(str+i)==*(str1+j)) //相等并且str1还未结束则继续
  {
   j++;
   if(!*(str1+j)) //str1已经到末尾了,比较结束,找到了,返回1
    return 1;
  }
  else  //在比较的中途某个字符不相等,则重新从str的下一个字符开始比较
  {
   j=0;
  }
 }
 return 0;
}

//录入信息
int save()
{
 int num=0,id1,id=0,pos=0,flag;//id是输入的,id1是文件中读出来的
 char name[20],buf[20];
 float salary=0.0f;
 FILE *fp=fopen("a.bin","ab+");
 if(!fp)
 {
  printf("文件打开失败\n");
  return 0;
 }
 while(1)
 {
  flag=0;
  printf("请输入人员id:");
  scanf("%d",&id);
  scanf("%*[^\n]");
  scanf("%*c");
  /*for(pos=0;pos<num;pos++)
  {
   if(id==ids[pos])
    break;
  }
  if(pos<=num-1)
  { 
   printf("用户id已存在,请重新输入!\n");
   continue;
  }
  */
  rewind(fp);
  while(fread(&id1,sizeof(int),1,fp))
  {
   if(id1==id)//如果文件中已经存在该id则将flag置为1作为标记
   {
    flag=1;
    break;
   }
   fseek(fp,24,SEEK_CUR);
  }
  if(flag==1)
   continue;
  printf("请输入人员姓名:");
  scanf("%s",name);
  //fgets(name,20,stdin);
  if(strlen(name)==19&&name[18]!='\n')
  {
   scanf("%*[^\n]");
   scanf("%*c");
  }
  //if(name[strlen(name)-1]=='\n')
   //name[strlen(name)-1]='\0';
  printf("请输入人员工资:");
  scanf("%g",&salary);
  scanf("%*[^\n]");
  scanf("%*c");
  fseek(fp,0,SEEK_END);
  fwrite(&id,sizeof(int),1,fp);
  fwrite(name,sizeof(char),20,fp);
  fwrite(&salary,sizeof(float),1,fp);
  //ids[num]=id;
  num++;
  printf("是否要录入下一个员工信息:(y/Y继续)");
  fgets(buf,20,stdin);
  if(strlen(buf)==19&&buf[18]!='\n')
  {
   scanf("%*[^\n]");
   scanf("%*c");
  }
  if(buf[0]!='y'&&buf[0]!='Y')
  {
   break;
  }
 }
 fclose(fp);
 fp=NULL;
 //system("CLS");
 return num;
}

//按照id查询
void id_query()
{
 int id=0,id1=0,length=0;
 char name[20];
 float salary=0.0f;
 FILE *fp=NULL;
 system("clear");
 printf("请输入要查询的人员的id:");
 scanf("%d",&id1);
 fp=fopen("a.bin","rb");
 if(fp)
 {
  fseek(fp,0,SEEK_END);
  length=ftell(fp);
  rewind(fp);
  while(ftell(fp)<length)
  {
   fread(&id,sizeof(int),1,fp);
   if(id==id1)
   {
    fread(name,sizeof(char),20,fp);
    fread(&salary,sizeof(float),1,fp);
    system("CLS");
    printf("id存在,查询成功!\n");
    printf("您查询的人员的信息如下\n");
    printf("******************************************\n");
    printf("* id\t\tname\t\tsalary   *\n");
    printf("******************************************\n");
    printf("*  %d\t\t%s\t\t%g     *\n",id,name,salary);
    printf("******************************************\n");
       //printf("\tid\t姓名\t工资\n");
       //printf("\t%d\t%s\t%g\n\n",id,name,salary);
    break;
   }
   fseek(fp,24,SEEK_CUR);
   if(ftell(fp)>=length)
   {   
    printf("id不存在,查询失败!\n");
   }
  }
  fclose(fp);
  fp=NULL;
 }
}

//按姓名精确查询
void name_query()
{
 char name[20],name1[20];
 int length=0,id=0,flag=0;//flag=0表示没找到,默认没找到
 float salary=0.0f;
 system("clear");
 printf("请输入要查询的人员姓名:");
 //fgets(name1,20,stdin);
 scanf("%s",name1);
 if(strlen(name1)==19&&name1[18]!='\n')
 {
  scanf("%*[^\n]");
  scanf("%*c");
 }
 //if(name[strlen(name)-1]=='\n')
   //name[strlen(name)-1]='\0';
 FILE *fp=fopen("a.bin","rb");
 if(fp)
 {
  while(fread(&id,sizeof(int),1,fp))
  {
   fread(name,sizeof(char),20,fp);
   fread(&salary,sizeof(float),1,fp);
   if(!strcmp(name1,name))
   {
    system("CLS");
    printf("存在该用户,查询成功!\n");
    printf("您查询的人员的信息如下\n");
    printf("******************************************\n");
    printf("* id\t\tname\t\tsalary   *\n");
    printf("******************************************\n");
    printf("*  %d\t\t%s\t\t%g     *\n",id,name,salary);
    printf("******************************************\n");
       //printf("\tid\t姓名\t工资\n");
       //printf("\t%d\t%s\t%g\n\n",id,name,salary);
    flag=1;
   }
  }
  if(flag==0)
  {   
   printf("姓名不存在,查询失败!\n");
  }
  fclose(fp);
  fp=NULL;
    }
}

//按姓名模糊查询
void m_name_search()
{
 char name[20],name1[20];
 int length=0,id=0,flag=0;//flag=0表示没找到,默认没找到
 float salary=0;
 //system("clear");
 system("clear");
 printf("请输入要查询的人员姓名:");
 //fgets(name1,20,stdin);
 scanf("%s",name1);
 if(strlen(name1)==19&&name1[18]!='\n')
 {
  scanf("%*[^\n]");
  scanf("%*c");
 }
 //if(name[strlen(name)-1]=='\n')
   //name[strlen(name)-1]='\0';
 FILE *fp=fopen("a.bin","rb");
 if(fp)
 {
  while(fread(&id,sizeof(int),1,fp))
  {
   fread(name,sizeof(char),20,fp);
   fread(&salary,sizeof(float),1,fp);
   if(indexof(name,name1))
   {
    system("clear");
    printf("存在该用户,查询成功!\n");
    printf("您查询的人员的信息如下\n");
    printf("******************************************\n");
    printf("* id\t\tname\t\tsalary   *\n");
    printf("******************************************\n");
    printf("*  %d\t\t%s\t\t%g     *\n",id,name,salary);
    printf("******************************************\n");
         //printf("\tid\t姓名\t工资\n");
         //printf("\t%d\t%s\t%g\n\n",id,name,salary);
    flag=1;
   }
  }
  if(flag==0)
  {   
   printf("姓名不存在,查询失败!\n");
  }
  fclose(fp);
  fp=NULL;
    }
}

//修改信息
void update()
{
 char name[20];
 int id=0,id1=0;
 float salary=0;
 //system("clear");
 system("clear");
 printf("请输入要修改人员的id:");
 scanf("%d",&id1);
 FILE *fp=fopen("a.bin","rb+");
 if(!fp)
 {
  printf("Cannot open the file!");
  return;
 }
 else
 {
  while(fread(&id,sizeof(int),1,fp))
  {
   if(id==id1)
   {
    fread(name,sizeof(char),20,fp);
    fread(&salary,sizeof(float),1,fp);
    printf("您所需要修改的人员信息如下\n");
    //
    printf("******************************************\n");
    printf("* id\t\tname\t\tsalary   *\n");
    printf("******************************************\n");
    printf("*  %d\t\t%s\t\t%g     *\n",id,name,salary);
    printf("******************************************\n");
    //printf("\tid\t姓名\t工资\n");
    //printf("\t%d\t%s\t%g\n",id,name,salary);
    printf("请输入修改后的姓名:");
    scanf("%s",name);
    printf("请输入修改后的工资:");
    scanf("%f",&salary);
    fseek(fp,-24,SEEK_CUR);
    fwrite(name,sizeof(char),20,fp);
    fwrite(&salary,sizeof(float),1,fp);
    break;
   }
  }
  fclose(fp);
  fp=NULL;
 }
}

//删除信息
void del()
{
 int id1=0,id=0;
 char name[20];
 float salary=0;
 FILE *fp=fopen("a.bin","rb");//以只读的方式打开
 FILE *fp1=fopen("b.bin","w+b");//作为临时文件,以读写的方式打开
 if(!fp||!fp1)
 {
  printf("Cannot open the file!\n");
  return;
 }
 else
 {
  while(fread(&id,sizeof(int),1,fp))//将源文件复制一份给临时文件
  {
   fwrite(&id,sizeof(int),1,fp1);
   fread(name,sizeof(char),20,fp);
   fwrite(name,sizeof(char),20,fp1);
   fread(&salary,sizeof(float),1,fp);
   fwrite(&salary,sizeof(float),1,fp1);
  }
  fclose(fp);
  fp=NULL;
  FILE *fp2=fopen("a.bin","wb");//再将源文件以只写的方式打开
  if(!fp2)
  {
   printf("Cannot open the file!\n");
   return;
  }
  else
  {
   //system("clear");
   system("clear");
   printf("请输入要删除的人员的id:");
   scanf("%d",&id1);
   rewind(fp1);//将临时文件的文件指针移到文件头
   //降临时文件中除了要删除的人员信息之外的其余的信息重新写回源文件
   while(fread(&id,sizeof(int),1,fp1))
   {
    if(id==id1)
    {
      fseek(fp1,24,SEEK_CUR);
      continue;
     }
    fwrite(&id,sizeof(int),1,fp2);
    fread(name,sizeof(char),20,fp1);
    fwrite(name,sizeof(char),20,fp2);
    fread(&salary,sizeof(float),1,fp1);
    fwrite(&salary,sizeof(float),1,fp2);
   }
  }
  fclose(fp1);
  fp1=NULL;
  fclose(fp2);
  fp2=NULL;
 }
}

void sort()
{
 int ids[100],id1,i=0,j,k,n;
 char name[100][20],name1[20];
 float sal[100],sal1;
 FILE *fp=fopen("a.bin","rb");
 if(!fp)
 {
  printf("Cannot open the file!\n");
  return;
 }
 while(fread(&id1,sizeof(int),1,fp))//将信息先存放在数组中
 {
  fread(name1,sizeof(char),20,fp);
  fread(&sal1,sizeof(float),1,fp);
  ids[i]=id1;
  strcpy(name[i],name1);
  sal[i]=sal1;
  i++;
 }
 for(j=0;j<i-1;j++)//将信息按id从小到大排序
 {
  for(k=0;k<i-j-1;k++)
  {
   if(ids[k]>ids[k+1])
   {
     id1=ids[k];
     ids[k]=ids[k+1];
     ids[k+1]=id1;
     strcpy(name1,name[k]);
     strcpy(name[k],name[k+1]);
     strcpy(name[k+1],name1);
     sal1=sal[k];
     sal[k]=sal[k+1];
     sal[k+1]=sal1;
   }
  }
 }
 fclose(fp);
 fp=NULL;
 //排好序后再讲数组中的数据信息写回到文件中
 //rewind(fp);
 FILE *fp1=fopen("a.bin","wb");
 if(!fp1)
 {
  printf("Cannot open the file!\n");
  return;
 }
 for(n=0;n<i;n++)
 {
  fwrite(&ids[n],sizeof(int),1,fp1);
  fwrite(name[n],sizeof(char),20,fp1);
  fwrite(&sal[n],sizeof(float),1,fp1);
 }
 fclose(fp1);
 fp1=NULL;
}


void list()
{
 sort();
 int id=0,num=0;
 char name[20];
 float salary=0;
 FILE *fp=fopen("a.bin","rb");
 if(!fp)
 {
  printf("Cannot open the file!\n");
  return;
 }
 else
 {
  system("clear");
  printf("******************************************\n");
  printf("* id\t\tname\t\tsalary   *\n");
  printf("******************************************\n");
  while(fread(&id,sizeof(int),1,fp))
  { 
   num++;
   fread(name,sizeof(char),20,fp);
   fread(&salary,sizeof(float),1,fp);
   printf("*  %d\t\t%s\t\t%g     *\n",id,name,salary);
  }
  printf("******************************************\n");
  printf("共显示%d个人员信息\n",num);
 }
 fclose(fp);
 fp=NULL;
}

void over()
{
 system("clear");
 printf("******************\n");
 printf("*   GOOD BYE     *\n");
 printf("******************\n");
}

int main()
{
 int i;
 char ch;
 while(1)
 { 
  show();
  printf("请选择:");
  scanf("%d",&i);
  switch(i)
  { 
   case 1:
    printf("共录入了%d个用户的信息\n",save());
    getchar();
    system("CLS");
    break;
   case 2:
    id_query();
    break;
   case 3:
    name_query();
    break;
   case 4:
    m_name_search();
    break;
   case 5:
    update();
    break;
   case 6:
    del();
    break;
   case 7:
    //printf("hello\n");
    list();
    break;
   case 0:
    over();
    return 0;
  }
  if(i!=1)
  {
   scanf("%*[^\n]");
   scanf("%*c");
   printf("(按Enter键返回)\n");
   getchar();
   system("clear");
  } 
 }
}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值