用c++编写一个简单的员工管理系统

2023-11-02

文章目录


题目要求

高校工资管理系统
现一高校有五类职工:教师,实验员,行政人员,教师兼职实验员,行政人员兼
职教师。
为了实现工资发放的自动功能,现要求编写程序来自动完成此功能。任意职工的
工资查询(可
由职工编号和职工姓名来实现),如若有职工由于工作调动,则可进行相对应的
删除动作。
职工信息包括编号、类型、姓名、性别、年龄、政治面貌、学历、工资等。
相关信息:
每一学期将学校职工的本学期任职情况及上学期工作的相关情况输入计算机,则
本学期
职工的月工资按程序处理后的结果发放,其中职工的工资计算方法如下:
其中工资的基本构成如下:
教师: 基本工资+课时费;
实验员: 基本工资+实验室补助;
行政人员: 基本工资+行政补贴;
教师兼职实验员: 基本工资+课时费+实验室补助;
行政人员兼职教师:基本工资+行政补贴+课时费;
其中:
1)课时费:教师每一学期的基本工作量为 120,实验员每学期基本工作量为 70,
政人员没有基本工作量,每节课时费为 20 元;课时费=(上学期工作量-基本工
量)*20; 注意:如果上学期基本工作量没完成,则其(上学期工作量-基本工作
量)*20 为负值。
2)基本工资:教师 800 元,实验员 650 元,行政人员 750 元。
3)行政补贴:250 元。
4)实验室补助:150 元。
基本要求:
1、加载职工信息:从文件中的学校人员基本信息加载到系统中
2、增加职工信息:可以从键盘录入新职工信息,如果目前学校无职工,则直接
录入员工信息;
如果有职工,则自动生成新员工的编号(增加 1)。
3、查询职工信息:按“编号”或“姓名”查询职工,并输出相关信息。
4、修改职工信息:对录入的职工信息重新进行编辑、修改,
5、删除职工信息:当职工离开学校时删除相关信息。
6、统计职工信息:例如,系统可以统计学校中的党员人数和女员工人数。 7、学校职工信息存盘:把员工基本信息存储到磁盘文件中,方便用户以后读取
数据,避免重
复录入。
8、显示职工信息:系统可以输出学校所有职工的信息,包括编号、姓名、性别、
年龄、政治
面貌、学历、工资、人员类型等。
9、要求利用菜单的形式进行管理 (可以采用文本菜单,如果图形菜单更好)

一、设计思路

设计思路:定义一个基类,基类中包含所有的基本成员信息和成员函数,基本
的功能实现均是通过调用基类的成员函数来实现。再定义五个派生类,代表不
同类型员工,派生类中包含计算工资的函数,调用派生类中的函数来计算不同
类型员工工资。该系统共有 6 个类,包括一个 staff 的基类,五个派生类
A,B,C,D,E,分别代表五类不同的员工。

staff员工基类:

protected: 员工编号number,员工类型type,员工姓名name,员工性别sex,员工年龄age,员工政治面貌political,员工学历education

  public: 加载员工信息display(),修改员工信息edit(),删除员工delete(),增加员工input(),返回员工类型,用于统计人数sum(),返回员工编号,用于匹配员工summ()

A职工派生类:保护继承,并声明一个计算A类员工工资pay1()

B职工派生类:保护继承,并声明一个计算B类员工工资pay2()

C职工派生类:保护继承,并声明一个计算C类员工工资pay3()

D职工派生类:保护继承,并声明一个计算D类员工工资pay4()

E职工派生类:保护继承,并声明一个计算E类员工工资pay5()

 

 

 

 

 

 

 

 

 

二、具体程序

#include <iostream>
#include <string>
using namespace std;
class staff //建立一个员工基类 
{
	protected:
		string number;
		string type;
		string name;
		string sex;
		string age;
		string political;
		string education;
	public:
		staff(string number1="...",string type1="...",string name1="...",string sex1="...",string age1="...",string political1="...",string education1="...");//声明构造函数,并指定默认参数 
		void display();//声明一个显示员工信息的成员函数 
		void input();//声明一个输入员工信息的成员函数 
		void delet();//声明一个删除员工信息的成员函数 
		void edit();//声明一个修改员工信息的成员函数 
		string sum();//声明一个统计员工数量的成员函数 
		string summ();
};
staff::staff(string number1,string type1,string name1,string sex1,string age1,string political1,string education1)
		{
			number=number1;
			type=type1;
			name=name1;
			sex=sex1;
			age=age1;
			political=political1;
			education=education1;
			
		}
		
