C语言的员工管理系统

2023-10-28

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void run();				//运行函数
int menu();				//主菜单函数
void input();			//输入函数
void check();			//查询函数
void change();			//修改函数
void back();			//删除函数
void sort();			//排序函数
void output();			//显示函数
void statistics();		//统计函数
void writefile();		//保存至文件函数
void readfile();		//读文件函数	

struct staff
{
	char number[5];		//员工编号
	char name[5];		//员工姓名
	int base_salary;	//员工基础工资
	int award;			//员工奖金
	int deduct;			//员工扣款
	int gross_pay;		//员工应发工资
	int tax;			//员工税款
	int net_pay;		//员工实发工资
	int judge;			//判断该结构体是否录入数值
}zxl[50];

void input()			//输入函数
{
	int i,j,k;
	for(i=0;i<50;i++)
	{
		if(zxl[i].judge==0)
		{
	input1:	printf("请输入员工信息:\n");
			printf("	员工编号:");
			scanf("%s",zxl[i].number);
			for(k=0;zxl[k].judge==1;k++)
			{
				if(!strcmp(zxl[k].number,zxl[i].number))
				{
					printf("录入编号与原有编号有重复!请重新编号!\n");
					goto input1;
				}
			}
			zxl[i].judge = 1;
			printf("	员工姓名:");
			scanf("%s",zxl[i].name);
			printf("	员工基础工资:");
			scanf("%d",&zxl[i].base_salary);
			printf("	员工奖金:");
			scanf("%d",&zxl[i].award);
			printf("	员工扣款:");
			scanf("%d",&zxl[i].deduct);
			printf("	员工应发工资:");
			scanf("%d",&zxl[i].gross_pay);
			printf("	员工税款:");
			scanf("%d",&zxl[i].tax);
			printf("	员工实发工资:");
			scanf("%d",&zxl[i].net_pay);
			printf("是否继续输入员工信息\n 1、继续 2、退出\n请选择:");
	error1:	scanf("%d",&j);
			if(j==2) break;
			else if(j==1) continue;
			else
			{
				printf("请输入1或2:");
				goto error1;
			}
		}
	}
}

int menu()
{
	int m;
	printf("\n\n");
	printf("*****************************主菜单*****************************\n");
	printf("*  1、输入员工工资记录			6、统计工资各等级人数  *\n");
	printf("*  2、查询员工工资记录			7、显示员工工资记录表  *\n");
	printf("*  3、修改员工工资记录			8、保存工资记录至文件  *\n");
	printf("*  4、删除员工工资记录			9、从文件读入员工数据  *\n");
	printf("*  5、对员工工资记录排序		0、退出本工资管理系统  *\n");
	printf("****************************************************************\n");
	printf("请选择功能:");
	scanf("%d",&m);
	return m;
}

void run()
{
	int i,j=1;
	int m;	
	for(i=0;i<50;i++)
	{
		zxl[i].judge = 0;
	}
	printf("**********************欢迎来到工资管理系统**********************\n");
	do{
		m=menu();
		switch(m)
		{
			case 1: input(); break;
			case 2: check(); break;
			case 3: change(); break;
			case 4: back(); break;
			case 5: sort(); break;
			case 6: statistics();break;
			case 7: output();break;
			case 8: writefile();break;
			case 9: readfile();break;
			case 0: j=0;break;
			default: printf("输入错误!请输入 0、1、2、3、4、5、6、7、8!\n");
		}
	}while(j);
	printf("*************************已成功退出系统*************************\n");
}

void check()				//查询函数
{
	int i,j;
	char temp[5];
check1: printf("请输入需要查询的信息:");
	scanf("%s",temp);
	for(i=0;zxl[i].judge==1;i++)
	{
		if(!strcmp(temp,zxl[i].number)||!strcmp(temp,zxl[i].name))//根据员工的编号和姓名均可查询
		{
			printf("员工编号 姓名 基础工资 奖金   扣款    应发工资  税款   实发工资\n");
			printf("%s	%s	%d	%d	%d	%d	%d	%d\n",zxl[i].number,zxl[i].name,zxl[i].base_salary,zxl[i].award,zxl[i].deduct,zxl[i].gross_pay,zxl[i].tax,zxl[i].net_pay);
		}
	}
	printf("是否继续查询员工信息\n 1、继续 2、退出\n请选择:");
error2:	scanf("%d",&j);
	if(j==2) return;
	else if(j==1) goto check1;
	else
	{
		printf("请输入1或2:");
		goto error2;
	}
}

