【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查

简介: 【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查

一、需求分析

1.职工信息管理系统的目标是为方便管理层对职工的信息管理,要如何设计一个操作简便且又能很好的管理职工信息的系统就要涉及到各种逻辑问题。

2.管理系统将可以对职工信息进行操作,对职工信息进行学生的职工号,姓名,年龄,性别,地址,电话,工资等进行录入文件系统,浏览信息,查询(按工资、学历、姓名查找),删除,修改等一系列功能。

二、总体设计

总体设计包括:

1.创建职工信息

2.查询职工信息

3.修改职工信息

4.删除职工信息

5.显示职工信息

6.按姓名排序职工信息

三、详细设计

设计思路:

1.定义结构体来保存职工的各项信息

2.使用主菜单对职工信息主要功能管理,不同功能有不同的编号

3.用结构体数组来存储多个职工信息

4.采用txt文件来保存多个职工信息,提高操作效率

5.系统的数据输入包括功能编号以及职工的各项信息。输出主要显示职工信息

模块划分:

主模块:该模块主要完成整个系统的流程。在主模块中调用其他函数,实现整个       系统的功能。

录入职工信息模块:

      该模块根据提示信息分别输入职工姓名、工号、年龄、性别、电话、学           历、工资和地址,输入结束后保存在电脑磁盘中。

查询联系人信息模块:

      该模块用于在通讯录中根据姓名查找指定的联系人,并根据系统提示决           定是否显示该信息。

修改联系人信息模块:

      该模块用来修改通讯录中指定联系人的信息。

删除联系人信息模块:

      该模块将指定联系人的信息从通讯录中删除。

排序模块:

      该模块将通讯录中的所有联系人按照姓名的字母顺序进行排序。

显示联系人信息模块:

      该模块用来显示通讯录中所有的联系人信息。

四、程序运行结果测试与分析

主界面:

增加职工信息:

根目录下txt文件里的数据:

查询功能(学历、名字、工资查找):

 

修改功能(按学历修改工资):

 

删除职工信息(按名字删除):

打印功能(打印全部的职工信息):

最终保存在txt文件(只存了两个职工信息):

五、结论与心得

难题在将结构体数组中的数据保存到文件当中,问题困扰了我很久,通过不断地翻阅课本和网上的资料,最后了解到用读写文件相关的函数 来编写程序问题就迎刃而解了,总的程序框架主要以菜单上的功能为主,一个一个的分模块,编写子函数,用函数的嵌套关系来解决信息管理的需求,最终完成功能。   在本次课程实践中所有的结构框架以及相关功能模块均由独自查阅资料,独立思考完成,费时费力,占用了我大量的时间,几度想要放弃而选用老师给的连接,但最终还是坚持下来了,总感觉自己设计会更有成就感,更有学习的意味,才能更好的锻炼自己,提升自己

六、代码(开发环境为vc++6.0):

 
 
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#include<string.h>
#define LEN sizeof(struct addritem)//定义结构体的长度//
#define FORMAT "%-20s%-15s%-15s%-15s%-15s%-10s%-15s%-30s%\n"//这个宏规定了输出的格式//
#define DATA addrinfo[i].number,addrinfo[i].name,addrinfo[i].sec,addrinfo[i].tel,addrinfo[i].age,addrinfo[i].Record,addrinfo[i].wage,addrinfo[i].address//代表结构体数组元素中的各个成员// 
//定义结构体成员//
struct addritem
{ char number[15];//工号
  char name[20];//名字
  char sec[10];//性别
  char tel[15];//电话
  char age[3];//年龄
  char Record[15];//学历
  char wage[5]; //工资
  char address[30];//地址
};
struct addritem addrinfo[100];//定义结构体数组,100个职工
//声明程序中要用到的函数//
void input();     //增加
void search();      //搜索
void update();      //修改  
void del();       //删除
void display();     //显示  
void sort();      //排序
void search_Record();
void search_wage();
void menu();
//void addwage();
 
