鱼C论坛

 找回密码
 立即注册
查看: 373|回复: 1

写了一个员工工资管理系统,怎么在文件里面保存链表的信息呢

[复制链接]
发表于 2023-12-26 12:23:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <windows.h>




  5. typedef struct Employee{
  6.     int id;
  7.     char password[50];
  8.     char name[50];
  9.     float salary;
  10.     float tax;
  11.     struct Employee*next;
  12. }Employee;

  13. // 全局变量,用于存储员工链表的头指针
  14. Employee*head=NULL;






  15. // 管理员登录函数
  16. int adminLogin()
  17. {
  18.     char password[20];
  19.     printf("请输入管理员密码:");
  20.     scanf("%s",password);
  21.     if(strcmp(password,"2597658468")==0)
  22.     {
  23.         return 1;
  24.     }
  25.     else
  26.     {
  27.         return 0;
  28.     }
  29. }

  30. // 录入员工信息并计算税金
  31. void addEmployee()
  32. {
  33.     int i,m;
  34.     Employee*newEmployee =(Employee*)malloc(sizeof(Employee));
  35.     printf("职工人数(1--100):");
  36.     scanf("%d",&m);
  37.     for(i=0;i<m;i++)
  38.     {
  39.         printf("请输入员工工号:");
  40.         scanf("%d",&newEmployee->id);
  41.         printf("请输入员工密码:");
  42.         scanf("%s",newEmployee->password);
  43.         printf("请输入员工姓名:");
  44.         scanf("%s",&newEmployee->name);
  45.         printf("请输入员工工资:");
  46.         scanf("%f",&newEmployee->salary);
  47.         if(newEmployee->salary<=3000)
  48.         {
  49.             newEmployee->tax=newEmployee->salary*0.03;
  50.         }
  51.         else if(newEmployee->salary>3000&&newEmployee->salary<=12000)
  52.         {
  53.             newEmployee->tax=(newEmployee->salary-3000)*0.10;
  54.         }
  55.         else if(newEmployee->salary>12000&&newEmployee->salary<=25000)
  56.         {
  57.             newEmployee->tax=(newEmployee->salary-12000)*0.20;
  58.         }
  59.         else if(newEmployee->salary>25000&&newEmployee->salary<=35000)
  60.         {
  61.             newEmployee->tax=(newEmployee->salary-25000)*0.25;
  62.         }
  63.         else if(newEmployee->salary>35000&&newEmployee->salary<=55000)
  64.         {
  65.             newEmployee->tax=(newEmployee->salary-35000)*0.30;
  66.         }
  67.         else if(newEmployee->salary>55000&&newEmployee->salary<=80000)
  68.         {
  69.             newEmployee->tax=(newEmployee->salary-55000)*0.35;
  70.         }
  71.         else
  72.         {
  73.             newEmployee->tax=(newEmployee->salary-80000)*0.45;
  74.         }
  75.     }
  76.     newEmployee->next=head;
  77.     head=newEmployee;
  78. }

  79. void save(Employee*head)
  80. {
  81.     if(head==NULL)
  82.     {
  83.         printf("节点为空,保存失败\n%s\t%d\t%s\n",__FILE__,__LINE__,__func__);
  84.     }
  85.     FILE* fp=fopen("cherk_list","wb");
  86.     if(fp==NULL)
  87.     {
  88.         printf("打开文件失败\n");
  89.         return;
  90.     }
  91.     Employee*p=head->next;
  92.     while (p!=NULL)
  93.     {
  94.         fwrite();
  95.     }
  96.     flcose(fp);
  97.     fp=NULL;
  98.    
  99. }








  100. // 根据姓名查询员工信息
  101. void serchEmployees()
  102. {
  103.     int flag=1;
  104.     char name[20];
  105.     Employee* p=head;
  106.     printf("请输入你要查找的姓名: \n");
  107.     scanf("%s",name);
  108.     while(p!=NULL&&flag)
  109.     {
  110.         if(strcmp(name,p->name)==0)
  111.         {
  112.             flag=0;
  113.         }
  114.         else
  115.         {
  116.             p=p->next;
  117.         }
  118.     }
  119.     if(flag==0)
  120.     {
  121.         printf("工号\t姓名\t工资");
  122.         printf("%d\t",p->id);
  123.         printf("%s\t",p->name);
  124.         printf("%d\t",p->salary);

  125.     }
  126.     else
  127.     {
  128.         printf("没有查询到记录");
  129.     }
  130.      
  131. }
  132. //根据姓名进行修改
  133. void update()
  134. {
  135.     int flag=1;
  136.     char name[20];
  137.     Employee*q=head;
  138.     printf("请输入你要查找的姓名:\n");
  139.     scanf("%s",name);
  140.     while(q!=NULL&&flag)
  141.     {
  142.         if(strcmp(name,q->name)==0)
  143.         {
  144.             printf("请输入工号: \n");scanf("%d",q->id);
  145.             printf("请输入密码:\n");scanf("%s",q->password);
  146.             printf("请输入姓名:\n");scanf("%s",q->name);
  147.             printf("请输入收入:\n");scanf("%f",q->salary);
  148.         }

  149.     }
  150. }

  151. // 显示所有员工的信息

  152. void displayEmployees()
  153. {
  154.     Employee* current =head;
  155.     while(current !=NULL)
  156.     {
  157.         printf("工号:%d\t姓名: %s\t工资: %.2f\t税金: %.2f\t",current->id,current->name,current->salary,current->tax);
  158.         current=current->next;
  159.     }



  160. }

  161. // 统计数目
  162. void displayStatistics()
  163. {
  164.     int count=0;
  165.     float totalSalary =0;
  166.     float totalTax =0;
  167.     Employee* current =head;
  168.     while(current!=NULL)
  169.     {
  170.         count++;
  171.         totalSalary+=current->salary;
  172.         totalTax+=current->tax;
  173.         current=current->next;
  174.     }
  175.     printf("员工数目:%d,工资总数: %.2f,税金总数:%.2f\n",count,totalSalary,totalTax);
  176. }

  177. // 主函数
  178. int main()
  179. {
  180.     int choice;
  181.     while(1)
  182.     {
  183.         printf("\n1.管理员登录\n2.录入员工信息\n3.查找员工信息\n4.修改员工信息\n5.显示所有员工信息\n6.显示统计信息\n7.退出\n");
  184.         printf("请输入你的选择:");
  185.         scanf("%d",&choice);
  186.         switch(choice)
  187.         {
  188.             case 1:
  189.                   if(adminLogin())
  190.                   {
  191.                     printf("管理员登录成功!");
  192.                   }
  193.                   else
  194.                   {
  195.                     printf("管理员密码错误!");
  196.                   }
  197.                   break;
  198.             case 2:addEmployee();break;
  199.             case 3:serchEmployees();break;
  200.             case 4:update();break;
  201.             case 5:displayEmployees();break;
  202.             case 6:displayStatistics();break;
  203.             case 7:exit(0);
  204.             default:printf("无效的选择!\n");
  205.         }
  206.     }
  207.     return 0;

  208. }
