#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct _employee
{
char name[20]; //员工姓名
char phone[12]; //员工电话
char addr[20]; //住址
char cardId[20]; //身份证号
char department[20]; //部门
char id[10]; //工号
int workDay; //工作天数
char jiguan[20]; //籍贯
float workAge; //工龄
char isMarrid; //婚姻
int age; //年龄
char sex; //性别
int child; //是否生育,0表示未生育,>0表示孩子个数
char grade[20]; //学历
int isIn; //公司文化活动是否签到
float base; //基础工资
float money; //薪资
float sale; //销售金额
double total; //总计
}Employee;
const char* g_title[] = { "员工姓名","员工电话","住址","身份证号","部门","工号","工作天数","籍贯","工龄","婚姻状况","年龄","性别","生育状况","学历","公司文化活动签到" };
//显示单个员工信息
void showSingle(Employee emp)
{
printf("员工姓名:%s\n", emp.name);
printf("员工电话:%s\n", emp.phone);
printf("住址:%s\n", emp.addr);
printf("身份证号:%s\n", emp.cardId);
printf("部门:%s\n", emp.department);
printf("工号:%s\n", emp.id);
printf("工作天数:%d\n", emp.workDay);
printf("工龄:%.1f\n", emp.workAge);
printf("婚姻状况:");
if (emp.isMarrid == 'y' || emp.isMarrid == 'Y')
printf("已婚\n");
else
printf("未婚\n");
printf("年龄:%d\n", emp.age);
printf("性别:");
if (emp.sex == 'F' || emp.sex == 'f')
printf("女\n");
else
printf("男\n");
printf("生育状况:");
if (emp.child <= 0)
printf("无\n");
else
printf("%d个子女\n", emp.child);
printf("学历:%s\n", emp.grade);
printf("公司文化活动签到:");
if (emp.isIn == 1)
printf("是\n");
else if (emp.isIn == 0)
printf("否,但已请假\n");
else
printf("否,未请假\n");
}
//显示所有员工信息
void showAll(char* name, Employee emp[], int n)
{
int i = 0, j = 0;
printf("单位名称:%s \t 总人数:%d\n", name, n);
printf("------------------------------------------\n");
for (i = 0; i < n; i++)
{
showSingle(emp[i]);
}
}
//查找
void search(Employee emp[], int n)
{
int op;
int i = 0;
char buf[20] = { 0 };
printf("1.根据工号查询\n");
printf("2.根据姓名查询\n");
printf("3.根据电话查询\n");
printf("4.返回上一层\n");
while (1)
{
scanf("%d", &op);
if (op >= 1 && op <= 4)
break;
}
switch (op)
{
case 1: printf("请输入工号:"); scanf("%s", buf); break;
case 2: printf("请输入姓名:"); scanf("%s", buf); break;
case 3: printf("请输入电话:"); scanf("%s", buf); break;
case 4: return;
}
for (i = 0; i < n; i++)
{
if (op == 1 && strcmp(emp[i].id, buf) == 0)
{
showSingle(emp[i]);
break;
}
else if (op == 2 && strcmp(emp[i].name, buf) == 0)
{
showSingle(emp[i]);
break;
}
else if (op == 3 && strcmp(emp[i].phone, buf) == 0)
{
showSingle(emp[i]);
break;
}
}
if (i == n)
printf("未找到符合条件的员工!!\n");
}
//筛选
void select(Employee emp[], int n)
{
int i, op;
char buf[20] = { 0 }, tmp;
int flag = 0;
int age;
printf("1.通过部门筛选\n");
printf("2.通过性别筛选\n");
printf("3.通过年龄筛选\n");
printf("4.通过婚姻状况筛选\n");
printf("5.通过请假考勤\n");
printf("6.通过学历筛选\n");
printf("7.通过籍贯筛选\n");
printf("8.返回上一层\n");
while (1)
{
scanf("%d", &op);
if (op >= 1 && op <= 8)
break;
}
switch (op)
{
case 1:
printf("请输入部门:");
scanf("%s", buf);
for (i = 0; i < n; i++)
{
if (strcmp(buf, emp[i].department) == 0)
{
flag = 1;
showSingle(emp[i]);
}
}
if (flag == 0)
printf("未找到符合条件的员工!!\n");
break;
case 2:
printf("请输入性别:");
fflush(stdin);
buf[0] = getchar();
buf[0] = toupper(buf[0]);
for (i = 0; i < n; i++)
{
tmp = toupper(emp[i].sex);
if (buf[0] == tmp)
{
showSingle(emp[i]);
flag = 1;
}
}
if (flag == 0)
printf("未找到符合条件的员工!!\n");
break;
case 3:
printf("请输入年龄:");
scanf("%d", &age);
for (i = 0; i < n; i++)
{
if (emp[i].age == age)
{
showSingle(emp[i]);
flag = 1;
}
}
if (flag == 0)
printf("未找到符合条件的员工!!\n");
break;
case 4:
printf("请输入婚姻状况(Y:已婚 N:未婚 ): ");
rewind(stdin);
buf[0] = getchar();
buf[0] = toupper(buf[0]);
for (i = 0; i < n; i++)
{
tmp = toupper(emp[i].isMarrid);
if (buf[0] == tmp)
{
printf("------------------------------------------\n");
showSingle(emp[i]);
flag = 1;
}
}
if (flag == 0)
printf("未找到符合条件的员工!!\n");
break;
case 5:
printf("请输入筛选条件(1.请假 2.未请假\n): ");
scanf("%d", &age);
for (i = 0; i < n; i++)
{
if (emp[i].workDay < 2)
{
printf("------------------------------------------\n");
showSingle(emp[i]);
flag = 1;
}
}
if (flag == 0)
printf("未找到符合条件的员工!!\n");
break;
case 6:
printf("请输入学历:");
scanf("%s", buf);
for (i = 0; i < n; i++)
{
if (strcmp(buf, emp[i].grade) == 0)
{
showSingle(emp[i]);
flag = 1;
}
}
if (flag == 0)
printf("未找到符合条件的员工!!\n");
break;
case 7:
printf("请输入籍贯:");
scanf("%s", buf);
for (i = 0; i < n; i++)
{
if (strcmp(buf, emp[i].jiguan) == 0)
{
showSingle(emp[i]);
flag = 1;
}
}
if (flag == 0)
printf("未找到符合条件的员工!!\n");
break;
case 8:
return;
}
}
//插入新员工
int insert(Employee emp[], int n)
{
printf("更新该员工信息:\n");
printf("请输入员工姓名:"); scanf("%s", emp[n].name);
printf("请输入员工电话:"); scanf("%s", emp[n].phone);
printf("请输入住址:"); scanf("%s", emp[n].addr);
printf("请输入身份证号:"); scanf("%s", emp[n].cardId);
printf("请输入部门:"); scanf("%s", emp[n].department);
printf("请输入工号:"); scanf("%s", emp[n].id);
printf("请输入工作天数:"); scanf("%d", &emp[n].workDay);
printf("请输入籍贯:"); scanf("%s", emp[n].jiguan);
printf("请输入工龄:"); scanf("%f", &emp[n].workAge);
printf("请输入婚姻状况(Y:已婚 N:未婚):"); rewind(stdin); emp[n].isMarrid = getchar();
printf("请输入年龄:"); scanf("%d", &emp[n].age);
printf("请输入性别(F:女 M:男):"); rewind(stdin); emp[n].sex = getchar();
printf("请输入生育情况:"); scanf("%d", &emp[n].child);
printf("请输入学历:"); scanf("%s", emp[n].grade);
printf("公司文化活动签到(1.签到 0.未参加但请假 -1.未参加未请假):"); scanf("%d", &emp[n].isIn);
printf("请输入员工基础薪资:"); scanf("%f", &emp[n].base);
printf("请输入销售金额:"); scanf("%f", &emp[n].sale);
printf("新员工信息已插入!\n");
return (n + 1);
}
//删除旧员工信息
int dele(Employee emp[], int n)
{
char buf[20] = { 0 };
int i, flag = 0, j;
printf("请输入要删除的员工工号:");
scanf("%s", buf);
for (i = 0; i < n; i++)
{
if (strcmp(buf, emp[i].id) == 0)
{
flag = 1;
for (j = i; j < n - 1; j++)
emp[j] = emp[j + 1];
printf("该员工信息已删除!!\n");
return (n - 1);
}
}
if (flag == 0)
printf("未找到符合条件的员工!!\n");
return n;
}
//薪资
void caculate(Employee emp[], int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
emp[i].total = emp[i].base / 22 * emp[i].workDay;
if (strcmp(emp[i].grade, "专科") == 0)
emp[i].total += 800;
else if (strcmp(emp[i].grade, "本科") == 0)
emp[i].total += 1000;
else if (strcmp(emp[i].grade, "研究生") == 0)
emp[i].total += 1200;
//生育奖
if (emp[i].child == 1)
emp[i].total += 500;
else if (emp[i].child == 2)
emp[i].total += 750;
else if (emp[i].child == 3)
emp[i].total += 1000;
//工龄奖
emp[i].total += emp[i].workAge * 50;
//提成
if (emp[i].sale < 1000000)
emp[i].total += emp[i].sale * 0.02;
else if (emp[i].sale < 1000000)
emp[i].total += emp[i].sale * 0.05;
else
emp[i].total += emp[i].sale * 0.08;
//公司互动
if (emp[i].isIn == 1)
emp[i].total += 150;
else if (emp[i].isIn == 0)
emp[i].total += 100;
printf("工号:%s 姓名:%s 薪资:%.2f\n", emp[i].id, emp[i].name, emp[i].total);
}
}
//计算每月应缴金额
void jiaona(Employee emp[], int n)
{
int i;
float f1, f2;
for (i = 0; i < n; i++)
{
printf("工号:%s 姓名:%s 薪资:%.2f ", emp[i].id, emp[i].name, emp[i].total);
f1 = emp[i].total * 0.02 + 7;
f2 = emp[i].total * 0.05;
printf("医保缴纳:%.2f 公积金缴纳:%.2f 实发工资:%.2f\n", f1, f2, (emp[i].total - f1 - f2));
}
}
//显示销售前3名
void showBef(Employee emp[], int n)
{
int i, j;
Employee t;
//根据销售额排名
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (emp[j].sale < emp[j + 1].sale)
{
t = emp[j];
emp[j] = emp[j + 1];
emp[j + 1] = t;
}
}
}
//显示前三名
for (i = 0; i < 3; i++)
{
printf("工号:%s 姓名:%s 销售额:%.2f\n", emp[i].id, emp[i].name, emp[i].sale);
}
}
//写文件
void write2File(const char* filename, Employee emp[], int n)
{
FILE* fp = fopen(filename, "w"); //打开文件,以二进制写模式打开,w表示写模式,b表示二进制模式
int i = 0;
for (; i < n; i++)
{
fprintf(fp, "%s %s %s %s ", emp[i].name, emp[i].phone, emp[i].addr, emp[i].cardId);
fprintf(fp, "%s %s %d %s ", emp[i].department, emp[i].id, emp[i].workDay, emp[i].jiguan);
fprintf(fp, "%f %c %d %c ", emp[i].workAge, emp[i].isMarrid, emp[i].age, emp[i].sex);
fprintf(fp, "%d %s %d %f ", emp[i].child, emp[i].grade, emp[i].isIn, emp[i].base);
fprintf(fp, "%f %f %f\n", emp[i].money, emp[i].sale, emp[i].total);
}
fclose(fp);
}
//读文件
int readFile(const char* filename, Employee emp[], int n)
{
FILE* fp = fopen(filename, "r");
if (fp == 0)
{
printf("文件打开失败\n");
return n;
}
while (!feof(fp)) //判断文件是否读到末尾
{
emp[n].name[0] = '\0';
fscanf(fp, "%s %s %s %s ", emp[n].name, emp[n].phone, emp[n].addr, emp[n].cardId);
fscanf(fp, "%s %s %d %s ", emp[n].department, emp[n].id, &emp[n].workDay, emp[n].jiguan);
fscanf(fp, "%f %c %d %c ", &emp[n].workAge, &emp[n].isMarrid, &emp[n].age, &emp[n].sex);
fscanf(fp, "%d %s %d %f ", &emp[n].child, emp[n].grade, &emp[n].isIn, &emp[n].base);
fscanf(fp, "%f %f %f\n", &emp[n].money, &emp[n].sale, &emp[n].total);
if (emp[n].name[0]!='\0') //逐个读取员工信息,if用来判断是否读取成功
n++;
}
fclose(fp);
return n;
}
int main()
{
int op;
Employee emp[100];
int n = 0;
char name[20];
const char* filename = "record.txt";
//读文件1
n = readFile(filename, emp, n);
while (1)
{
system("cls");
strcpy(name,"传媒有限公司");
printf("欢迎传媒有限公司\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("0.退出系统\n");
scanf("%d", &op);
switch (op)
{
case 1:
n = insert(emp, n); break;
case 2:
n = dele(emp, n); break;
case 3:
search(emp, n); break;
case 4:
select(emp, n); break;
case 5:
showAll(name, emp, n); break;
case 6:
caculate(emp, n); break;
case 7:
jiaona(emp, n); break;
case 8:
showBef(emp, n); break;
case 9:
write2File(filename, emp, n); break;
case 0:
return 0;
default:
break;
}
system("pause");
}
}
(1)插入功能:插入功能全是顺序执行,比较简单
(2)删除功能:
(3)查找功能:
(4)筛选功能:
(6)计算薪资
(7)计算缴纳
(8)前三名
(9)写文件