运用C语言知识实现员工信息管理系统
输入5个员工的信息,每个员工含有成员名为“工号、姓名、基本工资、补贴、奖金、水电费、房租、实发工资、工资排名”,编写函数完成下列要求:
(1)输入一个员工的工号,查询该员工的信息并输出,若不存在显示没找到;
(2)输入一个新员工的信息,按工号顺序将该员工的信息插入,之后显示所有员工信息;
(3)输入一个已存在员工的姓名信息,删除该员工的信息后输出所有员工信息;
(4)修改某员工的信息(先查找某个员工,再针对某条信息进行修改);
(5)求每个员工的实发工资(实发工资=基本工资+补贴+奖金-水电费-房租),并输出;
(6)对所有员工的信息按实发工资升序排序,并输出。
#include<stdio.h>
#include<string.h>
//定义员工信息结构体
struct Employee{
int id;
char name[50];
float basesalary;
float allowance;
float bonus;
float waterelectric;
float rent;
float actualsalary;
int rank;
};
//输入员工结构体的函数
void input_employees(struct Employee employees[],int n){
for(int i=0;i<n;i++){
printf("\n正在录入第%d位员工信息:\n",i+1);//提示当前录入的是第几个员工
printf("工号:");
scanf("%d",&employees[i].id);
printf("姓名:");
scanf("%s",&employees[i].name);
printf("基本工资:");
scanf("%f",&employees[i].basesalary);
printf("补贴:");
scanf("%f",&employees[i].allowance);
printf("奖金:");
scanf("%f",&employees[i].bonus);
printf("水电费:");
scanf("%f",&employees[i].waterelectric);
printf("房租:");
scanf("%f",&employees[i].rent);
employees[i].actualsalary=0;
employees[i].rank=0;
}
}
//计算实发工资函数
void calculateactualsalary(Employee*emp){
emp->actualsalary=emp->basesalary+emp->allowance+emp->bonus-emp->waterelectric-emp->rent;
}
//按实发工资排序
void sortbyactualsalary(Employee employees[],int size){
//使用冒泡排序算法
for(int i=0;i<size-1;i++){
for(int j=0;j<size-i-1;j++) {
if(employees[j].actualsalary>employees[j+1].actualsalary){
Employee temp = employees[j];
employees[j]=employees[j+1];
employees[j+1]=temp;
}
}
}
}
//分配实发工资排名
void assignranks(Employee employees[],int size){
for(int i=0;i<size;i++){
int rank=1;
//每次循环开始,将当前员工的初始排名设为1
for(int j=0;j<size;j++){
if(employees[j].actualsalary<employees[i].actualsalary){
rank++;
}
}
employees[i].rank=size-rank+1;
}
}
//修改员工信息
void updateEmployee(struct Employee *emp){
//Employee *emp 这是一个指向Employee结构提的指针,通过该指针可以直接修改所指向的Employee结构体变量的成员
printf("\n正在录入员工信息:\n");
printf("工号: ");
scanf("%d",&emp->id);
printf("姓名: ");
scanf("%s",emp->name);
printf("基本工资: ");
scanf("%f",&emp->basesalary);
printf("补贴: ");
scanf("%f",&emp->allowance);
printf("奖金: ");
scanf("%f",&emp->bonus);
printf("水电费: ") ;
scanf("%f",&emp->waterelectric);
printf("房租: ");
scanf("%f",&emp->rent);
calculateactualsalary(emp);
}
//插入员工信息
void insertEmployee(struct Employee employees[],int *size,struct Employee newEmp){
/*struct Employee employees[]:这是一个 Employee 结构体类型的数组
int *size:这是一个指向整数的指针,代表当前员工数组中实际存储的员工数量。使用指针是为了在函数内部能够修改该值并反映到函数外部
truct Employee newEmp:这是一个 Employee 结构体类型的变量,代表要插入的新员工信息。*/
int i;
for (i=*size;i>0&&employees[i-1].id>newEmp.id;i--)
{employees[i]=employees[i-1];}
employees[i]=newEmp;
(*size)++;
}
//显示员工信息
void displayEmployee(struct Employee emp){
printf("工号:%d,姓名:%s,基本工资:%.2f,补贴:%.2f,奖金:%.2f,水电费:%.2f,房租:%.2f,实发工资:%.2f,工资排名:%d\n",emp.id,emp.name,emp.basesalary,emp.allowance,emp.bonus,emp.waterelectric,emp.rent,emp.actualsalary,emp.rank);
}
//显示全部员工信息
void displayAllEmployees(struct Employee employees[],int size){
if(size==0){
printf("没有员工信息。\n");}
else{
printf("员工信息列表:\n");
for(int i=0;i<size;i++){
displayEmployee(employees[i]);
}
}
}
//tang
//查询员工信息
int searchEmployee(struct Employee employees[],int size,int id)
{
// 遍历员工数组
for (int i = 0;i < size;i++)
{
if(employees[i].id == id)
{
return i;
}
// 若遍历完整个数组都未找到匹配的工号,则返回 -1
}return -1;
}
//删除员工信息
void deleteemployee(struct Employee employees[],int *size,int index)
{
int i;
// 从要删除的员工索引位置开始,将后面的员工信息依次向前移动一位
for(i = index;i < *size-1;i++)
{ employees[i]=employees[i+1];}
(*size)--;}
int main(){
struct Employee employees[100];
int size=0;
int choice,id;
struct Employee staff[5];
printf("请依次输入5位员工信息:\n");
input_employees(staff,5);
for(int i =0;i<5;i++){
employees[i]=staff[i];
}size=5;
//jing
while(1){
printf("\n员工信息管理系统菜单:\n");
printf("1.查询员工信息\n");
printf("2.插入员工信息\n");
printf("3.删除员工信息\n");
printf("4.修改员工信息\n");
printf("5.计算实发工资并显示\n");
printf("6.按实发工资排序并显示\n");
printf("7.退出\n");
printf("请输入你的选择: ");
scanf("%d",&choice);
switch(choice){
case 1:{
printf("输入查询的员工工号");
scanf("%d",&id);
int indexByid=searchEmployee(employees,size,id);
if(indexByid!=-1){
displayEmployee(employees[indexByid]);
}else{
printf("没有找到该员工");
}break;}
case 2:
struct Employee newEmp;
input_employees(&newEmp,1);
insertEmployee(employees,&size,newEmp);
displayAllEmployees(employees,size);
break;
case 3:{
printf("请输入要删除的员工工号: ");
scanf("%d",&id);
int indexByName=searchEmployee(employees,size,id);
if(indexByName !=-1){
deleteemployee(employees,&size,indexByName);
displayAllEmployees(employees,size);
} else{
printf("没找到该员工。\n");
}break;}
case 4:{
printf("需修改的员工工号: ");
scanf("%d",&id);
int indexById=searchEmployee(employees,size,id);
if(indexById !=-1){
updateEmployee(&employees[indexById]);
displayAllEmployees(employees,size);
}
else{
printf("没有找到该员工。\n");
}
break;}
case 5://调用函数计算实发工资并输出
for(int i=0;i<size;i++){
calculateactualsalary(&employees[i]);}
displayAllEmployees(employees,size);
break;
case 6: //按实发工资排序排名并输出
sortbyactualsalary(employees,size);
assignranks(employees,size);
displayAllEmployees(employees,size);
break;
case 7:
return 0;
default:
printf("无效的选择,请重新输入。\n");
}
}
return 0;
}