void menu()//主菜单函数//
{
  system("cls");//调用cls函数清空界面//
  printf("\n\n\n\n\n");//控制主功能菜单显示位置// 
  printf("\t\t|----------------------------------菜单----------------------------------------------------|\n");
  printf("\t\t|0. 退出职工系统                                                                           |\n");
  printf("\t\t|1. 录入职工信息                                                                           |\n");
  printf("\t\t|2. 查询职工信息                                                                           |\n");
  printf("\t\t|3. 修改职工信息                                                                           |\n");
  printf("\t\t|4. 删除职工信息                                                                           |\n");
  printf("\t\t|5. 排序职工信息                                                                           |\n");
  printf("\t\t|6. 显示职工信息                                                                           |\n");
  printf("\t\t|------------------------------------------------------------------------------------------|\n");
  printf("\t\t\t请从(0-6)中选择一个功能:");
}
void main()//主函数//
{
  int n,x;
  menu();//调用主菜单//
  scanf("%d",&n);//用户选择功能//
  while (n)//选择结构进入相应的功能//
  {
    switch (n)
    {
    case 1: input();  break;
    case 2:
        printf("名字查询请按1\n");
        printf("学历查询请按2\n");
        printf("工资查询请按3\n");
        scanf("%d",&x);
      switch (x)
      {
 
        case 1:search(); break;
        case 2:search_Record();break;
        case 3:search_wage();break;
      }break;
      
      
    case 3: update(); break;
    case 4: del();    break;
    case 5: sort();   break;
    case 6: display();break;
  //  case 7: addwage();break;
    default: break;
    }
    printf("任意键返回主菜单\n");
    getch();
    menu();//再次调用主菜单//
    scanf("%d",&n);
  }
}
void input()
{
  int i,count=0;//定义一个循环变量以及记录职工信息中联系人个数的变量//
  char ch[2];//字符数组用来记录用户的输入//
  FILE *fp;//定义指向文件的指针变量//
  if((fp=fopen("data.txt","a+"))==NULL)//调用fopen函数创建一个新的文本来保存联系人信息//
  {
    printf("打开失败!\n");
    return;
  }
  while (!feof(fp))//判断文件是否结束//
  {
    if (fread(&addrinfo[count], LEN, 1, fp)==1)//使用fresd函数将文件中的记录逐条读取到结构体数组//
      count++;
  }
  fclose(fp);//关闭文件//
  if (count==0)//判断当前结构体数组是否为空//
    printf("没有职工信息\n");
  else
  {
    system("cls");//清屏//
    display();//显示结构体数组的所有信息//
  }
  if ((fp=fopen("data.txt", "wb"))==NULL)//如果打开文件失败//
  {
    printf("无法打开地址列表!\n");
    return;
  }
  //将数据重写入磁盘//
  for (i = 0; i < count; i++)
    fwrite(&addrinfo[i], LEN, 1, fp);
  printf("请输入(y/n)");//提示用户输入//
  scanf("%s", ch);
  while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)//判断用户是否需要输入//
  {
    printf("名字:");
    scanf("%s", &addrinfo[count].name);
    //判断用户输入姓名在结构体数组中是否存在//
    for(i=0;i<count;i++)
      if (strcmp(addrinfo[i].name, addrinfo[count].name) == 0)
      {
        printf("名称已存在,请按任意键继续. ");
        getch();
        fclose(fp);
        return;
      }
    printf("工号:");
    scanf("%s", &addrinfo[count].number);
    printf("性别:");
    scanf("%s", &addrinfo[count].sec);
    printf("电话:");
    scanf("%s", &addrinfo[count].tel);
    printf("年龄:");
    scanf("%s", &addrinfo[count].age);
    printf("学历:");
    scanf("%s", &addrinfo[count].Record);
    printf("工资:");
    scanf("%s", &addrinfo[count].wage);
    printf("地址:");
    scanf("%s", &addrinfo[count].address);
 
 
    if (fwrite(&addrinfo[count], LEN, 1, fp) != 1)//将新建职工信息信息保存到磁盘//
    {
      printf("无法保存记录!");
      getch();
    }
    else
    {
      printf("%s 保存成功\n", addrinfo[count].name);
      count++;
    }
    printf("是否继续?(y/n):");
    scanf("%s", ch);
  }
  fclose(fp);
  printf("OK!\n");
}
void search()//名字查找
{
  FILE *fp;
  int i, count = 0;
  char ch[2], name[15];//定义数组接收用户的输入信息//
  //打开磁盘,并将磁盘中的职工信息逐条读取到内存结构体数组//
  if ((fp = fopen("data.txt", "rb")) == NULL)
  {
    printf("打开文件失败\n");
    return;
  }
  while (!feof(fp))//判断是否到达文件的尾部//
    if (fread(&addrinfo[count], LEN, 1, fp) == 1)
      count++;//count终值为职工信息条目//
  fclose(fp);
  if (count == 0)
  {
    printf("没有记录!\n");
    return;
  }
  printf("请输入该职工名字:");
  scanf("%s",name);
  //查找职工信息指定信息,运用字符比较函数//
  for(i=0;i<count;i++)
    if (strcmp(name, addrinfo[i].name) == 0)
    {
      printf("已找到相关信息是否显示?(y/n):");
      scanf("%s", ch);
      if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
      {
        printf("工号\t   姓名\t 性别\t  电话\t  年龄\t  学历\t 工资 \t   地址\t \n");
        printf(FORMAT,DATA);
      }
      break;
    }
  
  if (i == count)
    printf("找不到该职工信息\n"); 
}
void update()
{
  FILE* fp;
  int i, j, count = 0;
  char name[15];
  if ((fp = fopen("data.txt", "r+")) == NULL)
  {
    printf("无法打开!\n");
    return;
  }
  while (!feof(fp))
    if (fread(&addrinfo[count], LEN, 1, fp) == 1)
      count++;
  if (count == 0)
  {
    printf("没有记录!\n");
    fclose(fp);
    return;
  }
  display();
  //修改职工信息//
  printf("请输入您想要更新的职工名称!  \n");
  printf("要更新的名字:");
  scanf("%s", &name);
  for (i = 0; i < count; i++)
  {
    if (strcmp(name, addrinfo[i].name) == 0)
    {
      printf("请重新输入职工信息\n");
      printf("工号:");
      scanf("%s", &addrinfo[i].number);
      printf("名字:");
      scanf("%s", &addrinfo[i].name);
      printf("性别:");
      scanf("%s", &addrinfo[i].sec);
      printf("电话:");
      scanf("%s", &addrinfo[i].tel);
      printf("年龄:");
      scanf("%s", &addrinfo[i].age);
      printf("学历:");
      scanf("%s", &addrinfo[i].Record);
      printf("工资:");
      scanf("%s", &addrinfo[i].wage);
      printf("地址:");
      scanf("%s", &addrinfo[i].address);
      printf("修改完成!");
      //打开磁盘,将修改后的职工信息写入磁盘//
      if ((fp = fopen("data.txt", "wb")) == NULL)
      {
        printf("打开失败\n");
        return;
      }
      for (j = 0; j < count; j++)
        if (fwrite(&addrinfo[j], LEN, 1, fp) != 1)
        {
          printf("保存失败!");
          getch();
        }
      fclose(fp);
      return;
    }
  }
  printf("没有找到该条职工信息!\n");
}
void del()
{
  FILE* fp;
  int i, j, count = 0;
  char ch[2];
  char name[15];
  if ((fp = fopen("data.txt", "r+")) == NULL)
  {
    printf("打开失败!\n");
    return;
  }
  while (!feof(fp))
    if (fread(&addrinfo[count], LEN, 1, fp) == 1)
      count++;
  fclose(fp);
  if (count == 0)
  {
    printf("无记录!\n");
    return;
  }
  display();
  //删除职工信息//
  printf("请输入要删除的职工姓名:");
  scanf("%s", &name);
  for (i = 0; i < count; i++)
  {
    if (strcmp(name, addrinfo[i].name) == 0)
    {
      printf("已找到该职工信息,是否删除?(y/n)");
      scanf("%s", ch);
      if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
        for (j = i; j < count; j++)
          addrinfo[j] = addrinfo[j + 1];
      count--;
      //将删除后的职工信息写入对应的磁盘文件//
      if ((fp = fopen("data.txt", "wb")) == NULL)
      {
        printf("打开文件失败!\n");
        return;
      }
      for(j=0;j<count;j++)
        if (fwrite(&addrinfo[j], LEN, 1, fp) != 1)
        {
          printf("无法保存!\n");
          getch();
        }
      fclose(fp);
      printf("删除成功!\n");
      return;
    }
  }
  printf("找不到该职工!\n");
}
void sort()
{
  FILE* fp;
  struct addritem t;
  int i = 0, j = 0, count = 0;
  if ((fp = fopen("data.txt", "r+")) == NULL)
  {
    printf("打开失败!\n");
    return;
  }
  while (!feof(fp))
    if (fread(&addrinfo[count], LEN, 1, fp) == 1)
      count++;
  fclose(fp);
  if (count == 0)
  {
    printf("无记录!\n");
    return;
  }
  for(i=0;i<count-1;i++)
    for(j=i+1;j<count;j++)
      if (strcmp(addrinfo[i].name, addrinfo[j].name) > 0)
      {
        t = addrinfo[i];
        addrinfo[i] = addrinfo[j];
        addrinfo[j] = t;
      }
  if ((fp = fopen("data.txt", "wb")) == NULL)
  {
    printf("打开失败!\n");
    return;
  }
  for(i=0;i<count;i++)
    if(fwrite(&addrinfo[i],LEN,1,fp)!=1)
    {
      printf("保存失败!\n");
      getch();
    }
  fclose(fp);
  printf("保存成功!\n");
}
void display()
{
  FILE* fp;
  int i, count = 0;
  fp = fopen("data.txt", "rb");//以读写的方式打开文件//
  //读取文件//
  while (!feof(fp))
  {
    if (fread(&addrinfo[count], LEN, 1, fp) == 1)
      count++;
  }
  fclose(fp);//关闭文件//
  printf("工号\t   姓名\t 性别\t  电话\t  年龄\t  学历\t 工资 \t   地址\t \n");
  for (i = 0; i < count; i++)
    printf(FORMAT, DATA);
}
 
