700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言实现的员工工资管理系统

C语言实现的员工工资管理系统

时间:2020-01-26 19:08:40

相关推荐

C语言实现的员工工资管理系统

看点:

1. 枚举类型的使用(录入与输出)

2. 文件的使用:用文件来存储员工信息,开始运行程序时从文件中读取员工信息到链表退出程序时将员工信息保存到文件中。

2_1. 存储结构体这样的数据块所使用的文件操作函数;

2_2. feof()函数作为循环条件的正确使用方法;

3. 链表的相关操作

3_1. 结构体中char类型的数据写入方式

4. while循环下实现的菜单与子菜单

注:部分功能还没有实现,涉及到单链表的遍历,比较简单。

头文件:标头.h

#include<malloc.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//枚举型岗位:销售员、技术员、销售经理、经理enum workpost { SALESMAN = 0, TECHNICIAN, SALESMANAGER, MANAGER };//员工类型:链表结点struct Employee {int id;//员工号:主键,唯一char name[10];//姓名char sex[3];//性别:男或女int age;//年龄char department[20];//部门enum workpost post;//枚举型岗位int workHour;//当月工作小时数double sales;//当月月销售额double salary;//月工资struct Employee * next;//链表的指针域};#define LENGTH 50//全局变量Employee Employees[LENGTH];typedef int DataType;Employee *head;int select = 1;//功能选择变量int subselect = 1;//子功能选择变量FILE *fp;int i = 0;//循环变量//函数声明void ListInitiate(Employee **head);void Load();void Check();void AddData();void UpdataData();void QueryData();void DeleteData();void Sorting();void Statistics();void Save();//菜单函数//要求:至少有两层菜单。void Menu(){while (select){printf("————————员工工资管理系统————————\n");printf("————1. 增添数据 2. 修改数据————\n");printf("————3. 查找数据 4. 删除数据————\n");printf("————5. 排序函数 6. 统计数据————\n");printf("————0. 退出程序 7. 查看链表————\n");printf("请输入你的选择:\n");scanf("%d", &select);switch (select){case 1:AddData();break;case 2:UpdataData();break;case 3:QueryData();break;case 4:DeleteData();break;case 5:Sorting();break;case 6:Statistics();break;case 7:Check();break;case 0: break;default: printf("输入错误!请重新选择。\n");}}}//功能函数//初始化链表函数void ListInitiate(Employee **head)//head是一个指针,*head也是一个指针{*head = (Employee *)malloc(sizeof(Employee));//申请头结点(*head)->next = NULL;}//必须用文件来存储员工信息://开始运行程序时从文件中读取员工信息到链表,退出程序时将员工信息保存到文件中。void Load() {if ((fp = fopen("Employee.txt", "ab+")) == NULL){printf("打开文件出错!\n");exit(1);}//未知文件长度,使用feof(FILE *Stream)判断文件结尾while (!feof(fp)){//feof(fp)通过fread/fscanf是否读写出错判断,应该在读写操作之后进行判断,否则多进行一轮循环if (fread(&Employees[i], sizeof(struct Employee), 1, fp) == 0){continue;}Employee *p, *q;//分别用于指向第i个结点和待插入的新结点p = head;while (p->next != NULL)//把指针P定位到链表尾位置{p = p->next;}q = (Employee *)malloc(sizeof(Employee));//用指针Q申请新结点//存入数据到链表结点q->id = i;q->id++;strcpy(q->name, Employees[i].name);strcpy(q->sex, Employees[i].sex);q->age = Employees[i].age;strcpy(q->department, Employees[i].department);q->post = Employees[i].post;q->workHour = Employees[i].workHour;q->sales = Employees[i].sales;//当月月销售额q->salary = Employees[i].salary;//月工资q->next = p->next;//Q指针的next域指向P指针的next域,即第i个结点p->next = q;i++;}fclose(fp);}//检查链表数据输入是否准确void Check(){Employee *p;p = head;if (p->next == NULL){printf("链表为空!\n");}else{printf("链表数据内容为:\n");while (p->next != NULL){p = p->next;printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department);switch (p->post){case 0:printf("SALESMAN ");break;case 1:printf("TECHNICIAN ");break;case 2:printf("SALESMANAGER");break;case 3:printf("MANAGER");break;default:printf("数据有误!\n");break;}printf(" %d %.2lf %.2lf\n", p->workHour, p->sales, p->salary);}printf("输出完毕!\n");}}//增添数据//添加一个员工,只输入该员工的基本信息(姓名、年龄、性别、部门、岗位)。void AddData(){Employee *p, *q;//分别用于指向第i个结点和待插入的新结点p = head;while (p->next != NULL)//把指针P定位到链表尾位置{p = p->next;}q = (Employee *)malloc(sizeof(Employee));//用指针Q申请新结点i++;q->id = i;printf("请输入员工姓名:\n");scanf("%s", q->name);printf("请输入员工年龄:\n");scanf("%d", &q->age);printf("请输入员工性别:\n");scanf("%s", q->sex);printf("请输入员工部门:\n");scanf("%s", q->department);printf("请输入员工岗位:\n");scanf("%d", &q->post);q->workHour = 0;if (q->post == 3){q->salary = 8000.0;}else{q->salary = 0.0;}q->sales = 0.0;q->next = p->next;//Q指针的next域指向P指针的next域,即第i个结点p->next = q;printf("添加成功!\n");}//修改数据/*1)根据员工号来修改任意员工的基本信息(姓名、年龄、性别、部门、岗位)。2)批量计算所有技术员的当月工资额(需填写技术员当月工作时间)。3)批量计算所有销售员的当月工资额(需填写销售员当月销售额);然后批量计算所有销售经理的当月工资额。*/void UpdataData(){subselect = 1;Employee *p, *p1;p = head;while (subselect){printf("—————— 修改数据的二级菜单 ——————\n");printf("——1. 根据员工号来修改任意员工的基本信息\n");printf("——2. 批量计算所有技术员的当月工资额\n");printf("——3. 批量计算所有销售员的当月工资额,然后批量计算所有销售经理的当月工资额\n");printf("——0. 退出此子菜单\n");printf("请输入你的选择:\n");scanf("%d", &subselect);switch (subselect){case 1:p = head;int ID;printf("请输入待修改的员工信息的员工号:\n");scanf("%d", &ID);while (p->next != NULL){p = p->next;if (p->id == ID){printf("请输入新的员工姓名:\n");scanf("%s", p->name);printf("请输入新的员工年龄:\n");scanf("%d", &p->age);printf("请输入新的员工性别:\n");scanf("%s", p->sex);printf("请输入新的员工部门:\n");scanf("%s", p->department);printf("请输入新的员工岗位:\n");scanf("%d", &p->post);printf("信息录入成功!\n");break;}}break;case 2://批量计算所有技术员的当月工资额,技术员工资:工作时间*小时工资(100元每小时)p = head;while (p->next != NULL){p = p->next;if (p->post == 1){printf("请填写员工号为%d的技术员当月工作时间:\n", p->id);scanf("%d", &p->workHour);p->salary = p->workHour * 100;}}break;case 3://销售员工资:销售额*4%提成;p = head;while (p->next != NULL){p = p->next;if (p->post == 0){printf("请填写员工号为%d的销售员当月销售额:\n", p->id);scanf("%lf", &p->sales);p->salary = p->sales*0.04;}} //销售经理:底薪(5000)+所辖部门销售额总额*0.5%。p = head;while (p->next != NULL){p = p->next;p1 = head;double sum_of_sales = 0.0;if (p->post == 2){while(p1->next != NULL){p1 = p1->next;if (strcmp(p->department, p1->department)==0){sum_of_sales += p1->sales ;}}p->salary = sum_of_sales * 0.005 + 5000;}}break;case 0:break;default:printf("输入错误!请重新选择。\n");}}}//查询数据void QueryData(){subselect = 1;Employee *p;p = head;while (subselect){printf("—————— 查询数据的二级菜单 ——————\n");printf("——1. 根据工号或者姓名查询员工信息\n");printf("——2. 按部门显示本部门全部员工信息\n");printf("——3. 分别显示4种岗位的员工信息\n");printf("——4. 分页显示全部员工的信息\n");printf("——0. 退出此子菜单\n");printf("请输入你的选择:\n");scanf("%d", &subselect);switch (subselect){case 1:p = head;int ID;printf("请输入工号:\n");scanf("%d", &ID);while (p->next != NULL){p = p->next;if (p->id == ID){printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department);switch (p->post){case 0:printf("SALESMAN ");break;case 1:printf("TECHNICIAN ");break;case 2:printf("SALESMANAGER");break;case 3:printf("MANAGER");break;default:printf("数据有误!\n");break;}printf(" %d %.2lf %.2lf\n", p->workHour, p->sales, p->salary);printf("输出完毕!\n");}}break;case 2:char Department[20];printf("请输入部门名称:\n");scanf("%s", &Department);p = head;while(p->next != NULL){p = p->next;if (strcmp(p->department, Department)==0){printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department);switch (p->post){case 0:printf("SALESMAN ");break;case 1:printf("TECHNICIAN ");break;case 2:printf("SALESMANAGER");break;case 3:printf("MANAGER");break;default:printf("数据有误!\n");break;}printf(" %d %.2lf %.2lf\n", p->workHour, p->sales, p->salary);}}printf("输出完毕!\n");break;case 3:printf("SALESMAN:\n");p = head;while (p->next != NULL){p = p->next;if (p->post==0){printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department);switch (p->post){case 0:printf("SALESMAN ");break;case 1:printf("TECHNICIAN ");break;case 2:printf("SALESMANAGER");break;case 3:printf("MANAGER");break;default:printf("数据有误!\n");break;}printf(" %d %.2lf %.2lf\n", p->workHour, p->sales, p->salary);}} printf("TECHNICIAN:\n");p = head;while (p->next != NULL){p = p->next;if (p->post==1){printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department);switch (p->post){case 0:printf("SALESMAN ");break;case 1:printf("TECHNICIAN ");break;case 2:printf("SALESMANAGER");break;case 3:printf("MANAGER");break;default:printf("数据有误!\n");break;}printf(" %d %.2lf %.2lf\n", p->workHour, p->sales, p->salary);}} printf("SALESMANAGER:\n");p = head;while (p->next != NULL){p = p->next;if (p->post==2){printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department);switch (p->post){case 0:printf("SALESMAN ");break;case 1:printf("TECHNICIAN ");break;case 2:printf("SALESMANAGER");break;case 3:printf("MANAGER");break;default:printf("数据有误!\n");break;}printf(" %d %.2lf %.2lf\n", p->workHour, p->sales, p->salary);}} printf("MANAGER:\n");p = head;while (p->next != NULL){p = p->next;if (p->post==3){printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department);switch (p->post){case 0:printf("SALESMAN ");break;case 1:printf("TECHNICIAN ");break;case 2:printf("SALESMANAGER");break;case 3:printf("MANAGER");break;default:printf("数据有误!\n");break;}printf(" %d %.2lf %.2lf\n", p->workHour, p->sales, p->salary);}} printf("输出完毕!\n");break;case 4:printf("分页功能略难(没学过),暂时留空吧\n");break;case 0:break;default:printf("输入错误!请重新选择。\n");}}}//删除数据void DeleteData(){Employee *p, *s;p = head;printf("请输入要删除员工信息的员工号:\n");scanf("%d", &i);while (p->next != NULL){s = p;p = p->next;if(p->id==i) break;}s->next = s->next->next;free(p);}//按要求排序void Sorting(){subselect = 1;Employee *p, *p1;int z = 0;int f=0;int count = 0;double s[20];double storeNum;p = head;while (subselect){printf("—————— 排序数据的二级菜单 ——————\n");printf("——1. 所有员工信息按当月工资从高到低并显示\n");printf("——2. 某个岗位的员工信息按当月工资从高到低显示\n");printf("——0. 退出此子菜单\n");printf("请输入你的选择:\n");scanf("%d", &subselect);switch (subselect){case 1:p = head;z = 0; while (p->next != NULL){p = p->next;s[z] = p->salary;z++;}//冒泡排序 for (int i = 0; i < z-1; i++)//因为进行两两比较,10个数最坏的情况就需要进行9趟{for (int j = 0; j < (z-1) - i; j++)//因为每进行一趟就可以排好一个数,所以循环次数-i{if (s[j] > s[j+1])//两两比较{double temp = s[j];s[j] = s[j+1];s[j+1] = temp;}}}z--;for (int i = z; i >= 0; i--){if(storeNum == s[i]){continue;}p = head;while (p->next != NULL){p = p->next;storeNum = s[i];if(p->salary==s[i]){printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department);switch (p->post){case 0:printf("SALESMAN ");break;case 1:printf("TECHNICIAN ");break;case 2:printf("SALESMANAGER");break;case 3:printf("MANAGER");break;default:printf("数据有误!\n");break;}printf(" %d %.2lf %.2lf\n", p->workHour, p->sales, p->salary);}}}break;case 2:int Post;z = 0;storeNum = 0.0;printf("请输入岗位信息:(SALESMAN = 0, TECHNICIAN, SALESMANAGER, MANAGER)\n");scanf("%d", &Post);p = head;while(p->next != NULL){p = p->next;if (p->post==Post){s[z] = p->salary;z++;}}//冒泡排序 for (int i = 0; i < z-1; i++){for (int j = 0; j < (z-1) - i; j++)//因为每进行一趟就可以排好一个数,所以循环次数-i{if (s[j] > s[j+1])//两两比较{double temp = s[j];s[j] = s[j+1];s[j+1] = temp;}}}z--;for (int i = z; i >= 0; i--){if(storeNum == s[i]){continue;}p = head;while (p->next != NULL){p = p->next;if(p->salary==s[i]&&p->post==Post){storeNum = s[i];printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department);switch (p->post){case 0:printf("SALESMAN ");break;case 1:printf("TECHNICIAN ");break;case 2:printf("SALESMANAGER");break;case 3:printf("MANAGER");break;default:printf("数据有误!\n");break;}printf(" %d %.2lf %.2lf\n", p->workHour, p->sales, p->salary);}}} break;case 0:break;default:printf("输入错误!请重新选择。\n");}}}//统计数据void Statistics(){printf("hh\n");}//保存链表数据到文件void Save(){Employee *p;p = head;i = 0;//第一步将链表中的结点信息存入数组中while (p->next != NULL){p = p->next;Employees[i].id = p->id;strcpy(Employees[i].name, p->name);strcpy(Employees[i].sex, p->sex);Employees[i].age = p->age;strcpy(Employees[i].department, p->department);Employees[i].post = p->post;Employees[i].workHour = p->workHour;Employees[i].sales = p->sales;//当月月销售额Employees[i].salary = p->salary;//月工资i++;}//第二步将数组数据录入文本文件if ((fp = fopen("employee.txt", "wb+")) == NULL){printf("打开文件出错!\n");exit(1);}p = head;i = 0;while (p->next != NULL){p = p->next;if (fwrite(&Employees[i], sizeof(struct Employee), 1, fp) != 1){printf("写入文件出错!\n");}i++;}fclose(fp);printf("成功保存数据到文本文件employee\n");}

Main函数:

#include"标头.h"int main(){ListInitiate(&head);Load();//加载已有的数据到链表Menu();Save();//保存数据到文件printf("欢迎下次使用!\n");}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。