void change()				//修改函数
{
	int i,j,k;
	char temp[5];
	k = 0;
change1: printf("请输入需要修改的员工:");
	scanf("%s",temp);
	for(i=0;zxl[i].judge==1;i++)
	{
		if(!strcmp(temp,zxl[i].number)||!strcmp(temp,zxl[i].name))//根据员工的编号和姓名均可修改
		{
			k = 1;
			printf("************************************************************\n");
			printf("1、基础工资 2、奖金 3、扣款 4、应发工资 5、税款 6、实发工资\n");
			printf("************************************************************\n");
			printf("请选择修改内容:\n");
			scanf("%d",&j);
			switch(j)
			{
				case 1: 
				{
					printf("原有金额为:%d;改为:",zxl[i].base_salary);
					scanf("%d",&zxl[i].base_salary);
					break;
				}
				case 2:
				{
					printf("原有金额为:%d;改为:",zxl[i].award);
					scanf("%d",&zxl[i].award);
					break;
				}
				case 3: 
				{
					printf("原有金额为:%d;改为:",zxl[i].deduct);
					scanf("%d",&zxl[i].deduct);
					break;
				}
				case 4:
				{
					printf("原有金额为:%d;改为:",zxl[i].gross_pay);
					scanf("%d",&zxl[i].gross_pay);
					break;
				}
				case 5:
				{
					printf("原有金额为:%d;改为:",zxl[i].tax);
					scanf("%d",&zxl[i].tax);
					break;
				}
				case 6: 
				{
					printf("原有金额为:%d;改为:",zxl[i].net_pay);
					scanf("%d",&zxl[i].net_pay);
					break;
				}
			}
		}
	}
	if(k==0)
	{
		printf("*	没有找到该员工!	 *");
	}
	printf("是否继续修改员工信息\n 1、继续 2、退出\n请选择:");
error3:	scanf("%d",&j);
	if(j==2) return;
	else if(j==1) goto change1;
	else
	{
		printf("请输入1或2:");
		goto error3;
	}
}

void back()				//删除函数
{
	int i,j,k;
	char temp[5];
back1:k = 0;
	printf("请输入需要删除信息的员工:");
	scanf("%s",temp);
	for(i=0;zxl[i].judge==1;i++)
	{
		if(!strcmp(temp,zxl[i].number)||!strcmp(temp,zxl[i].name))//根据员工的编号和姓名均可删除
		{
			for(j=i;zxl[j].judge==1;j++)
			{
				zxl[j]=zxl[j+1];					//删除一名员工后,排在后面的员工依次往前挪一位
			}
			k = 1;
		}
		if(k==1) break;
	}
	printf("是否继续修改员工信息\n 1、继续 2、退出\n请选择:");
error4:	scanf("%d",&j);
	if(j==2) return;
	else if(j==1) goto back1;
	else
	{
		printf("请输入1或2:");
		goto error4;
	}
}
void output()				//显示函数
{
	int i;
	printf("所有员工信息:\n");
	if(zxl[0].judge==1)
	{
		printf("员工编号\t姓名\t基础工资\t奖金\t扣款\t应发工资\t税款\t实发工资\n");
		for(i=0;zxl[i].judge==1;i++)
		{
			printf("%s\t\t%s\t\t%d\t%d\t%d\t%d\t%d\t%d\n",zxl[i].number,zxl[i].name,zxl[i].base_salary,zxl[i].award,zxl[i].deduct,zxl[i].gross_pay,zxl[i].tax,zxl[i].net_pay);
		}
	}
	else 
	{
		printf("*	未输入员工信息	 *");
	}
}
void writefile()				//保存至文件函数
{
	FILE *fp;
	if((fp=fopen("E:\\c语言编译器\\Microsoft Visual Studio\\text\\C.data","wb"))==NULL)
	{
		printf("Cannot open file!\n");
		exit(0);
	}
	fwrite(zxl,sizeof(struct staff),50,fp);
	fclose(fp);
}

void readfile()					//读文件函数
{
	FILE *fp;
	if((fp=fopen("E:\\c语言编译器\\Microsoft Visual Studio\\text\\C.data","rb"))==NULL)
	{
		printf("Cannot open file or file does not exist!\n");
		exit(0);
	}
	rewind(fp);
	fread(zxl,sizeof(struct staff),50,fp);
	fclose(fp);
}

void statistics()				//统计函数
{
	int i,A=0,B=0,C=0,D=0;		//按照实发工资分为四个等级
	for(i=0;zxl[i].judge==1;i++)
	{
		if(zxl[i].net_pay>=10000) A++;
		else if(zxl[i].net_pay>=5000) B++;
		else if(zxl[i].net_pay>=2000) C++;
		else D++;
	}
	printf("A级工资员工 %d 个\n",A);
	printf("B级工资员工 %d 个\n",B);
	printf("C级工资员工 %d 个\n",C);
	printf("D级工资员工 %d 个\n",D);
}
void sort()				//排序函数
{
	int i,j,num;
	struct staff temp;
	num = 0;
	for(i=0;zxl[i].judge==1;i++)
	{
		num = num+1;
	}
	for(i=0;i<num-1;i++)
	{
		for(j=0;j<num-i-1;j++)
		{
			if(zxl[j].net_pay<zxl[j+1].net_pay)//根据每个人的实发工资从高到低进行排序
			{
				temp = zxl[j];
				zxl[j] = zxl[j+1];
				zxl[j+1] = temp;
			}
		}
	}
}