void search_Record()//学历查找
{
FILE *fp;
  int i, count = 0,flag=0;
  char ch[2], Record[15];//定义数组接收用户的输入信息//
  //打开磁盘,并将磁盘中的职工信息逐条读取到内存结构体数组//
  if ((fp = fopen("data.txt", "rb")) == NULL)
  {
    printf("打开文件失败\n");
    return;
  }
  while (!feof(fp))//判断是否到达文件的尾部//
    if (fread(&addrinfo[count], LEN, 1, fp) == 1)
      count++;
  fclose(fp);
  if (count == 0)
  {
    printf("没有记录\n");
    return;
  }
  printf("请输入您要查找的学历:");
  scanf("%s",Record);
  //查找职工指定信息,运用字符比较函数//
  for(i=0;i<count;i++)
    if (strcmp(Record, addrinfo[i].Record) == 0)
    {
        flag++;
        printf("工号\t   姓名\t 性别\t  电话\t  年龄\t  学历\t 工资 \t   地址\t \n");
        printf(FORMAT,DATA);
    }
  //判断循环结束是因为没有找到职工信息还是因为找到了但是没有显示职工信息//
  if (i == count&&flag!=0)
    printf("查找完毕!\n"); 
  if(i==count&&flag==0)
    printf("找不到该职工信息\n");
}
 