void staff::input()
{
	cout<<"请输入职员的编号,类型,姓名,性别,年龄,政治面貌,学历:"<<endl;
	cin>>number>>type>>name>>sex>>age>>political>>education;
}

void staff::display()
{
	cout<<"员工编号:"<<number
		<<" 员工类型:"<<type
		<<" 员工姓名:"<<name
		<<" 员工性别:"<<sex
		<<" 员工年龄:"<<age
		<<" 员工政治面貌:"<<political
		<<" 员工学历:"<<education<<endl;
}
void staff::delet()
{
	number="...";
	type="...";
	name="...";
	sex="...";
	age="...";
	political="...";
	education="...";
}
void staff::edit()
{
	cout<<"请输入新的职员编号,类型,姓名,性别,年龄,政治面貌,学历:"<<endl;
	cin>>number>>type>>name>>sex>>age>>political>>education;
}
string staff::sum()
{
	return type;//返回员工的类型 
}
string staff::summ()
{
	return number;
}

class A:protected staff//建立一个A类员工的派生类 
{
	public:
		void pay1();//声明一个计算工资的成员函数 
};
void A::pay1()
{
	int x;
	int y;
	cout<<"该员工是否完成上学期的工作量"<< "\n1.是"<<"\n2.否"<<endl;
	cin>>x;
	if(x==1)
	{
		cout<<"请输入该员工上学期的工作量"<<endl;
	    cin>>y;
	    cout<<"该成员的工资为:"<<800+(y-120)*20<<"元"<<endl;
	}
	if(x==2)
	{
		cout<<"请输入该员工上学期的工作量"<<endl;
	    cin>>y;
	    cout<<"该成员的工资为:"<<800+(120-y)*20<<"元"<<endl;
	}
}

class B:protected staff//建立一个B类员工的派生类 
{
	public:
		void pay2();//声明一个计算工资的成员函数 
};
void B::pay2()
{
	    cout<<"该成员的工资为:"<<800<<"元"<<endl;
}

class C:protected staff//C类员工的派生类 
{
	public:
		void pay3();//计算工资 
};
void C::pay3()
{
	    cout<<"该成员的工资为:"<<1000<<"元"<<endl;
}