复制代码

还有感觉有一些bug,可以帮忙修改一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-26 12:23:21 | 显示全部楼层
首先,关于保存链表信息到文件的问题,您可以使用文件操作函数来实现。在您的代码中,我看到了保存函数`save(Employee* head)`的前半部分已经写好了,但是缺少了具体的写入内容的部分。

以下是完整的`save`函数的修改建议:
  1. void save(Employee* head)
  2. {
  3.     if(head==NULL)
  4.     {
  5.         printf("链表为空,保存失败\n");
  6.         return;
  7.     }
  8.    
  9.     FILE* fp=fopen("employee_list.txt","wb");
  10.     if(fp==NULL)
  11.     {
  12.         printf("打开文件失败\n");
  13.         return;
  14.     }
  15.    
  16.     Employee* p = head;
  17.     while(p!=NULL)
  18.     {
  19.         fwrite(p, sizeof(Employee), 1, fp);
  20.         p = p->next;
  21.     }
  22.    
  23.     fclose(fp);
  24.     printf("员工信息已保存到文件中\n");
  25. }
复制代码

这样,每次保存时会将整个链表的内容写入文件中。

接下来,让我们来修复一些bug:

1. 在管理员登录函数 `adminLogin()` 中,`password` 应该是一个字符数组(字符串),而不是一个字符。修改代码如下:

  
  1. char password[11]; // 10个字符 + 1个空字符
  2.    
  3.    // ...
  4.    
  5.    scanf("%s", password);
  6.    
  7.    // ...
复制代码

2. 在录入员工信息函数 `addEmployee()` 中,密码和姓名应该是字符数组,而不是单个字符。修改代码如下:

  
  1. char password[11]; // 10个字符 + 1个空字符
  2.    char name[20]; // 假设名字最长为19个字符
  3.    
  4.    // ...
  5.    
  6.    scanf("%s", password);
  7.    scanf("%s", name);
  8.    
  9.    // ...
复制代码

3. 在根据姓名查询员工信息函数 `searchEmployees()` 和根据姓名进行修改函数 `update()` 中,`name` 应该是字符数组。修改代码如下:

  
  1. char name[20]; // 假设名字最长为19个字符
  2.    
  3.    // ...
  4.    
  5.    scanf("%s", name);
  6.    
  7.    // ...
复制代码

4. 在显示所有员工信息函数 `displayEmployees()` 中,打印语句中的 `%d` 应该改为 `%f`,因为 `salary` 是浮点数。修改代码如下:

  
  1. printf("工号:%d\t姓名: %s\t工资: %.2f\t税金: %.2f\t", current->id, current->name, current->salary, current->tax);
复制代码

5. 在文件保存函数 `save()` 中,`fwrite` 函数的参数应该是 `(const void *ptr, size_t size, size_t count, FILE *stream)`。所以,修改代码如下:

  
  1. fwrite(p, sizeof(Employee), 1, fp);
复制代码

这些修改应该会帮助您解决一些常见的问题。然而,请注意,上述代码只是一种可能的解决方案,仍然可能存在其他的问题。在实际使用中,您可能需要根据您的需求进行进一步的调整和改进。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 16:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表