【升级版学生信息管理系统&员工工资信息管理系统】+文件操作+更多细节(上)

简介: 【升级版学生信息管理系统&员工工资信息管理系统】+文件操作+更多细节

1.功能介绍(主菜单-有什么功能)

讲一下:这个0123的标号的伏笔

//菜单函数
void Meau(void)
{
  printf("--------------------------------\n");
  printf("---  欢迎来到员工工资管理系统 ---\n");
  printf("--------------------------------\n");
  printf("----     0.退出程序         ----\n");
  printf("----     1.增加工资信息     ----\n");
  printf("----     2.删除工资信息     ----\n");
  printf("----     3.按名字查工资     ----\n");
  printf("----     4.修改工资信息     ----\n");
  printf("----     5.按照工资排序     ----\n");
  printf("----     6.按照工号排序     ----\n");
  printf("----     7.计算员工工资     ----\n");
  printf("----     8.打印工资信息     ----\n");
  printf("----     9.统计员工人数     ----\n");
  printf("-------------------------------\n");
}

2.结构体的定义(定义一个结构体类型)

1.画一个盒子的嵌套图

2.各种结构体类型成员的命名和函数命名规范

3.typedef类型重命名

4.size和capacity 的引入

5.计算员工工资放的位置

typedef struct Employee
{
  char name[20];
  char id[20];
  double InitWages;
  double bonus;
  double deduct;
  double NextWages;
  double taxes;
  double FinaWages;
}Employee;
typedef struct SeqList
{
  Employee* emp;
  int size;
  int capacity;
}SeqList;

3.主函数(如何调用分函数)

1.do while语句(前后呼应)

2.switch case  break;语句和case内部的每一步在干干嘛

3.传值调用和传址调用

int main()
{
  int input = 0;
  SeqList ST;
  InitSeqList(&ST);
  do//先执行一次
  {
    Meau();
    printf("请输入您的选择(提示:请在0-9之间选择):>");
    scanf("%d", &input);
    switch (input)
    {
    case 0:
      printf("欢迎您的使用,即将退出程序.\n");
      SaveSeqList(&ST);
      break;
    case 1:
      printf("********增加工资信息.********\n");
      int nums = 0;
      printf("请输入您要增加的员工信息的员工数量:>");
      scanf("%d", &nums);
      Employee temp = { 0 };
      for (int i = 1; i <= nums; i++)
      {
        InitEmployee(&temp,i);
        AddSeqList(&ST,temp);
      }
      CountSeqList(&ST);
      break;
    case 2:
      printf("********删除工资信息.********\n");
      DelSeqList(&ST);
      break;
    case 3:
      printf("********查询工资信息.********\n");
      SearByName(&ST);
      break;
    case 4:
      printf("********修改工资信息.********\n");
      ModifySeqList(&ST);
      CountSeqList(&ST);
      break;
    case 5:
      printf("********按照工资排序.(从高到低)********\n");
      QsortByFinaWages(&ST,0,ST.size);
      PrintSeqList(&ST);
      break;
    case 6:
      printf("********按照工号排序.(从小到大)********\n");
      ShellSortById(&ST);
      PrintSeqList(&ST);
      break;
    case 7:
      printf("********计算员工工资********\n");
      CountSeqList(&ST);
      printf("计算成功.\n");
      break; 
    case 8:
      printf("********打印工资信息********\n");
      PrintSeqList(&ST);
      break;
    case 9:
      printf("********统计员工人数********\n");
      printf("当前系统人数:%d\n", ST.size);
    default:
      printf("********输入错误,请重新输入********\n");
      break;
    }
  } while (input);
}

以下是功能的具体实现

4.初始化顺序表(数组加上数组的附加信息)

1.size和capacity的关系-->扩容(检查是否满了)

2.初始化

3.把上一次的数据加载到文件中-->持久化

主:

1. SeqList ST;
2.  InitSeqList(&ST);

分:

