输入10个员工的信息,每个员工含有成员名为“工号、姓名、基本工资、补贴、奖金、水电费、房租、实发工资、工资排名”,分别编写五个函数求:
(1)输入一个员工的工号,查询该员工的信息并输出,若不存在显示没找到。
(2)输入一个新员工的信息,按工号顺序将该员工的信息插入后输出。
(3)输入一个已存在员工的姓名信息,删除该员工的信息后输出。
(4)求每个员工的实发工资(实发工资=基本工资+补贴+奖金-水电费-房租);
(5)对所有员工的信息按实发工资升序排序,并填写工资排名后输出;
要求:
10个员工的数据用文件存储,每个员工的结构体用数组。当程序执行后先显示“菜单”,当输入为1时,执行第(1)个函数;当输入为2时,执行第(2)个函数;当输入为3时,执行第(3)个函数;当输入为4时,执行第(4)个函数;当输入为5时,执行第(5)个函数;当输入为0时,退出系统,当输入其他数字时,提示输入有错误。
设计一个员工管理系统要求如下,注释越多越好,我菜看不懂
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- qfl_sdu 2021-07-06 17:31关注
代码如下
#include <stdio.h> #include <string.h> #include <process.h> //最大的员工数量,可以根据实际调整 #define MAXNMB 20 //定义员工结构体,用于存放员工数据 struct Employee { int id; //工号 char name[20]; //姓名 int baseGz; //基本工资 int bt; //补贴 int jiangjin; //奖金 int shuidian; //水电费 int fangzu; //房租 int real; //是发工资 int rank; //排名 }; //显示所有员工信息 void display(struct Employee a[],int n) { int i; printf("工号 姓名 基本工资 补贴 奖金 水电费 房租\n"); for (i=0;i<n;i++) { printf("%d %s %d %d %d %d %d\n",a[i].id,a[i].name,a[i].baseGz,a[i].bt,a[i].jiangjin,a[i].shuidian,a[i].fangzu); } } //根据工号排序 void SortByGh(struct Employee a[],int n) { int i,j; struct Employee tt; //采用冒泡排序法按照工号从小到大排序 for (i=0;i<n-1;i++) { for (j=0;j<n-1-i;j++) { if (a[j].id > a[j+1].id) { tt = a[j]; a[j] = a[j+1]; a[j+1] = tt; } } } } //读取文件 void ReadFile(char* filename,struct Employee a[],int *n) { FILE* fp; int i = 0; char buf[100]={0}; //临时缓冲区,读取第一行的注释 if((fp= fopen(filename,"r")) == 0) { printf("文件打开失败\n"); return ; } fgets(buf,100,fp); //读取开头的注释 //逐行读取文件,并将字段数据存入结构体数组 while(!feof(fp)) { fscanf(fp,"%d %s %d %d %d %d %d\n",&a[i].id,a[i].name,&a[i].baseGz,&a[i].bt,&a[i].jiangjin,&a[i].shuidian,&a[i].fangzu); if(a[i].id > 0) //去掉空行的影响 i++; } fclose(fp); *n = i; //记录数组中实际的员工个数 display(a,*n);//显示读取后的数据 } //1.查找信息 void Find(struct Employee a[],int n) { int id,i; system("cls"); printf("请输入需要查找的工号:"); scanf("%d",&id); for (i=0;i<n;i++) { if (a[i].id == id) //如果工号相等,说明找到需要查找的员工 { printf("工号:%d\n",a[i].id); printf("姓名:%s\n",a[i].name); printf("基本工资:%d\n",a[i].baseGz); printf("补贴:%d\n",a[i].bt); printf("奖金:%d\n",a[i].jiangjin); printf("水电费:%d\n",a[i].shuidian); printf("房租:%d\n",a[i].fangzu); //printf("实发工资:%d\n",a[i].real); break; } } if (i == n) { printf("未找到该员工\n"); } system("pause"); } //2.插入新员工 void Insert(struct Employee a[],int *n) { struct Employee tt; int i,j; system("cls"); printf("请输入新员工的工号:"); while(1) { scanf("%d",&tt.id); //查找是否已经存在 for (i=0;i<*n;i++) { if(a[i].id == tt.id) { printf("该工号已经被使用,请重新输入:"); break; } } if(i == *n) //说明该工号可以使用 break; } printf("请输入新员工的姓名: "); scanf("%s",tt.name); printf("请输入新员工的基本工资:"); scanf("%d",&tt.baseGz); printf("请输入新员工的补贴:"); scanf("%d",&tt.bt); printf("请输入新员工的奖金:"); scanf("%d",&tt.jiangjin); printf("请输入新员工的水电费:"); scanf("%d",&tt.shuidian); printf("请输入新员工的房租:"); scanf("%d",&tt.fangzu); //插入 for (i = 0;i<*n;i++) { //因为开始的时候已经按照工号从小到大排序了,所以此处找到比插入的工号大的位置 if(tt.id < a[i].id ) { //将原来的数据后移一位 for (j=*n;j>i;j--) { a[j] = a[j-1]; } //在找到的位置插入新员工信息 a[i] = tt; } } //如果数组中所有员工的工号都比新员工的员工号小,就把新员工的信息插入到数组的最后 if(i == *n) { a[*n] = tt; } *n = *n +1;//数组的大小+1 printf("插入成功\n"); display(a,*n); system("pause"); } //3.删除员工 void Dele(struct Employee a[],int *n) { int i,j; char name[20]={0}; system("cls"); printf("请输入需要删除的姓名:"); scanf("%s",name); for (i=0;i<*n;i++) { if (strcmp(name,a[i].name) == 0) //找到名字符合的员工 { //将数组中的元素前移一位(用后面的元素把这个元素覆盖掉) for (j=i;j<*n-1;j++) { a[j] = a[j+1]; } *n = *n -1; //数组中元素的实际个数减一 printf("删除成功\n"); display(a,*n); //显示删除后的员工信息 break; } } if(i == *n) printf("未找到该员工\n"); system("pause"); } //4.求实发工资 void Real(struct Employee a[],int n) { int i=0; system("cls"); printf("实发工资如下:\n"); //遍历数组,计算员工的实发工资 for (i=0;i<n;i++) { a[i].real = a[i].baseGz + a[i].bt + a[i].jiangjin - a[i].shuidian - a[i].fangzu; printf("工号:%d 姓名:%s 实发工资:%d\n",a[i].id,a[i].name,a[i].real); } system("pause"); } //5.根据实发工资排名 void SortByReal(struct Employee a[],int n) { int i,j; struct Employee tt; //使用冒泡排序根据员工的实发工资排序,实发工资从小到大排序 for (i=0;i<n-1;i++) { for (j=0;j<n-1-i;j++) { if(a[j].real > a[j+1].real) { tt = a[j]; a[j] = a[j+1]; a[j+1] = tt; } } } //计算排名 j = 1; a[n-1].rank = 1; //因为实发工资升序排列,所以排名按照逆序遍历,实发工资最多的排名第一 for (i = n-2;i>=0;i--) { if (a[i].rank == a[i+1].rank)//如果第i员工的实发工资与第i+1个员工的实发工资相同,那么他们的排名相同 { a[i].rank = j; }else { //如果第i员工的实发工资与第i+1个员工的实发工资不相同,那么第i个员工的排名+1 j++; a[i].rank = j; } } //显示 printf("实发工资排名:\n"); printf("工号 姓名 实发工资 排名\n"); for (i = 0;i<n;i++) { printf("%d %s %d %d\n",a[i].id,a[i].name,a[i].real,a[i].rank); } system("pause"); } //6.保存到文件 void WriteFile(char* filename,struct Employee a[],int n) { int i; FILE* fp; if((fp = fopen(filename,"w")) == 0) { printf("文件打开失败\n"); return ; } fprintf(fp, "工号 姓名 基本工资 补贴 奖金 水电费 房租\n"); for (i=0;i<n;i++) { fprintf(fp,"%d %s %d %d %d %d %d\n",a[i].id,a[i].name,a[i].baseGz,a[i].bt,a[i].jiangjin,a[i].shuidian,a[i].fangzu); } fclose(fp); printf("文件保存成功\n"); system("pause"); } int main() { struct Employee a[MAXNMB]; //保存所有员工数据 int nmbReal = 0;//实际员工数量 int opt =0; int bgo = 1; //从文件中读取数据到结构体数组a,nmbReal是实际读取的员工信息个数 ReadFile("file.txt",a,&nmbReal); while(bgo) { system("cls"); printf("---------------员工管理系统---------------\n"); printf("| 1.查询员工信息 |\n"); printf("| 2.添加新员工 |\n"); printf("| 3.删除员工 |\n"); printf("| 4.求实发工资 |\n"); printf("| 5.根据实发工资排名 |\n"); printf("| 0.退出系统 |\n"); printf("------------------------------------------\n"); scanf("%d",&opt); switch(opt) { case 1: Find(a,nmbReal);//查询员工信息 break; case 2: Insert(a,&nmbReal);//添加新员工 break; case 3: Dele(a,&nmbReal);//删除员工 break; case 4: Real(a,nmbReal);//计算每个员工的实发工资 break; case 5: SortByReal(a,nmbReal);//根据实发工资排名 break; case 0: bgo = 0; //退出程序 WriteFile("file2.txt",a,nmbReal);//退出前保存文件,如果需要保存到原文件,把文件名修改为file.txt break; default: system("cls"); printf("输入错误,没有该操作!!"); //没有对应的操作选项,提示输入错误 system("pause"); break; } } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 PointNet++的onnx模型只能使用一次
- ¥20 西南科技大学数字信号处理
- ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
- ¥30 STM32 INMP441无法读取数据
- ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。