本文最后更新于 759 天前,其中的信息可能已经有所发展或是发生改变。
实验要求
编写一个简单的员工工资管理系统,用两个一维数组分别存放员工工号和工资。要求实现如下功能:
(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;
}
大部分头文件没啥用,我这里也懒得删了,你可以自己对比看看删除一些
感觉不如二维数组(狗头)