void CheckCapacity(SeqList* ps)
{
  if (ps->size == ps->capacity)
  {
    int newcapacity = 2 * ps->capacity;
    Employee* temp = (Employee*)realloc(ps->emp,sizeof(Employee) * newcapacity);
    if (temp==NULL)
    {
      perror("CheckCapacity::realloc");
      return;
    }
    ps->emp = temp;
    ps->capacity = newcapacity;
    printf("扩容成功\n");
  }
}
void LoadSeqList(SeqList* ps)
{
  FILE* pf = fopen("D:\\桌面\\test.txt", "rb");
  if (pf == NULL)
  {
    perror("LoadSeqList::fopen");
    return;
  }
  Employee temp = { 0 };
  while (fread(&temp, sizeof(Employee), 1, pf))
  {
    CheckCapacity(ps);
    ps->emp[ps->size] = temp;
    ps->size++;
  }
  fclose(pf);
  pf = NULL;
}
void InitSeqList(SeqList* ps)
{
  ps->emp = (Employee*)malloc(sizeof(Employee) * 4);
  if (ps->emp == NULL)
  {
    perror("InitSeqList::malloc");
    return;
  }
  ps->size = 0;
  ps->capacity = 4;
  LoadSeqList(ps);
}

5.退出程序同时保存数据到文档

1.文件的分类,为什么要有文件操作

2.关于fopen函数,fread函数,fwrite函数

主函数调用

1.    case 0:
2.      printf("欢迎您的使用,即将退出程序.\n");
3.      SaveSeqList(&ST);
4.      break;

分函数实现

void SaveSeqList(SeqList* ps)
{
  FILE* pf = fopen("D:\\桌面\\test.txt", "wb");
  if (pf == NULL)
  {
    perror("LoadSeqList::fopen");
    return;
  }
  for (int i = 0; i < ps->size; i++)
  {
    fwrite(ps->emp + i, sizeof(Employee), 1, pf);
  }
  fclose(pf);
  pf = NULL;
}

6.增加员工信息

1.打包操作

2.顺序表的插入

主:

    case 1:
      printf("********增加工资信息.********\n");
      int nums = 0;
      printf("请输入您要增加的员工信息的员工数量:>");
      scanf("%d", &nums);
      Employee temp = { 0 };
      for (int i = 1; i <= nums; i++)
      {
        InitEmployee(&temp,i);
        AddSeqList(&ST,temp);
      }
      CountSeqList(&ST);
      break;

分:

void InitEmployee(Employee* ps, int i)
{
  printf("请输入第%d位待插入的员工工资信息:\n",i);
  printf("请输入员工姓名:>");
  scanf("%s", ps->name);
  printf("请输入员工工号:>");
  scanf("%s", ps->id);
  printf("请输入员工的基本工资:>");
  scanf("%lf", &(ps->InitWages));
  printf("请输入员工的奖金:>");
  scanf("%lf", &(ps->bonus));
  printf("请输入员工的扣款:>");
  scanf("%lf", &(ps->deduct));
  printf("请输入员工的税款:>");
  scanf("%lf", &(ps->taxes));
}
void AddSeqList(SeqList* ps, Employee temp)
{
  CheckCapacity(ps);
  ps->emp[ps->size] = temp;
  ps->size++;
  printf("增加成功.\n");
}

7.删除员工信息

0.局部变量和全局变量

1.输入姓名,定位下标(封装成函数),strcmp函数,不存在返回-1 的原因

2.存在则执行顺序表的删除操作,覆盖问题

主:

    case 2:
      printf("********删除工资信息.********\n");
      DelSeqList(&ST);
      break;

分:

int FindByName(SeqList* ps,char* name)
{
  for (int i = 0; i < ps->size; i++)
  {
    if (strcmp(name, ps->emp[i].name) == 0)
    {
      return i;
    }
  }
  return -1;
}
void DelSeqList(SeqList* ps)
{
  if (ps->size == 0)
  {
    printf("当前员工总数为0,无法删除.\n");
  }
  char name[20] = { 0 };
  printf("请输入您要删除的员工信息的员工姓名:>");
  scanf("%s", name);
  int pos = FindByName(ps,name);
  if (pos == -1)
  {
    printf("当前系统中不存在名字为%s的员工.\n", name);
    return;
  }
  else
  {
    int begin = pos + 1;
    while (begin < ps->size)
    {
      ps->emp[begin -1] = ps->emp[begin];
      begin++;
    }
    ps->size--;
  }
  printf("删除成功.\n");
}

