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

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

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);
  }
}
目录
相关文章
|
存储 API 索引
一个图书管理系统的综合小练习
一个图书管理系统的综合小练习
97 0
程序设计基础课程设计 —— 疫苗预约管理系统附录
程序设计基础课程设计 —— 疫苗预约管理系统附录
程序设计基础课程设计 —— 学生信息管理系统(下)
程序设计基础课程设计 —— 学生信息管理系统(下)
程序设计基础课程设计 —— 学生信息管理系统(上)
程序设计基础课程设计 —— 学生信息管理系统(上)
|
7月前
|
存储 编解码 测试技术
图书馆信息管理系统(项目需求和计划、项目设计)(下)
图书馆信息管理系统(项目需求和计划、项目设计)(下)
|
7月前
|
安全 测试技术 数据库
图书馆信息管理系统(项目需求和计划、项目设计)(上)
图书馆信息管理系统(项目需求和计划、项目设计)(上)
|
7月前
|
算法
程序设计基础课程设计 —— 疫苗预约管理系统
程序设计基础课程设计 —— 疫苗预约管理系统
|
7月前
|
小程序 JavaScript Java
宿舍|学生宿舍管理小程序|基于微信小程序的学生宿舍管理系统设计与实现(源码+数据库+文档)
宿舍|学生宿舍管理小程序|基于微信小程序的学生宿舍管理系统设计与实现(源码+数据库+文档)
114 0
|
7月前
|
JavaScript 小程序 Java
基于Java的大学生选修选课系统设计与实现(亮点:多角色、贴近现实的选课流程、好看的系统外观)
基于Java的大学生选修选课系统设计与实现(亮点:多角色、贴近现实的选课流程、好看的系统外观)
151 0