void search_wage()//工资查找
{
FILE *fp;
  int i, count = 0, flag=0;
  char ch[2], wage[15];//定义数组接收用户的输入信息//
  //打开磁盘,并将磁盘中的职工信息逐条读取到内存结构体数组//
  if ((fp = fopen("data.txt", "rb")) == NULL)
  {
    printf("打开文件失败\n");
    return;
  }
  while (!feof(fp))//判断是否到达文件的尾部//
    if (fread(&addrinfo[count], LEN, 1, fp) == 1)
      count++;
  fclose(fp);
  if (count == 0)
  {
    printf("没有记录\n");
    return;
  }
  printf("请输入您要查找的工资:");
  scanf("%s",wage);
  //查找职工指定信息,运用字符比较函数//
  for(i=0;i<count;i++)
    if (strcmp(wage, addrinfo[i].wage) == 0)
    {
        flag++;
        printf("工号\t   姓名\t 性别\t  电话\t  年龄\t  学历\t 工资 \t   地址\t \n");
        printf(FORMAT,DATA);
    }
  
  if (i == count&&flag!=0)
    printf("查找完毕!\n"); 
  if(i==count&&flag==0)
    printf("找不到该职工信息\n");
}
 
相关文章
|
23天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
74 3
|
2月前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
2月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
2月前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
2月前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
2月前
|
C语言
【C语言】探索文件读写函数的全貌(一)
【C语言】探索文件读写函数的全貌
|
2月前
|
存储 文件存储 C语言
【C语言】深入了解文件:简明指南
【C语言】深入了解文件:简明指南
|
3月前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
228 5
|
3月前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
4月前
|
存储 C语言
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
66 15