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("  ||                        
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值