实验要求
编写一个简单的员工工资管理系统,用两个一维数组分别存放员工工号和工资。要求实现如下功能:
(1)输入并输出员工的工号和基本工资;
(2)查找某个员工的工资并输出;
(3)查找某两个工资金额范围内的所有员工并输出对应信息;
(4)求所有员工平均工资;
(5)求员工中的最高工资及最低工资;
(6)假如新入职两名员工,请将他们的工号和工资插入已有数组中;
(7)假如有一名员工离职,请将其信息删除并保证数组的连续性;
(8)请按照工资从低到高排序输出对应员工工号及工资信息。
环境
我自己比较喜欢用的编译器是国产的一个叫做 lightly 的 IDE,由于他集成了很多主流语言,而且是部署在云端,不需要编译环境,对于学习来说极致的简单易上手,这里附上官网链接
设计思路
如题需要两个数组,分别存放工号和工资,为了节省时间我选择创建两个静态数组用于全局,之后所有的函数都可以直接操作这些数组,如果你想在 main 函数中创建数组在传递到方法里也可以。(本来还创建了 employee 构造体结果没用上)
static int IDarr[100]; static double salary_arr[100];
第一题 输入并输出员工的工号和基本工资
简单来说就是插入操作,把元素插入到数组末尾并输出,用 if 判断是否到位置
void insert(){ printf("请输入需要添加的员工号和工资:"); int id; double salary; scanf("%d%lf",&id,&salary); for (int i=0; i<100;i++) { if(IDarr[i]==0){//判断元素是否为空 IDarr[i]=id;//插入元素 salary_arr[i]=salary;//插入元素 printf("已插入员工:%d 工资: %.2lf\n",IDarr[i],salary_arr[i]);//输出插入的两个元素 break; } } }
第二题 查找某个员工的工资并输出
查找操作,没啥好说的
void search(){ printf("请输入需要查找的员工号:\n"); int id; scanf("%d",&id); for (int i=0; i<100;i++) { if(IDarr[i]==id){//判断员工号是否相等 printf("员工%d 的工资为 %.2lf元\n",IDarr[i],salary_arr[i]); //输出对应工资 break; } } }
第三题 查找某两个工资金额范围内的所有员工并输出对应信息
也可以新建数组保存查找到的元素,之后再输出,我这里为了节省时间就直接输出了
void search_scope(){ printf("请输入需要查找的范围\n"); double a,b; scanf("%lf%lf",&a,&b);//获取范围 for (int i=0; i<100; i++) {//循环查找 if (salary_arr[i]>=a&&salary_arr[i]<=b) { printf("员工%d 的工资为 %.2lf元\n",IDarr[i],salary_arr[i]); } } }
第四题 求所有员工平均工资
同样的,循环查找元素,累加,判断是否到尾
void average(){ double sum=0,average,count; for (int i=0; i<100; i++) { if (IDarr[i]==0) {//判断是否为空,为空跳出循环 break; } sum+=salary_arr[i];//累加 count++;//计数+1 } average=sum/count; printf("平均工资为%.2lf元\n",average); }
第五题 求员工中的最高工资及最低工资
创建两个变量保存临时数,一一对比,注意最小值对比时要把空的元素跳过
void max_min(){ double max=salary_arr[0]; double min=salary_arr[0]; for (int i=0; i<100; i++) { if (salary_arr[i]>=max) {//判断是否大于最大值 max = salary_arr[i];//更换最大值 } if (salary_arr[i]<=min) {//判断是否小于最小值 if (IDarr[i]==0) {//判断是否为空,为了不影响其他函数,为空跳出本次循环 continue; } min = salary_arr[i];//更换最小值 } } printf("最高工资:%.2lf 最低工资%.2lf\n",max,min); }
第六题 假如新入职两名员工,请将他们的工号和工资插入已有数组中
没太明白要干啥,跟第一题一种方法
第七题 假如有一名员工离职,请将其信息删除并保证数组的连续性
说是删除,其实时把后面的元素全部往前覆盖,这样就达到了删除且保留连续性的效果
void del(){ int delect=0; int n=100; printf("请输入你要删除的工号:"); scanf("%d",&delect); for(int i=0;i<100;i++)//循环查找 { if(delect==IDarr[i])//查找 { for(int j=i;j<99;j++)//循环覆盖 { IDarr[j]=IDarr[j+1];//覆盖 salary_arr[j]=salary_arr[j+1];//同步覆盖 } } } }
第八题 请按照工资从低到高排序输出对应员工工号及工资信息
冒泡排序,懂的都懂,不懂的可以去 b 站搜教,理论还是非常简单的,用工资数组比较,同时更换工号和工资顺序
void paixu(){ int i,temp_id; double temp; for(i = 0; i < 100; i++)//循环轮次 { for(int j = 0; j < i; j++)//每次循环 { if(salary_arr[j] > salary_arr[j + 1])//判断前后大小 { if (salary_arr[j+1]==0) {//判断后续是否为空,为空跳出循环 break; } temp = salary_arr[j];//交换工资数组 salary_arr[j] = salary_arr[j + 1]; salary_arr[j + 1] = temp; temp_id = IDarr[j];//交换工号数组 IDarr[j] = IDarr[j + 1]; IDarr[j + 1] = temp_id; } } } }
额外函数 输出数组 菜单
用来测程序,看看当前数组的情况
void print_ar(){ for (int i=0; i<100; i++) { if (IDarr[i]==0) {//判断是否为空,为空跳出循环 break; } printf("员工%d 的工资为 %.2lf元\n",IDarr[i],salary_arr[i]); } }
菜单,用 while 函数重复循环
void list(){ while(1){ printf("1.插入员工工资\n"); printf("2.查找员工工资\n"); printf("3.范围查找员工工资\n"); printf("4.求平均工资\n"); printf("5.求最高工资与最低工资\n"); printf("6.退出程序(题目6同功能1)\n"); printf("7.删除员工工资\n"); printf("8.员工工资排序\n"); printf("9.输出全部数组\n"); printf("请输入需要的功能:"); int i; scanf("%d",&i); switch (i) { case 1: insert();break;//插入 case 2: search();break;//搜索 case 3: search_scope();break;//范围查找 case 4: average();break;//求平均工资 case 5: max_min();break;//求最大最小工资 case 6: exit(0);//退出 case 7: del();break;//删除 case 8: paixu();break;//冒泡排序 case 9: print_ar();break;//输出数组 } } }
总代码集合
#include <cstddef> #include <ctime> #include <functional> #include <iostream> #include <iterator> #include <stdio.h> #include <cstdlib> static int IDarr[100]; static double salary_arr[100]; void insert(){ printf("请输入需要添加的员工号和工资:"); int id; double salary; scanf("%d%lf",&id,&salary); for (int i=0; i<100;i++) { if(IDarr[i]==0){//判断元素是否为空 IDarr[i]=id;//插入元素 salary_arr[i]=salary;//插入元素 printf("已插入员工:%d 工资: %.2lf\n",IDarr[i],salary_arr[i]);//输出插入的两个元素 break; } } } void search(){ printf("请输入需要查找的员工号:\n"); int id; scanf("%d",&id); for (int i=0; i<100;i++) { if(IDarr[i]==id){//判断员工号是否相等 printf("员工%d 的工资为 %.2lf元\n",IDarr[i],salary_arr[i]); //输出对应工资 break; } } } void search_scope(){ printf("请输入需要查找的范围\n"); double a,b; scanf("%lf%lf",&a,&b);//获取范围 for (int i=0; i<100; i++) {//循环查找 if (salary_arr[i]>=a&&salary_arr[i]<=b) { printf("员工%d 的工资为 %.2lf元\n",IDarr[i],salary_arr[i]); } } } void average(){ double sum=0,average,count; for (int i=0; i<100; i++) { if (IDarr[i]==0) {//判断是否为空,为空跳出循环 break; } sum+=salary_arr[i];//累加 count++;//计数+1 } average=sum/count; printf("平均工资为%.2lf元\n",average); } void max_min(){ double max=salary_arr[0]; double min=salary_arr[0]; for (int i=0; i<100; i++) { if (salary_arr[i]>=max) {//判断是否大于最大值 max = salary_arr[i];//更换最大值 } if (salary_arr[i]<=min) {//判断是否小于最小值 if (IDarr[i]==0) {//判断是否为空,为了不影响其他函数,为空跳出本次循环 continue; } min = salary_arr[i];//更换最小值 } } printf("最高工资:%.2lf 最低工资%.2lf\n",max,min); } void del(){ int delect=0; int n=100; printf("请输入你要删除的工号:"); scanf("%d",&delect); for(int i=0;i<100;i++)//循环查找 { if(delect==IDarr[i])//查找 { for(int j=i;j<99;j++)//循环覆盖 { IDarr[j]=IDarr[j+1];//覆盖 salary_arr[j]=salary_arr[j+1];//同步覆盖 } } } } void print_ar(){ for (int i=0; i<100; i++) { if (IDarr[i]==0) {//判断是否为空,为空跳出循环 break; } printf("员工%d 的工资为 %.2lf元\n",IDarr[i],salary_arr[i]); } } void paixu(){ int i,temp_id; double temp; for(i = 0; i < 100; i++)//循环轮次 { for(int j = 0; j < i; j++)//每次循环 { if(salary_arr[j] > salary_arr[j + 1])//判断前后大小 { if (salary_arr[j+1]==0) {//判断后续是否为空,为空跳出循环 break; } temp = salary_arr[j];//交换工资数组 salary_arr[j] = salary_arr[j + 1]; salary_arr[j + 1] = temp; temp_id = IDarr[j];//交换工号数组 IDarr[j] = IDarr[j + 1]; IDarr[j + 1] = temp_id; } } } } void list(){ while(1){ printf("1.插入员工工资\n"); printf("2.查找员工工资\n"); printf("3.范围查找员工工资\n"); printf("4.求平均工资\n"); printf("5.求最高工资与最低工资\n"); printf("6.退出程序(题目6同功能1)\n"); printf("7.删除员工工资\n"); printf("8.员工工资排序\n"); printf("9.输出全部数组\n"); printf("请输入需要的功能:"); int i; scanf("%d",&i); switch (i) { case 1: insert();break;//插入 case 2: search();break;//搜索 case 3: search_scope();break;//范围查找 case 4: average();break;//求平均工资 case 5: max_min();break;//求最大最小工资 case 6: exit(0);//退出 case 7: del();break;//删除 case 8: paixu();break;//冒泡排序 case 9: print_ar();break;//输出数组 } } } int main(){ list();//执行菜单 return 0; }
大部分头文件没啥用,我这里也懒得删了,你可以自己对比看看删除一些
感觉不如二维数组(狗头)