class D:protected staff//D类员工的派生类 
{
	public:
		void pay4();//计算工资 
};
void D::pay4()
{
	int x;
	int y;
	cout<<"该员工是否完成上学期的工作量"<< "\n1.是"<<"\n2.否"<<endl;
	cin>>x;
	if(x==1)
	{
		cout<<"请输入该员工上学期的工作量"<<endl;
	    cin>>y;
	    cout<<"该成员的工资为:"<<800+650+150+(y-120)*20+(y-70)*20<<"元"<<endl;
	}
	if(x==2)
	{
		cout<<"请输入该员工上学期的工作量"<<endl;
	    cin>>y;
	    cout<<"该成员的工资为:"<<800+650+150+(120-y)*20+(70-y)*20<<"元"<<endl;
	}
}
class E:protected staff//E类员工的派生类 
{
	public:
		void pay5();//计算工资 
};
void E::pay5()
{
	int x;
	int y;
	cout<<"该员工是否完成上学期的工作量"<< "\n1.是"<<"\n2.否"<<endl;
	cin>>x;
	if(x==1)
	{
		cout<<"请输入该员工上学期的工作量"<<endl;
	    cin>>y;
	    cout<<"该成员的工资为:"<<800+750+250+(y-120)*20+y*20<<"元"<<endl;
	}
	if(x==2)
	{
		cout<<"请输入该员工上学期的工作量"<<endl;
	    cin>>y;
	    cout<<"该成员的工资为:"<<800+750+250+(120-y)*20-y*20<<"元"<<endl;
	}
}
int main()//主函数 
{
	staff s[100]={};
	s[0]={"1","A","张三","男","25","党员","本科"};
    s[1]={"2","B","李四","女","27","群众","硕士"};
    s[2]={"3","C","王五","男","30","党员","博士"};
	s[3]={"4","D","赵六","男","26","团员","本科"};
	s[4]={"5","E","孙七","女","33","群众","硕士"};
	//定义一个staff类的对象数组s[100],并赋值 
	A a1;//定义A类的对象a1 
	B b1;//定义B类的对象b1 
	C c1;
	D d1;
	E e1;
	int i,j; 
	int z=5;
	string d;
	string e;
	string f;
	for(i=1;i<30;i++)//建立一个循环,使得菜单页面可以循环出现 
	{
		cout<<endl<<endl;
		cout<<"========高校工资管理系统========"<<endl;
		cout<<" 1. 加载职工信息 "<<endl;
		cout<<" 2. 增加职工信息 "<<endl;
		cout<<" 3. 按编号查询职工工信息 "<<endl;
		cout<<" 4. 删除职工工信息 "<<endl;
		cout<<" 5. 查询职工工资"<<endl;
		cout<<" 6. 修改职工信息"<<endl; 
		cout<<" 7. 统计不同类的职工人数 "<<endl;
		cout<<" 8. 退出系统 " <<endl;
		cout<<"================================"<<endl;
		cout<<endl<<"输入正确的数字选择相应的功能"<<endl;
	    cin>>j;  
	    if(cin.good())//判断输入类型是否正确 
	{
    switch(j)//使用多分支选择结构,通过输入不同的数字来选择不同的功能 
	{
		case(1):
			int a;
			for(a=0;a<15;a++)
			{
				s[a].display();//调用函数 
			}
		    break;//跳出选择结构,但没有跳出循环 
		case(2):
			int b;
		    for(b=z;b<100;b++)
	        {
	        	z=b+1;
			    int c;
				s[b].input();//调用函数 
				cout<<endl<< "是否继续增加新的员工"<<"\n1.是"<<"\n2.否"<<endl;
		 	    cin>>c;
			    if(c==2)break;
		    }
		    break;	//跳出选择结构	
		    case(3):
		    	cout<<"请输入员工编号:"<<endl;		    					
				cin>>d;		
				for(i=0;i<15;i++)
				{
					if(s[i].summ()==d)
					{
					   s[i].display();
					   break;
				    }
				    else
						{
							if(i==14)
							cout<<"此编号不存在"<<endl;
						}
				}
				break;
			
			case(4):
				cout<<"请输入你想删除的员工编号:"<<endl;
				cin>>e;
					for(i=0;i<15;i++)
					{
						if(s[i].summ()==e)
						{
							s[i].delet();
				            cout<<endl<<"已成功删除该成员,按1可查询"<<endl;
				            break;
						}
						else
						{
							if(i==14)
							cout<<"此编号不存在"<<endl;
						}
					}
				break;//跳出选择结构 
			    
			case(5):
				{
				cout<<"请输入员工类型(A类为教师,B类为实验员,C类为行政人员,D类为教师兼实验员,E类为行政人员兼教师)"<<endl;
				string type;
				cin>>type;
					if(type=="A")
					{
						a1.pay1();
						break;
					}
					if(type=="B")
					{
						b1.pay2();
						break;
					}
					if(type=="C")
					{
						c1.pay3();
						break;
					}
					if(type=="D")
					{
						d1.pay4();
						break;
					}
					if(type=="E")
					{
					    e1.pay5();
					    break;
					}
					else 
					{
						cout<<"输入错误,请输入正确的类型"<<endl;
						break;
					}
				}
				    break;
				
			case(6):
				cout<<"请输入你想修改的员工编号:"<<endl;
				cin>>f;
				for(i=0;i<15;i++)
				{
					if(s[i].summ()==f)
					{
						s[i].edit();
						cout<<"修改信息成功,按1可查询"<<endl;
						break;
					}
					else
					{
						if(i==14)
						cout<<"此编号不存在"<<endl;
					}
				}			
				break;
			case(7):
			{
				cout<<"请输入你想统计的员工类型:"<<endl;
				string type;
				cin>>type;
				int x=0;
				int y=0;
					if(type=="A")
					{
							for (x=0;x<15;x++)
						{
							s[x].sum();
							if(s[x].sum()=="A") y++;						
						}
						cout<<"A类员工人数为:"<<y<<endl;
						y=0;
						break; 
					}
					
				    if(type=="B")
				    {
				    	for (x=0;x<15;x++)
						{
							s[x].sum();
							if(s[x].sum()=="B") y++;						
						}
						cout<<"B类员工人数为:"<<y<<endl;
						y=0;
						break; 	
					}
						
				if(type=="C")
				{
						for (x=0;x<15;x++)
						{
							s[x].sum();
							if(s[x].sum()=="C") y++;						
						}
						cout<<"C类员工人数为:"<<y<<endl;
						y=0;
						break; 		
				}
					
					if(type=="D")
					{
						for (x=0;x<15;x++)
						{
							s[x].sum();
							if(s[x].sum()=="D") y++;						
						}
						cout<<"D类员工人数为:"<<y<<endl;
						y=0;
						break; 	
					}
						
					if(type=="E")
					{
						for (x=0;x<15;x++)
						{
							s[x].sum();
							if(s[x].sum()=="E") y++;						
						}
						cout<<"E类员工人数为:"<<y<<endl;
						y=0;
						break; 	
					}
					else//判断输入类型是否正确 
					{
						cout<<"输入错误,请输入正确的类型"<<endl;break;
					}
				}
			    break;
			}
	if(j==8) 
	{
		cout<<"成功退出系统"<<endl;
		break;//跳出循环,结束程序 
	}
	if(j!=1&&j!=2&&j!=3&&j!=4&&j!=5&&j!=6&&j!=7&&j!=8)
	{
		cout<<"输入错误,请输入正确的数字"<<endl;
	}
}
    else
    {
    	cout<<"输入错误,请输入数字"<<endl;
    	cin.clear();//清除错误标记,重新打开输入流 
    	cin.sync();//清除cin缓冲区的数据 
	}
}
	return 0;
}



