题目要求
高校工资管理系统
现一高校有五类职工:教师,实验员,行政人员,教师兼职实验员,行政人员兼
职教师。
为了实现工资发放的自动功能,现要求编写程序来自动完成此功能。任意职工的
工资查询(可
由职工编号和职工姓名来实现),如若有职工由于工作调动,则可进行相对应的
删除动作。
职工信息包括编号、类型、姓名、性别、年龄、政治面貌、学历、工资等。
相关信息:
每一学期将学校职工的本学期任职情况及上学期工作的相关情况输入计算机,则
本学期
职工的月工资按程序处理后的结果发放,其中职工的工资计算方法如下:
其中工资的基本构成如下:
教师: 基本工资+课时费;
实验员: 基本工资+实验室补助;
行政人员: 基本工资+行政补贴;
教师兼职实验员: 基本工资+课时费+实验室补助;
行政人员兼职教师:基本工资+行政补贴+课时费;
其中:
(
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++