8.按照名字查找(查询工资信息)

1.同上的定位函数

2.打印下标为i的员工信息

主:

    case 3:
      printf("********查询工资信息.********\n");
      SearByName(&ST);
      break;

分:

void SearByName(SeqList* ps)
{
  char name[20] = { 0 };
  printf("请输入您要查询的员工信息的员工姓名:>");
  scanf("%s", name);
  int pos = FindByName(ps, name);
  if (pos == -1)
  {
    printf("当前系统中不存在名字为%s的员工.\n", name);
    return;
  }
  else
  {
    printf("%-20s %-20s %-10s %-10s %-10s %-10s %-10s %-10s\n", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资", "税款", "实发工资");
    printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf\n", \
      ps->emp[pos].name, ps->emp[pos].id, ps->emp[pos].InitWages, ps->emp[pos].bonus, ps->emp[pos].deduct, ps->emp[pos].NextWages, ps->emp[pos].taxes, ps->emp[pos].FinaWages);
  }
}
目录
相关文章
|
8月前
|
存储 负载均衡 调度
从 FlashAttention 出发:八个值得关注的技术迭代方向
本内容探讨了 FlashAttention 的八大优化方向,涵盖分层归一化、动态分块、上下界筛除、等价 softmax 实现、KV-cache 压缩、异构精度布局、2.5D 并行及调度优化,旨在提升长序列处理效率与多卡协同能力。
340 7
|
9月前
|
JSON API 数据安全/隐私保护
深度分析唯品会API接口,用Python脚本实现
本文深度解析唯品会API的核心功能、认证机制与接口规范,并基于行业常规推测签名逻辑,结合Python实现商品与订单接口调用示例,适用于电商系统对接与自动化开发场景。
|
11月前
|
安全 数据管理 数据安全/隐私保护
睿是信息携手Arctera,深化服务中国市场,共筑数据管理新未来
2025年,上海睿是信息科技有限公司与全球数据管理领导者Arctera达成战略合作,睿是信息成为Arctera中国区独家总代理。Arctera成立于2024年,源自Veritas Technologies,提供数据合规、弹性和保护解决方案,服务全球包括70%财富百强企业。睿是信息作为新一代数据安全专家,将推动Arctera产品在中国市场的覆盖,提供先进高效的数据管理服务,助力企业数字化转型与业务发展。双方合作旨在优化数据管理布局,为中国企业提供更全面、灵活的解决方案,共筑数据管理新未来。
505 0
|
SQL 分布式计算 关系型数据库
超详细!搭建本地大数据研发环境(16G内存+CDH)(二)
超详细!搭建本地大数据研发环境(16G内存+CDH)(二)
1644 0
超详细!搭建本地大数据研发环境(16G内存+CDH)(二)
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
机器学习/深度学习 人工智能 自然语言处理
人工智能算法原理
人工智能(AI)属计算机科学,聚焦于模拟人类智慧的技术与系统的研发。本文概览常见AI算法原理:机器学习含监督(如决策树、支持向量机)、无监督(如聚类、主成分分析)及强化学习算法;深度学习涉及卷积神经网络、循环神经网络和生成对抗网络;自然语言处理涵盖词袋模型、循环神经网络语言模型及命名实体识别等。这些算法支撑着AI技术的广泛应用与发展。
1245 0
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
486 5
|
存储 Python
Python网络编程基础(Socket编程)接收和发送数据
【4月更文挑战第9天】在UDP服务器编程中,我们已经创建了一个UDP套接字并绑定了地址和端口。接下来,服务器需要能够接收来自客户端的数据,并能够对这些数据进行处理和响应。下面,我们将详细讲解如何在UDP服务器中接收和发送数据。
|
JSON 分布式计算 Java
【案例实战】Java整合hudi-client 0.11.1
【案例实战】Java整合hudi-client 0.11.1
【案例实战】Java整合hudi-client 0.11.1
【永劫无间的捏脸功能】调整角色的基本面部特征,如眼睛大小、眼角、嘴唇、下巴
【永劫无间的捏脸功能】调整角色的基本面部特征,如眼睛大小、眼角、嘴唇、下巴
464 0