总结

1.容错性。在这里我用了cin.good()来判断输入类型是否正确。

2.没有使用特别的算法,在搜索的过程中使用的是顺序搜索。

3.这个数组并不是动态的。我指定了该数组只存在二十个成员,也就是说,最多只能输入二十个员工。此处有待改良。

4.编译环境是dev c++

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

用c++编写一个简单的员工管理系统 的相关文章

随机推荐

  • Notepad++查看、编辑二进制文件——安装附加组件HexEditor实现

    Notepad 是一款功能强大的编辑器 单独安装的Notepad 不能查看和编辑2进制 16进制文件 只要安装名为HexEditor的插件就可以了 这里分享出来 插件下载地址与安装 gt 有以下几种方式 我用的第3种 1 打开软件 点击菜单
  • 别再头疼反弹Shell失败了,这篇文章带你找到问题根源

    别再头疼反弹Shell失败了 这篇文章带你找到问题根源 在渗透测试中 反弹shell失败的原因可以有多种 以下是一些常见的原因 1 防火墙和网络过滤器 目标系统可能配置了防火墙或网络过滤器 以限制对外部系统的连接 这些过滤器可以阻止反弹sh
  • 登陆接口的的Filter过滤

    目录 一 概述 二 基本操作 三 登陆检查接口 一 概述 什么是Filter Filter表示过滤器 是 JavaWeb三大组件 Servlet Filter Listener 之一 过滤器可以把对资源的请求拦截下来 从而实现一些特殊的功能
  • vue resource jsonp请求

    vue resource jsonp请求 window onload function var app new Vue el box data methods get function this http jsonp https sug s
  • Python3 ID3决策树判断申请贷款是否成功

    目录 1 定义生成树 2 递归产生决策树 3 调用生成树 4 绘制决策树 5 调用函数 1 定义生成树 coding utf 8 生成树的函数 from numpy import import numpy as np import pand
  • Node-解决sequelize配置时区,差8小时问题

    最近进行node sequelize后台开发时 出现一个关于创建时间写入和读取时差8小时问题 默认配置 写入和读取值一样但是时区有问题 配置东八时区 写入的值是正确的但读取值有时区问题 正确配置 写入和读取值都正确 如有疑问或不足之处 欢迎
  • “The xxx field is required“, Nullable引发的bug

    0 背景 最近接到一个报告的bug 有一个前端的功能不好用了 这个项目是由前端和后台服务组成的 前端用的angular 服务用的是 net6 0 从前端开始排查 发现有个api的返回错误 返回中报告 The xxx field is req
  • 基于unityshader的屏幕模糊处理:

    首先我们都知道 我们所看见的都是摄像机将画面投影到视口纹理上面 也就是一张RenderTexture 四舍五入就是一张图 那么我们就只需要对这张图进行模糊处理就可以了 而模糊处理我们就需要用到对图片像素进行操作 那么用shader最好了 模
  • 启动spyder报错PyCapsule_GetPointer called with incorrect name

    C Users Administrator gt spyder Traceback most recent call last File D anaconda Scripts spyder script py line 10 in
  • JavaScript-----函数

    目录 前言 JavaScript函数 1 定义函数 构造函数 2 调用函数 函数的自执行 3 函数的参数 4 函数返回值 5 作用域 6 匿名函数 7 this指向性问题 重点 7 1 this的性质 7 2 call的用法 7 3 app
  • 不定积分24个基本公式_谈论不定积分及其求法

    一 原函数不定积分的概念 原函数的定义 如果区间I上 可导函数F x 的导函数为f x 即对任一x I都有 F x f x 或 dF x f x dx 那么函数F x 就称为f x 或 f x dx 在区间 I 内的一个原函数 原函数存在定
  • 浅谈 Vue 项目优化

    好久不写博文了 本文作为我使用半年 vue 框架的经验小结 随便谈谈 且本文只适用于 vue cli 初始化的项目或依赖于 webpack 打包的项目 前几天看到大家说 vue 项目越大越难优化 带来很多痛苦 这是避免不了的 问题终究要解决
  • [SGI STL]空间配置器--内存管理

    SGI STL 系列文章前言 废话不多说 读侯捷的SGI STL源码分析目的有三个 1 接触c 不久就开始跟STL打交道 一直有个好奇心 这么强大的库到底是谁 咋实现的 2 不熟悉实现就用不好STL 所以想更好的应用STL 就有必要一探其底
  • 剑指offer:复杂链表的复制、二叉搜索树与双向链表、序列化二叉树、字符串排列、数组中出现次数超过一半的数字、最小的k个数、数据流中的中位数、连续子数组的最大和、1~n整数中1出现的次数

    目录 复杂链表的复制 题目 题解 二叉搜索树与双向链表 题目 题解 序列化二叉树 题目 题解 字符串排列 题目 题解 数组中出现次数超过一半的数字 题目 题解 最小的k个数 题目 题解 数据流中的中位数 题目 题解 连续子数组的最大和 题目
  • Android系统adb模拟按键操作方法

    使用adb命令模拟按键操作 主要是找到对应的按键的keycode 主要命令adb shell input keyevent
  • 计算机学院运动会搞笑解说词,趣味运动会搞笑解说词

    趣味运动会即将开始了 解说词准备好了吗 下面是小编为大家整理了趣味运动会搞笑解说词 希望能帮到大家 拔河 集体的努力 众人的配合 在一阵阵呐喊与掌声中化作无穷的动力 参赛的同学纵情地投入着 运动会现场 气愤热烈而高涨 助威声此起彼伏 跃动的
  • html元素_1.02

    HTML 元素 HTML 文档由 HTML 元素定义 HTML 元素 开始标签 元素内容 结束标签 p 这是一个段落 p a href default htm 这是一个链接 a br 换行 开始标签常被称为起始标签 opening tag
  • 【自然语言处理】基于句子嵌入的文本摘要算法实现

    基于句子嵌入的文本摘要算法实现 人们在理解了文本的含义后 很容易用自己的话对文本进行总结 但在数据过多 缺乏人力和时间的情况下 自动文本摘要则显得至关重要 一般使用自动文本摘要的原因包括 减少阅读时间 根据摘要 选择自己想研究的文档 提高索
  • 正在搜索“字节跳动面经”?这次,让校招面试官亲自为你划重点!

    题解 自动售货系统 GOOD DANJIA 0GOOD COUNTS 1goods A1 2 0 A2 q 题解 交换变量值 import java util Scanner public class Main public static
  • 用c++编写一个简单的员工管理系统

    文章目录 题目要求 一 设计思路 二 具体程序 总结 题目要求 高校工资管理系统 现一高校有五类职工 教师 实验员 行政人员 教师兼职实验员 行政人员兼 职教师 为了实现工资发放的自动功能 现要求编写程序来自动完成此功能 任意职工的 工资查