int main()
{
	run();
	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

struct staff是结构体的名称,结构体里面定义了员工的编号、姓名、基础工资、奖金、扣款、应发工资、税款、实发工资、judge(我自己定义的一个变量,用来判断该结构体是否录入数值,比如我定义一个能容纳50个结构体的数组,没有赋值前judge变量为0,赋值一个之后他的0就变成1了,在后来输出的时候系统就会识别1即为需要输出的,如果还是0就是没有输入信息的即不需要输出的),记住结构体数组名后要加分号。switch函数中按下0至9有各自的功能,记住要加break。

文件函数定义的时候用绝对地址,把输入内容保存为.data文件,删除函数里zxl[j]=zxl[j+1]就是把删除的那一名员工后面的员工往前挪一位,修改函数里面用了switch函数判断改哪一条信息,最重要的是在查询函数,删除,修改函数if(!strcmp(temp,zxl[i].number)||!strcmp(temp,zxl[i].name))根据员工姓名和编号都可以查询员工信息。

统计员工工资进行等级划分时,人为的把0到2000的划为D等,2000到5000的划为C等,5000到10000的划为B等,10000以上的划为A等,用if...else if...else if...else...来实现划分等级。在按照工资从大到小排序时用了冒泡法,temp = zxl[j];zxl[j] = zxl[j+1];zxl[j+1] = temp;简单来说就是不停的与他后面一个数相比较,如果后面一个数比他大就交换位置。

这个员工工资管理系统主要是由几个功能:1、输入员工工资记录 2、查询员工工资记录 3、修改员工工资记录 4、删除员工工资记录 5、对员工工资记录排序 6、统计工资各等级人数 7、显示员工工资记录表 8、保存工资记录至文件 9、从文件读入员工数据 0、退出本工资管理系统,每一个功能我们可以自定义一个函数去实现它。之后我们定义一个结构体数组struct staff,这里面包括了每一名员工工资的基本信息。为了防止由于公司员工较多而导致在输入数据的时候出现错误把两个人的编号输成一样的了,我加了一条语句if(!strcmp(zxl[k].number,zxl[i].number)),这是用来判断是否出现了两个一样的员工编号,如果出现重复系统就会自动要求你重新输入。

程序在输入完一名员工信息后会让用户做出一个选择,是继续输入信息还是退出输入,但是如果有人不小心按的既不是1也不是2就会无法进行下一步了,介于以上可能会出现的操作失误我在一些自定义函数中加入了goto函数和判断语句,如果出现上述情况可以利用goto函数的标签跳到输入1,2的位置重新输入一次。

在根据员工工资对员工排序的时候使用了冒泡法从高到低进行排序,简单来说就是不停的与他后面一个数相比较,temp = zxl[j];zxl[j] = zxl[j+1];zxl[j+1] = temp;如果后面一个数比他大就交换位置。

在整个程序中用到了switch函数,但是要注意在每一个case后面一定要加上break,当然为了避免输入一些其他的数字我们有必要加上default语句。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言的员工管理系统 的相关文章

随机推荐

  • 基于阿里云ECS服务器搭建k8s集群

    此处仅有两台服务器 一台master节点 一台node节点 后期可按照步骤继续增加node节点 1 搭建环境 Master节点 CPU 2核 内存 2GiB 操作系统 Centos7 6 64位 带宽 1Mbps 服务器公网IP 私有IP
  • JDBC在IDEA中配置mysql过程及编程详解

    目录 jdbc编程简介 1 导入jar包 2 建立数据库连接 2 1 创建数据源 描述数据库服务器在哪 2 2 实现一个mysql客户端 通过网络和服务器进行通信 3 使用代码操作数据库 3 1 增删改操作 增加操作 更新操作 删除操作 3
  • 【论文阅读】Contiual learning with hypernetwork

    文章目录 论文阅读 2019 Contiual learning with hypernetwork 1 超网络简介 2 论文的总体介绍 3 相关的介绍 3 1 一些数学符号 3 2 继续学习从模型角度的理解 4 论文将超网络继续学习模型分
  • 0-1背包问题--动态规划解法

    问题描述 给定n种物品和一背包 物品i的重量是wi 其价值为vi 背包的容量为C 问应如何选择装入背包的物品 物品不能分割 使得装入背包中物品的总价值最大 抽象描述如下 x n 表示物品的选择 x i 1表示选择放进物品i到背包中 问题分析
  • CSS学习--css的由来(1)

    一 什么是css 1 css Cascading Style Sheets 层叠样式表 级联样式表 2 css 是控制HTML文档内容的排版 二 css解决了什么问题 以前网页的元素的样式 全部是依靠标签属性来控制 比如 h1 align
  • 基于C++与CUDA的N卡GPU并行程序——OpenGL图形互操作性

    图形互操作性的极简框架示例 GPU的成功要归功于它能实时计算复杂的渲染任务 同时系统的其他部分还可以执行其他的任务 这就带来了一个显而易见的问题 能否在同一个应用程序中GPU既执行渲染计算 又执行通用计算 如果要渲染的图像依赖通用计算的结果
  • KVM重定向PCI

    应用场景 将服务器上的USB控制器 重定向到KVM中 一 修改KVM的配置文件 1 查看KVM的xml配置文件 KVM的配置文件存放在 etc libvirt qemu目录下 使用vi进行编辑 下面的这个KVM是重定向了一个PIC控制器 添
  • Windows平台Java开发环境的搭建

    下载安装JDK 首先到oracle的jdk下载页面 下载jdk jdk建议使用最新的jdk8 根据系统版本选择32位或者64位的 下载完成之后点击安装 安装位置随意 但是必须记住 一会配置环境变量的时候会用到 配置环境变量 安装完成之后就可
  • ubuntu 16.04 安装ssh失败,原因竟然是自带的openssh-client版本造成的

    ubuntu 16 04默认安装上了最新的openssh client 可以连接其他计算机上的ssh服务 而没有安装openssh server服务端 允许其他计算机通过ssh访问和操作计算机 如 xshell等工具 openssh ser
  • 题海战 C++ STL set应用

    目录 题目描述 思路分析 代码 题目描述 某信息学奥赛教练经验丰富 他的内部题库有 m 道题 他有 n 个学生 第 i 个学生已经做过p i 道题 由于马上要进行noip考试 该教练准备举行 k 场比赛和训练 每场比赛或训练都会有一些他的学
  • STM32堆和栈及变量的存储理解

    STM32堆和栈及变量的存储理解 转至 https blog csdn net shaynerain article details 71952754 关于堆和栈已经是程序员的一个月经话题 大部分有是基于os层来聊的 那么 在赤裸裸的单片机
  • 学习太极创客 — MQTT 第二章(九)本章测试

    程序代码如下 项目名称 Project 零基础入门学用物联网 程序名称 Program name complete connect 团队 Team 太极创客团队 Taichi Maker www taichi maker com 作者 Au
  • 硬件比软件难,那为什么硬件工程师待遇还不如软件?

    大家好 我是张巧龙 今天看知乎 有一个很有意思的问题 硬件明明比软件更难 国内的硬件技术也不如软件 为什么硬件工程师待遇还不如软件 在这里分享几个回答 有一定的参考价值 欢迎留言讨论 01 回答1 作者 Tinker 链接 https ww
  • FFmpeg调用avformat_open_input时返回错误 -22(Invalid argument)

    一 FFmpeg报错误 22 Invalid argument 这个错误确实浪费了我一晚上 为啥呢 因为我打开rtsp的地址是能播放的 但是换成http xxx HD live mp4 auth key xxx这种带鉴权的地址后 就报非法参
  • minikube 部署的 k8s 集群准备 kubeconfig 文件

    CSDN 中文章不一定能及时更新 欢迎点击前往我的博客查看最新版本 许盛的博客 题外话 最近大出血 换了 m1pro 黑苹果就暂时没啥用了 本来准备装个 ubuntu 用来部署 kubesphere 玩玩的 不过在尝试了 ubuntu 官方
  • margin重叠问题、 解决办法

    margin重叠问题 两个块级元素的上外边距和下外边距可能会合并 折叠 为一个外边距 其大小会取其中外边距值大的那个 这种行为就是外边距折叠 重叠只会出现在垂直方向 解决办法 兄弟之间重叠
  • 联邦学习-区块链论文笔记:Blockchained On-Device Federated Learning

    链接 IEEE Xplore Full Text PDF ieeexplore ieee org stamp stamp jsp tp arnumber 8733825 作者 Hyesung Kim 延世大学团队 一点感悟 区块链和联邦学习
  • 2021年暑假康复性训练(Codeforces Round #731 (Div. 3))全题解

    2021暑假康复性训练 Codeforces Round 731 Div 3 A Shortest Path with Obstacle B Alphabetical Strings C Pair Programming D Co grow
  • libboost_system.so.xxx: cannot open shared object file: No such file or directory

    遇见这个错误说明没找到libboost system so xxx文件 1 查看 usr local lib下是否有这个库文件 有的话说明已经安装了libboost system 没有说明没有安装 2 若没有安装就下载个安装包 安装好 再测
  • C语言的员工管理系统

    include