C语言课程设计员工工资管理系统

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef enum workpost WOP;
typedef struct empolyee EMP;
enum workpost { manager = 1, technician, salesperson, salesmanager };
struct empolyee
{
	int num;       //工号
	char name[20];//姓名
	char sex[3];//性别
	char department[20];//部门
	int age;//年龄
	float salary;//当月工资
	WOP wop;//  职位             
	union
	{
		int worktime;//技术员需要工作时间
		int amount;//销售员需要销售额
	}work;
	struct empolyee *next;//指向下一个链表
};
void menu_head(char *head)//打印菜单首部
{
	system("cls");
	printf("\n  -------------------| 员工工资管理系统 |-------------------\n\n");
	printf("\n  ---------------------| %s |---------------------\n", head);
}
void menu_workpost()//岗位选择菜单
{
	 printf("\n  ---------------------| 请选择岗位 |-----------------------\n");
	 printf("  ==========================================================\n");
	 printf("  ||                                                      ||\n");
	 printf("  ||         - 1 - 经理             - 2 - 技术员          ||\n");
	 printf("  ||                                                      ||\n");
	 printf("  ||         - 3 - 销售员           - 4 - 销售经理        ||\n");
	 printf("  ||                                                      ||\n");
	 printf("  ||         - 0 - 退出                                   ||\n");
	 printf("  ||                                                      ||\n");
	 printf("  ==========================================================\n\n");
	 printf("  --请输入您的选择:");
}
void menu_condition()//选择条件菜单
{
	printf("\n  --请选择条件\n\n");
	printf("  ==========================================================\n");
	printf("  ||                                                      ||\n");
	printf("  ||     - 1 - 职工号     - 2 - 姓名     - 0 - 退出       ||\n");
	printf("  ||                                                      ||\n");
	printf("  ==========================================================\n");
	printf("\n  --请输入您的选择:");
}
void pause()//停止功能
{
	printf("\n  所有数据显示完毕!按任意键返回...");
	getchar();
	getchar();
}
void print_emp_h()//打印员工信息首部
{
	printf("\n  =======================| 员工信息 |=======================\n\n");
	printf("  ==========================================================\n\n");
	printf("  ||职工号|姓名|性别|部门|年龄|当月工资|岗位|工作时间/销售额||\n");
}
void print_emp(EMP *p)//打印员工信息
{
	if (p == NULL) printf("  无数据!");
	printf("  || %-5d%-7s%-3s%-7s%-4d%-9.2f", p->num, p->name, p->sex, p->department, p->age, p->salary);
	switch (p->wop)//workpost
	{
	case manager:printf("%-6s              ||\n", "经理"); break;
	case technician:printf("%-12s", "技术员"); printf("%-8d||\n", p->work.worktime); break;
	case salesperson:printf("%-12s", "销售员"); printf("%-8d||\n", p->work.amount); break;
	case salesmanager:printf("%-8s            ||\n", "销售经理");
	}
}
void sex_choice(EMP *p)//添加或修改员工性别
{
	int sel;
	while (1)
	{
		printf("  --请选择性别(1 - 男性    2 - 女性):");
		scanf("%d", &sel);
		if (sel == 1)
		{
			strcpy(p->sex, "男"); break;
		}
		else if (sel == 2)
		{
			strcpy(p->sex, "女"); break;
		}
		else printf("  输入有误!请重新输入!\n");
	}
}
int clean_inf()//恢复出厂设置
{
	FILE *fp = NULL;
	int sel1;
	system("cls");
	printf("  -------------------| 员工工资管理系统 |-------------------\n");
	printf("  ---------------------| 恢复出厂设置 |---------------------\n");
	printf("\n  --恢复出厂设置会清除员工数据信息,是否继续?\n");
	printf("  ==========================================================\n");
	printf("  ||                                                      ||\n");
	printf("  ||          - 1 - 是                 - 2 - 否           ||\n");
	printf("  ||                                                      ||\n");
	printf("  ==========================================================\n");
	printf("\n  --请输入您的选择:");
	scanf("%d", &sel1);
	if (sel1 == 1)
	{
		printf("\n  --正在清除员工信息,请稍后...\n");
		if ((fp = fopen("employee.txt", "wb")) == NULL)//以“可写”的方式打开文件,清空当前文件夹下的employee.txt文件
		{
			printf("\n  --错误:无法读取员工数据文件\n");
			exit(0);
		}
		printf("\n  --清除员工信息成功!\n");
		fclose(fp);
	}
	return sel1;
}
void count_smsalary(EMP *head, EMP *p) //计算该员工的部门经理的工资;
{
	EMP *p1 = NULL, *p2 = NULL;
	int tamount = 0;
	p2 = head;
	while (!((strcmp(p2->department, p->department) == 0) && (p2->wop == salesmanager)) && (p2->next != NULL)) p2 = p2->next;//直到(同部门、是经理)&&(不为空)
	if ((p2->wop == salesmanager) && (strcmp(p2->department, p->department) == 0)) //(同部门、是经理)&&(不为空)
	{
		p1 = p2;//p1指向该部门的经理
		p2 = head;//p2重新找该部门的销售员
		while (p2 != NULL)
		{
			if ((p2->wop == salesperson) && (strcmp(p->department, p2->department) == 0))
				tamount += p2->work.amount;
			p2 = p2->next; //计算该部门所有销售员销售总额
		}
		if(p1->wop==salesmanager)
		p1->salary = (float)(5000 + tamount / 200);//0.5%->5/1000->1/200;计算该部门销售经理的工资
	}
}
void count_emp(EMP *head, int sel)//统计计算所有员工按部门,全部的工资max,min,ave
{
	EMP *p = NULL;
	char department[20];
	float max=0, min=0, ave=0;
	int count=0;
	switch (sel)
	{
	case 1://计算部门平均、最低台、最高工资信息
	{
		printf("\n  --请输入部门:");
		scanf("%s", department);
		p = head;
		while (p != NULL)
		{
			if (strcmp(p->department, department)==0)
			{
				max = min = p->salary;//初始化
				break;//找出其部门第一个
			}
			p = p->next;
		 
		}
		p = head;//重新开始,计算max,min,ave
		while (p != NULL)
		{
			if (strcmp(p->department, department) == 0)
			{
				if (p->salary > max) max = p->salary;
				if (p->salary < min) min = p->salary;
				ave += p->salary;
				count++;
			}
			p = p->next;
		}
		ave /= count;//ave = ave / count;
		printf("\n  --%s部门平均、最低台、最高工资信息如下:\n\n", department);
		printf("  ==========================================================\n");
		printf("  ||                                                      ||\n");
		printf("  ||           平均工资:%-8.2f                           ||\n",ave);
		printf("  ||           最高工资:%-8.2f                           ||\n", max);
		printf("  ||           最低工资:%-8.2f                           ||\n",min);
		printf("  ||                                                      ||\n");
		printf("  ==========================================================\n");
		pause();
	}break;//break出case1
	case 2://计算部门超过平均工资员工信息如下
	{
		printf("\n  --请输入部门:");
		scanf("%s", department);
		p = head;
		while (p != NULL)//先计算平均数
		{
			if (strcmp(p->department, department) == 0);
			{
				ave += p->salary;
				count++;
			}
			p = p->next;
		}
		ave /= count;
		count = 0;
		printf("\n  --%s部门超过平均工资员工信息如下:\n", department);
		print_emp_h();
		p = head;
		while (p != NULL)
		{
			if ((strcmp(p->department, department) == 0) && (p->salary > ave))
			{
				count++;
				print_emp(p);
			}
			p = p->next;
		}
		printf("\n  共%d人\n", count);
		pause();
	}break;//break出case2
	case 3://计算所有员工平均、最低、最高工资信息
	{
		p = head;
		max = min = p->salary;
		while (p != NULL)
		{
			if (p->salary > max) max = p->salary;
			if (p->salary < min) min = p->salary;
			ave += p->salary;
			count++;
			p = p->next;
		}
		ave /= count;
		printf("\n  --所有员工平均、最低、最高工资信息如下:\n");
		printf("  ==========================================================\n");
		printf("  ||                                                      ||\n");
		printf("  ||          平均工资:%-8.2f                            ||\n", ave);
		printf("  ||          最高工资:%-8.2f                            ||\n", max);
		printf("  ||          最低工资:%-8.2f                            ||\n", min);
		printf("  ||                                                      ||\n");
		printf("  ==========================================================\n");
		pause();
	}break;
	case 4://计算所有超过平均工资员工信息
	{
		p = head;
		while (p != NULL)
		{
			count++;
			ave += p->salary;
			p = p->next;
		}
		ave /= count;
		count = 0;
		printf("\n  --超过平均工资员工信息如下:\n");
		print_emp_h();
		p = head;
		while (p != NULL)
		{
			if(p->salary > ave)
			{
				count++;
				print_emp(p);
			}
			p = p->next;
		}
		printf("\n  共%d人\n", count);
		pause();
	}break;
	}
}
void sort_emp(EMP *head, int sel)//排序
{
	int count, sel1;
	float max, min, max1;
	int minnum, maxnum, minnum1;
	EMP *p=NULL, *p1=NULL;
	p = head;
	switch (sel)
	{
	case 1://全部员工根据工资由大到小排序
	{
		p = head;
		max = min = p->salary;
		while (p != NULL)
		{
			if (p->salary > max) max = p->salary;
			if (p->salary < min) min = p->salary;
			p = p->next;
		}
		max1 = max + 1;//保存最大值
		printf("\n  --全体员工信息排序:\n");
		print_emp_h();
		while (1)//1循环
		{
			max = min;
			p = head;
			while (p != NULL)
			{
				if ((p->salary>max) && (p->salary < max1)) max = p->salary;
				p = p->next;
			}
			p = head;
			count = 0;
			while (p != NULL)//2循环2
			{
				if (p->salary == max)
				{
					p1 = p;
					count++;//找出最大值的员工个数,方便检查是否个数为1;
				}
				p = p->next;
			}
			if (count == 1) print_emp(p1);//只有一个员工时直接输出
			else//多个员工排序,找出他们的工号输出
			{
				maxnum = minnum = p1->num;//此时的p1是有最大值的最后一位员工
				p = head;
				while (p != NULL)
				{
					if ((p->salary == max) && (p->num > maxnum)) maxnum = p->num;//找出最大值中最前最后的员工
					if ((p->salary == max) && (p->num < minnum)) minnum = p->num;
					p = p->next;
				}
				minnum1 = minnum - 1;
				while (1)
				{
					minnum = maxnum;
					p = head;
					while (p != NULL)
					{
						if ((p->salary == max) && (p->num <= minnum) && (p->num>minnum1))
						{
							minnum = p->num;
							p1 = p;
						}
						p = p->next;
					}
					print_emp(p1);
					minnum1 = minnum;
					if (minnum == maxnum) break;
				}
			}
			max1 = max;
			if (max == min) break;
		}
		pause();
	}break;
	case 2://按岗位排序
	{
		menu_workpost();
		scanf("%d", &sel1);
		if(sel1==0)break;
		if(sel1 != 0 && sel1 != 1 && sel1 != 2 && sel1 != 3 && sel1 != 4)
		{
			printf("\n  --选择有误!请按任意键返回上一层菜单! ");getchar(); getchar();break;
		}
		switch (sel1)
		{
		case 1:printf("\n  --经理员工信息排序:\n"); break;
		case 2:printf("\n  --技术员员工信息排序:\n"); break;
		case 3:printf("\n  --销售员员工信息排序:\n"); break;
		case 4:printf("\n  --销售经理员工信息排序:\n"); break;
		}
		p = head;
		max = min = p->salary;
		while (p != NULL)
		{
			if ((p->salary > max) && (p->wop == WOP(sel1))) max = p->salary;
			if ((p->salary < min) && (p->wop== WOP(sel1))) min = p->salary;
			p = p->next;
		}
		max1 = max + 1;
		printf("\n  --全体员工信息排序:\n");
		print_emp_h();
		while (1)
		{
			max = min;
			p = head;
			while (p != NULL)
			{
				if ((p->salary>max) && (p->salary < max1)&&(p->wop==WOP(sel1))) max = p->salary;
				p = p->next;
			}
			p = head;
			count = 0;
			while (p != NULL)
			{
				if ((p->salary == max) && (p->wop == WOP(sel1)))
				{
					p1 = p;
					count++;
				}
				p = p->next;
			}
			if (count == 1) print_emp(p1);
			else
			{
				maxnum = minnum = p1->num;
				p = head;
				while (p != NULL)
				{
					if ((p->salary == max) && (p->num > maxnum) && (p->wop == WOP(sel1))) maxnum = p->num;
					if ((p->salary == max) && (p->num < minnum) && (p->wop == WOP(sel1))) minnum = p->num;
					p = p->next;
				}
				minnum1 = minnum - 1;
				while (1)
				{
					minnum = maxnum;
					p = head;
					while (p != NULL)
					{
						if ((p->salary == max) && (p->num <= minnum) && (p->num>minnum1) && (p->wop == WOP(sel1)))
						{
							minnum = p->num;
							p1 = p;
						}
						p = p->next;
					}
					print_emp(p1);
					minnum1 = minnum;
					if (minnum == maxnum) break;
				}
			}
			max1 = max;
			if (max == min) break;
		}
		pause();
	}
	}
}
void inquiry_emp(EMP *head, int sel)//浏览员工信息
{
	int sel1,sel2, count, page, npage=1,num;
	char department[20], name[20];
	EMP *p;
	switch (sel)
	{
	case 1://按照工号
	{
		printf("\n  --全体员工信息表:\n");
		count = 0;
		p = head;
		while (p != NULL)//计算有多少个员工
		{
			count++;
			p = p->next;
		}
		page = count / 10;//共多少页
		if ((count - page * 10)>0) page += 1;//看是否整十,   如56/10=5,56>50,所以要加一页
		npage = 1;//numpage设定为第一页
		while (1)
		{
			count = 0;
			p = head;
			while (p != NULL)
			{
				if (count == (npage - 1) * 10) break;//如果是0 ,就不用数了
				count++;
				p = p->next;
			}
			p = head;
			
			print_emp_h();//应该写在下面的while里面第二行
			while (p != NULL)
			{
				
				
				print_emp(p);
				count++;
				if (count == npage * 10) break;
				p = p->next;//分页后没有改变成员信息
			}
			printf("  ==========================================================\n");
			printf("  ||              当前页数:第%d页           共%d页           ||\n", npage, page);
			printf("  ==========================================================\n");
			printf("  || 1 - 首页  2 - 上一页  3 - 下一页  4 - 尾页  0 -退出    ||\n");
			printf("  ==========================================================\n");
			printf("\n  --请输入您的选择:");
			scanf("%d", &sel1);
			if (sel1 == 0) break;
			switch (sel1)
			{
			case 1:npage = 1; break;
			case 2:if (npage == 1); else npage -= 1; break;
			case 3:if (npage == page); else npage += 1; break;
			case 4:npage = page; break;
			}
		}
		}break;
	case 2://按照部门
	{
		printf("\n  --请输入部门名:");
		scanf("%s", department);
		p = head;
		printf("\n  --%s部门的员工信息表:\n",department);
		print_emp_h();
		while (p != NULL)
		{
			if (strcmp(p->department, department) == 0) print_emp(p);
			p = p->next;
		}
		pause();
	}break;
	case 3://按照岗位
	{
		while (1)
		{
			menu_workpost();
			scanf("%d", &sel1);
			p = head;
			if (sel1 == 0) break;
			switch (sel1)
			{
			case 1:
				printf("\n  --经理的员工信息表:\n");
				print_emp_h();
				while (p != NULL)
				{
					if (p->wop == manager) print_emp(p);
					p = p->next;
				}
				break;
			case 2:
				printf("\n  --技术员的员工信息表:\n");
				print_emp_h();
				while (p != NULL)
				{
					if (p->wop == technician) print_emp(p);
					p = p->next;
				}
				break;
			case 3:
				printf("\n  --销售员的员工信息表:\n");
				print_emp_h();
				while (p != NULL)
				{
					if (p->wop == salesperson) print_emp(p);
					p = p->next;
				}
				break;
			case 4:
				printf("\n  --技术员的员工信息表:\n");
				print_emp_h();
				while (p != NULL)
				{
					if (p->wop == salesmanager) print_emp(p);
					p = p->next;
				}
				break;
			default:printf("\n  --选择有误!"); getchar();getchar();
			}
			pause();
		}
	}break;
	case 4://按照已知条件
	{
		menu_condition();
		scanf("%d", &sel1);
		p = head;
		switch (sel1)
		{
		case 1:
		{
			printf("\n  --请输入员工号:");
			scanf("%d", &num);
			while ((p->num != num) && (p != NULL)) p = p->next;
			if (p->num != num)
			{
				printf("\n  无该员工号!\n");
				sel1 = 0;
			}
		}break;
		case 2:
		{
			printf("\n  --请输入姓名:");
			scanf("%s", name);
			while ((strcmp(p->name, name) != 0) && (p != NULL))	p = p->next;
			if (strcmp(p->name, name) != 0)
			{
				printf("\n  无该员工姓名!\n");
				sel1 = 0;
			}
		}break;
		}
		if (sel1)
		{
			printf("\n  已找到该员工信息!\n");
			printf("\n  --该员工信息如下:");
			print_emp_h();
			print_emp(p);
			pause();
		}
	}break;
	}
}
EMP *del_emp(EMP *head, int sel)//删除
{
	int num, sel1;
	char name[20];
	EMP *p = head, *p1 = NULL;
	switch (sel)
	{
	case 1:
	{
		printf("\n  --请输入员工号:");
		scanf("%d", &num);
		while ((p->num != num) && (p != NULL))//不是所找工号&&不为空(直到找到是所找的员工)
		{
			p1 = p;
			p = p->next;//因为找到员工号或空而跳出
		}
		if (p->num != num)
		{
			printf("\n  无该员工号!\n");
			sel1 = 0;//sel1返回0
		}
	}break;
	case 2:
	{
		printf("\n  --请输入姓名:");
		scanf("%s", name);
		while ((strcmp(p->name, name) != 0) && (p != NULL))
		{
			p1 = p;
			p = p->next;
		}
		if (strcmp(p->name, name) != 0)
		{
			printf("\n  无该员工姓名!\n");
			sel1 = 0;//sel1返回0
		}
	}break;
	}
	if (sel)//如果有这个员工
	{
		pause();
		printf("\n  已找到该员工信息!\n");
		printf("\n  --该员工信息如下:");
		print_emp_h();
		print_emp(p);
		printf("  -----------------------| 是否删除 |-----------------------\n");
		printf("  ==========================================================\n");
		printf("  ||                                                      ||\n");
		printf("  ||            - 1 - 是                 - 2 - 否         ||\n");
		printf("  ||                                                      ||\n");
		printf("  ==========================================================\n");
		printf("\n  --请输入您的选择:");
		scanf("%d", &sel1);
		if (sel1 == 1)
		{
			if (head == p) head = p->next;
			else p1->next = p->next;//p1是p的上一个
			free(p);//删除p
		}
		printf("\n  删除成功!\n");
	}
	return head;//
}
EMP *edit_emp(EMP *head, int sel)//修改员工信息
{
	int num, sel1 = 1;
	char name[20];
	EMP *p = NULL;
	switch (sel)
	{
	case 1:
	{
		printf("\n  --请输入员工号:");
		scanf("%d", &num);
		p = head;
		while ((p->num != num) && (p->next != NULL)) p = p->next;
		if (p->num != num)
		{
			printf("\n  无该员工号!\n");
			sel1 = 0;
		}
	}break;
	case 2:
	{
		printf("\n  --请输入姓名:");
		scanf("%s", name);
		p = head;
		while ((strcmp(p->name, name) != 0) && (p->next != NULL)) p = p->next;
		if (strcmp(p->name, name) != 0)
		{
			printf("\n  无该员工姓名!\n");
			sel1 = 0;
		}
	}break;
	}
	if (sel1)
	{
		printf("\n  已找到该员工信息!\n");
		printf("\n  --该员工信息如下:");
		print_emp_h();
		print_emp(p);
		printf("\n  --请选择要修改的信息:\n");
		printf("\n  ----------------------| 请选择内容 |----------------------\n");
		printf("  ==========================================================\n");
		printf("  ||                                                      ||\n");
		printf("  ||    - 1 - 姓名       - 2 - 性别       - 3 - 部门      ||\n");
		printf("  ||                                                      ||\n");
		printf("  ||    - 4 - 岗位       - 5 - 年龄       - 0 - 取消操作  ||\n");
		printf("  ||                                                      ||\n");
		if (p->wop == technician)
		{
			printf("  ||    - 6 - 工作时间                                    ||\n");
			printf("  ||                                                      ||\n");
		}
		if (p->wop == salesperson)
		{
			printf("  ||    - 6 - 销售额                                        ||\n");
			printf("  ||                                                        ||\n");
		}
		printf("  ==========================================================\n");
		printf("\n  --请输入您的选择:");
		scanf("%d", &sel);
		switch (sel)
		{
		case 1:
			printf("\n  --请输入姓名:");
			scanf("%s", p->name);
			break;
		case 2:
			sex_choice(p);
			break;
		case 3:
			printf("\n  --请输入部门:");
			scanf("%s", p->department);
			break;
		case 4:
		{
			menu_workpost();
			scanf("%d", &sel);
			switch (sel)
			{
				p->wop = manager;
				p->salary = 8000;
				break;
			case 2:
				p->wop= technician;
				printf("\n  --已更改成技术员,是否输入工作时间?( 1 - 是    2 - 否 ):");
				scanf("%d", &sel);
				if (sel == 1)
				{
					printf("\n  --请输入工作时间:");
					scanf("%d", &p->work.worktime);
					p->salary = (float)p->work.worktime * 100;
				}
				break;
			case 3:
				p->wop = salesperson;
				printf("\n  --已更改成销售员,是否输入销售额?( 1 - 是    2 - 否 ):");
				scanf("%d", &sel);
				if (sel == 1)
				{
					printf("\n  --请输入销售额:");
					scanf("%d", &p->work.amount);
					p->salary = (float)p->work.amount*(float)0.04;
				}
				count_smsalary(head, p);
				break;
			case 4:
				p->wop = salesmanager;
				count_smsalary(head, p);
				break;

			}
		}break;
		case 5:
			printf("\n  --请输入年龄:");
			scanf("%d", &p->age);
			break;
		case 6:
		{
			if (p->wop == technician)
			{
				printf("\n  --请输入工作时间:");
				scanf("%d", &p->work.worktime);
				p->salary = (float)p->work.worktime * 100;
			}
			if (p->wop == salesperson)
			{
				printf("\n  --请输入销售额:");
				scanf("%d", &p->work.amount);
				p->salary = (float)p->work.amount*(float)0.04;
			}
		}break;
		case 0:break;
		default:printf("\n  --选择有误!"); getchar();getchar();
		}
	}
	if (sel1) printf("\n  --修改成功!");
	return head;//
}
EMP *add_emp(EMP *head, int sel)//添加员工
{
	EMP *n = NULL, *p = NULL;
	if ((n = (EMP*)malloc(sizeof(EMP))) == NULL)
	{
		printf("\n  不能分配内存空间!\n");
		exit(0);
	}
	n->next = NULL;
	printf("  --请输入员工信息数据:\n");
	printf("  --请输入姓名:");
	scanf("%s", n->name);
	sex_choice(n);
	printf("  --请输入部门:");
	scanf("%s", n->department);
	printf("  --请输入年龄:");
	scanf("%d", &n->age);
	if (sel == 1)
	{
		n->wop = manager;
		n->salary = 8000;
	}
	else if (sel == 2)
	{
		n->wop = technician;
		printf("  --请输入工作时间:");
		scanf("%d", &n->work.worktime);
		n->salary = (float)n->work.worktime * 100;
	}
	else if (sel == 3)
	{
		n->wop = salesperson;
		printf("  --请输入销售额:");
		scanf("%d", &n->work.amount);
		n->salary = (float)n->work.amount*(float)0.04;
		count_smsalary(head, n);
	}
	else
	{
		n->wop = salesmanager;
		count_smsalary(head, n);
	}
	if (head == NULL)
	{
		n->num = 1;
		head = n;
	}
	else
	{
		p = head;
		while (p->next != NULL) p = p->next;
		n->num = p->num + 1;
		p->next = n;
	}
	printf("  添加成功!\n");
	return head;
}
EMP *load_inf(EMP *head)//打开文件数据
{
	FILE *fp;
	EMP *s = NULL, *p = NULL;
	int length, count, sel;
	printf("  -------------------| 员工工资管理系统 |-------------------\n");
	printf("\n  --正在读取信息,请稍后…\n");
	printf("\n  --正在打开本员工数据文件\n");
	if ((fp = fopen("employee.txt", "rb")) == NULL)//打开文件
	{
		printf("\n  --错误:无法打开员工文件数据,是否新建数据文件?\n");
		printf("\n  --1  - 是    2 - 否,退出程序\n");
		printf("\n  --请输入您的选择:");
		scanf("%d", &sel);
		if (sel == 1)
			if ((fp = fopen("employee.txt", "wb")) == NULL)//将文件设置为wb打开就是新建文件
			{
				printf("\n  --错误:无法新建员工数据文件\n");
				exit(0);
			}
			else printf("\n  --已为您新建员工数据文件!\n");
		else exit(0);
	}
	count = 0;
	printf("\n  --正在读取员工数据文件信息\n");
	fseek(fp, 0, 2);
	length = ftell(fp);
	fseek(fp, 0, 0);
	while (ftell(fp) != length)
	{
		if ((s = (EMP*)malloc(sizeof(EMP))) == NULL)
		{
			printf("\n  --无法分配内存空间!\n");
			fclose(fp);
		}
		if (fread(s, sizeof(EMP), 1, fp) != 1)
		{
			free(s);
			break;
		}
		if (head == NULL)
			head = p = s;
		else
		{
			p->next = s;
			p = s;
		}
		count++;
	}
	fclose(fp);
	printf("\n  --已读取%d名员工信息!\n", count);
	printf("\n  --数据加载成功!按任意键继续...");
	getchar();
	return head;
}
void save_inf(EMP *head)//保存信息
{
	FILE *fp;
	EMP *p;
	int sel1 = 1;
	system("cls");
	printf("  -------------------| 员工工资管理系统 |-------------------\n");
	printf("\n  --正在保存信息,请稍后...\n");
	printf("\n  --正在保存员工信息\n");
	if ((fp = fopen("employee.txt", "wb")) == NULL)
	{
		printf("\n  --错误:无法读取本科生数据文件\n");
		exit(0);
	}
	p = head;
	while (p != NULL)
	{
		if (fwrite(p, sizeof(EMP), 1, fp) != 1)
		{
			printf("  --错误:写入本科生学生数据出错!\n");
			sel1 = 0;
			fclose(fp);
		}
		p = p->next;
	}
	printf("\n  --保存员工信息成功\n");
	fclose(fp);
	if (sel1) printf("\n  保存数据成功!\n");
}
void main()
{
	int sel, sel1;
	EMP *head = NULL, *p = NULL;//定义两个员工类指针
	head = load_inf(head);//
	while (1)
	{
		p = head;
		while (p != NULL)
		{
			if (p->wop == salesmanager) count_smsalary(head, p);
			p = p->next;
		}
		sel1 = 1;
		system("cls");
		printf("  -------------------| 员工工资管理系统 |-------------------\n");
		printf("  ==========================================================\n");
		printf("  ||                                                      ||\n");
		printf("  ||   - 1 - 添加员工信息            - 2 - 修改员工信息   ||\n");
		printf("  ||                                                      ||\n");
		printf("  ||   - 3 - 删除员工信息            - 4 - 查询员工信息   ||\n");
		printf("  ||                                                      ||\n");
		printf("  ||   - 5 - 员工信息排序            - 6 - 员工工资统计   ||\n");
		printf("  ||                                                      ||\n");
		printf("  ||   - 7 - 恢复出厂设置            - 8 - 保存信息       ||\n");
		printf("  ||                                                      ||\n");
		printf("  ||   - 0 - 退出程序                                     ||\n");
		printf("  ||                                                      ||\n");
		printf("  ==========================================================\n\n");
		printf("\n  --请输入您的选择:");
		scanf("%d", &sel);
		if (sel == 0)
		{
			save_inf(head);
			printf("  按任意键退出...\n");
			getchar();
			break;
		}
		switch (sel)
		{
		case 1:
			while (sel1)
			{
				menu_head("添加员工信息");
				menu_workpost();
				scanf("%d", &sel1);
				switch (sel1)
				{
				case 1:case 2:case 3:case 4:head = add_emp(head, sel1); getchar(); getchar(); break;
				case 0:break;
				default:printf("\n  --选择有误!"); getchar();getchar();
				}
			}break;
		case 2:
			while (sel1)
			{
				menu_head("修改员工信息");
				menu_condition();
				scanf("%d", &sel1);
				switch (sel1)
				{
				case 1:case 2:head = edit_emp(head, sel1); getchar(); getchar(); break;
				case 0:break;
				default:printf("\n  --选择有误!"); getchar();getchar();
				}
			}break;
		case 3:
			while (sel1)
			{
				menu_head("删除员工信息");
				menu_condition();
				scanf("%d", &sel1);
				switch (sel1)
				{
				case 1:case 2:head = del_emp(head, sel1); getchar(); getchar(); break;
				case 0:break;
				default:printf("\n  --选择有误!"); getchar();getchar();
				}
			}break;
		case 4:
			while (sel1)
			{
				menu_head("查询员工信息");
				printf("\n  --请选择功能\n\n");
				printf("  ==========================================================\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 1 - 全部员工         - 2 - 按部门显示        ||\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 3 - 按岗位显示       - 4 - 职工号/姓名查询   ||\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 0 - 退出                                     ||\n");
				printf("  ||                                                      ||\n");
				printf("  ==========================================================\n");
				printf("\n  --请输入您的选择:");
				scanf("%d", &sel1);
				switch (sel1)
				{
				case 1:case 2:case 3:case 4:inquiry_emp(head, sel1); break;
				case 0:break;
				default:printf("\n  --选择有误!"); getchar();getchar();
				}
			}break;
		case 5:
			while (sel1)
			{
				menu_head("员工信息排序");
				printf("\n  --请选择功能\n\n");
				printf("  ==========================================================\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 1 - 全部员工         - 2 - 按岗位显示        ||\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 0 - 退出                                     ||\n");
				printf("  ||                                                      ||\n");
				printf("  ==========================================================\n");
				printf("\n  --请输入您的选择:");
				scanf("%d", &sel1);
				switch (sel1)
				{
				case 1:case 2:sort_emp(head, sel1); break;
				case 0:break;
				default:printf("\n  --选择有误!"); getchar();getchar();
				}
			}break;
		case 6:
			while (sel1)
			{
				menu_head("员工工资统计");
				printf("\n  --请选择功能\n\n");
				printf("  ==========================================================\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 1 - 部门平均、最低、最高工资                 ||\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 2 - 部门超出平均工资员工信息                 ||\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 3 - 所有员工平均、最低、最高工资             ||\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 4 - 部门超出平均工资员工信息                 ||\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 0 - 退出                                     ||\n");
				printf("  ||                                                      ||\n");
				printf("  ==========================================================\n");
				printf("\n  --请输入您的选择:");
				scanf("%d", &sel1);
				switch (sel1)
				{
				case 1:case 2:case 3:case 4:count_emp(head, sel1); break;
				case 0:break;
				default:printf("\n  --选择有误!"); getchar();getchar();
				}
			}break;
		case 7:
			if (clean_inf() == 1)
			{
				head = NULL;
			}
			printf("  按任意键继续...");
			getchar();
			getchar();
			break;
		case 8:
			save_inf(head);
			printf("  按任意键继续...");
			getchar();
			getchar();
			break;
		case 0:save_inf(head); break;
		default:printf("\n  --选择有误!"); getchar(); getchar(); break;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/cheng_hai_yan/article/details/88258379