合肥学院
计算机科学与技术系
课程设计报告
2008~20##学年第二期
20##年6月
一、题目
工资管理系统。某小型公司,主要有四类人员:经理、技术人员、销售经理和推销员。要求存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。
人员编号基数为1000,每输入一位人员就加一。经理升级三级因此为四级,技术人员和销售经理升级二级所以为三级,销售人员升级为二级。
月薪计算办法是:经理拿固定月薪8000元;技术人员按每小时100元领取月薪;推销员的月薪按该推销员当月销售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的0.5‰。
二、问题分析
根据题目要求,编写一个可以管理工资系统的程序,公司有四种成员:经理,销售经理,销售人员,技术人员。每个人员的信息有姓名,编号,级别,当前月薪,人员编号技术为1000。
1.功能选择项:输入选择功能项,及每个功能对应的作用。
2.信息的录入:包括姓名,级别,编号,技术人员需要本月的工作时数,销售经理需要固定月薪和本月销售额,销售人员仅需要本月的销售额,经理需要输入固定月薪。
3.显示信息:显示各人员的姓名,级别,编号和本月应发金额。
根据题目要求设计如下:
1.设计一个主菜单大体如下:
【1】 各成员信息输入一次;
【2】 各成员信息输入两次;
【3】 各成员信息输入三次;
2.程序运行时,首先提示输入雇员姓名;
3.对于经理直接输出其工资及其它信息;
4.对于技术人员,程序提示输入其本月工作时数,然后输出其工资及其它信息;
5.对于推销员,程序提示输入其本月销售额,然后输出其工资及其它信息;
6.对于销售经理,程序提示输入其管辖部门本月销售总额,然后输出其工资及其它信息。
三、算法的设计
根据上述需求,设计一个基类employee,然后派生出technician(技术人员)类、manager(经理)类和salesman(推销员)类。由于销售经理(salesmanager)既是经理又是销售人员,兼具两类人员的特点,因此同时继承manager和salesman两个类。
定义一个雇员类如下:
class employee
{
protected:
char name[20]; //姓名
int num; //个人编号
int grade; //级别
float salary;//月薪总额
static int No; //静态数据:目前编号
public:
employee(); //构造函数
~employee(); //析构函数
virtual void pay()=0; //计算月薪函数(纯虚函数)
virtual void promote(int jishu=0); //升级函数(虚函数)
void SetName(char *); //设置姓名函数
char * GetName(); //提取姓名函数
int GetNum(); //提取编号函数
int Getgrade();//提取级别函数
float Getsalary();//提取月薪函数
};
在基类中,除了定义构造函数和析构函数以外,还应统一定义对各类人员信息都应有的操作,这样可以规范各派生类的基本行为。但是各类人员的月薪计算方法不同,不能在基类employee中统一定义计算方法。各类人员信息的显示内容也不同,同样不能在基类中统一定义显示方法。因此,在employee类中用纯虚函数的方式定义了计算月薪函数pay,然后在派生类中再根据各自的同名函数实现具体的功能。
由于salesmanager的两个基类又有公共基类employee,为避免二义性,这里将employee类设计为虚基类。
系统类图
属性和方法定义
四、调试
由于公司每增加一个雇员,无论他(她)是哪一类人员,也就是employee类的所有派生类对象创建时,都要访问同一个No,因此将No定义为静态数据成员。经理类型时,经理拿基本工资8000,技术人员按小时计算本月拿的工资,销售人员按本月销售额并提取成本,销售经理拿基本工资5000和本月的所管辖部门的销售额提成。
在定义销售经理的类函数时可以建立在经理和销售人员的基础上,既是可以把两者作为基类使用。
class salesmanager:public manager,public salesman
{
public:
salesmanager(); //构造函数
void pay(); //计算月薪函数
void promote(int); //升级函数
};
进一步改进
(1)目前程序中,经理月薪,技术人员的小时酬金和销售人员的销售额提成比例均是固定的,这不适应不同公司的需要,可考虑用带参数的构造函数来解决。
(2)销售经理月薪计算中,要输入其管辖部门当月销售总额。实际上,这可以通过将本部门所有推销员销售额相加而得到。可以考虑在推销员类中增加所属部门等属性来完成这方面的功能。
(3)这次课程设计是我第一次面对大程序,以前只是完成课后慢的小型题目,没有牵涉到链表和文件。C++是建立在C语言上的,上学期没怎么学习C语言所以导致这学期有点困难,其实课程设计是基于会编写和使用一些小的类和函数调用的基础上的,设计的成果是基于对这些内容的熟练掌握程度。课程设计中有许多要求没有做到主菜单的设计和选择功能的语句都没有很好的设计,往往菜单设计好了又不知道怎么和函数或者类相结合使用。总之自己感觉自己做的很不好,说明在大一这学年该学的知识还是没有学好。
这次我没有用到链表和文件只是简单的使用了指针。指针调用是是指向字符串的首地址。
(4)课程设计要把握大局,在用小程序是必须 合理插入和调用小程序,思路清晰。
(5)一开始输出姓名,编号,级别,本月工资时用的是如:emp[i].Getname等形式,可是好像只是用于结构体。
(6)在传字符串是使用到指针,如:
Char name[10]
(7)将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。通过课程设计,学生在下述各方面的能力应该得到锻炼:进一步巩固、加深学生所学专业课程《C++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力,全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的,利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力,对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型,掌握自顶而下的设计方法,将大问题进行模块化,领会结构化程序设计的方法,熟练掌握C++语言的基本语法,灵活运用各种数据类型。
五、测试
主函数中声明四个关于雇员类的对象,分别对对象进行输入信息。
测试结果如下:
【选择功能1】:
******************************************************************************
------------------------------功能选项[主菜单]--------------------------------
******************************************************************************
[1]**************-------------各成员只输入一遍-----------------***************
[2]**************-------------重复功能并运用两遍---------------***************
[3]**************-------------重复功能并运用三遍---------------***************
******************************请输入功能选项**********************************
1
******************************只输入一份信息**********************************
---------------------------------------------------------请输入雇员的姓名:YU
---------------------------------------------------------请输入雇员的姓名:WEN
---------------------------------------------------------请输入雇员的姓名:TI
---------------------------------------------------------请输入雇员的姓名:HU
---------------------------------------------------------请输入兼职技术人员 WEN
本月的工作时数:23
---------------------------------------------------------请输入销售经理 TI 所
管辖部门本月的销售总额:78907
---------------------------------------------------------请输入推销员 HU 本月
的销售额:6789
YU职工号1000级别为4级,本月工资8000
WEN职工号1001级别为3级,本月工资2300
TI职工号1002级别为3级,本月工资5394.54
HU职工号1003级别为1级,本月工资271.56
Press any key to continue
【选择功能2】:
******************************************************************************
------------------------------功能选项[主菜单]--------------------------------
******************************************************************************
[1]**************-------------各成员只输入一遍-----------------***************
[2]**************-------------重复功能并运用两遍---------------***************
[3]**************-------------重复功能并运用三遍---------------***************
******************************请输入功能选项**********************************
2
--------------------------------------------------------请输入雇员的姓名:hua
--------------------------------------------------------请输入雇员的姓名:yu
--------------------------------------------------------请输入雇员的姓名:fang
--------------------------------------------------------请输入雇员的姓名:qing
--------------------------------------------------------请输入兼职技术人员 yu
本月的工作时数:6
--------------------------------------------------------请输入销售经理 fang 所
管辖部门本月的销售总额:5643780
--------------------------------------------------------请输入推销员 qing 本月
的销售额:7896
hua编号1000级别为4级,本月工资8000
yu编号1001级别为3级,本月工资600
fang编号1002级别为3级,本月工资33218.9
qing编号1003级别为1级,本月工资315.84
--------------------------------------------------------请输入雇员的姓名:li
--------------------------------------------------------请输入雇员的姓名:xiu
--------------------------------------------------------请输入雇员的姓名:chun
--------------------------------------------------------请输入雇员的姓名:quan
--------------------------------------------------------请输入兼职技术人员 xiu
本月的工作时数:21
--------------------------------------------------------请输入销售经理 chun 所
管辖部门本月的销售总额:12000000
--------------------------------------------------------请输入推销员 quan 本月
的销售额:23100
li编号1000级别为7级,本月工资8000
xiu编号1001级别为5级,本月工资2100
chun编号1002级别为5级,本月工资65000
quan编号1003级别为1级,本月工资924
Press any key to continue
【选择功能3】:
******************************************************************************
------------------------------功能选项[主菜单]--------------------------------
******************************************************************************
[1]**************-------------各成员只输入一遍-----------------***************
[2]**************-------------重复功能并运用两遍---------------***************
[3]**************-------------重复功能并运用三遍---------------***************
******************************请输入功能选项**********************************
3
-------------------------------------------------------请输入雇员的姓名:pan
-------------------------------------------------------请输入雇员的姓名:feng
-------------------------------------------------------请输入雇员的姓名:jing
-------------------------------------------------------请输入雇员的姓名:qi
-------------------------------------------------------请输入兼职技术人员feng本
月的工作时数:24
请输入销售经理jing所管辖部门本月的销售总额:42967574
------------------------------------------------------请输入推销员 qi 本月的销
售额:45673
pan编号1000级别为4级,本月工资8000
feng编号1001级别为3级,本月工资2400
jing编号1002级别为3级,本月工资219838
qi编号1003级别为1级,本月工资1826.92
-------------------------------------------------------请输入雇员的姓名:ji
-------------------------------------------------------请输入雇员的姓名:ta
-------------------------------------------------------请输入雇员的姓名:fa
-------------------------------------------------------请输入雇员的姓名:la
-------------------------------------------------------请输入兼职技术人员ta本月
的工作时数:9
请输入销售经理fa所管辖部门本月的销售总额:39074378
------------------------------------------------------请输入推销员 la 本月的销
售额:846810
ji编号1000级别为7级,本月工资8000
ta编号1001级别为5级,本月工资900
fa编号1002级别为5级,本月工资200372
la编号1003级别为1级,本月工资33872.4
-------------------------------------------------------请输入雇员的姓名:ge
-------------------------------------------------------请输入雇员的姓名:ji
-------------------------------------------------------请输入雇员的姓名:ku
-------------------------------------------------------请输入雇员的姓名:nu
-------------------------------------------------------请输入兼职技术人员ji本月
的工作时数:43
请输入销售经理ku所管辖部门本月的销售总额:27808543
------------------------------------------------------请输入推销员 nu 本月的销
售额:34795
ge编号1000级别为10级,本月工资8000
ji编号1001级别为7级,本月工资4300
ku编号1002级别为7级,本月工资144043
nu编号1003级别为1级,本月工资1391.8
Press any key to continue
输入每个成员所需要的信息,经理需要固定工资;销售经理需要固定每月工资和所管辖部门本月的销售额在提取百分比就是本月实拿的工资;技术人员需要本月的工作时数,就可以计算出本月工资;销售人员就是本月销售额在提成。测试结果如下:
六、参考书目
[1] 刘振安.等编著.C++程序设计课程设计. 机械工业出版社。
[2] 吴乃陵.等编著.C++程序设计.北京:高等教育出版社。
[3] 李龙澍.C++程序设计实训教程.北京:清华大学出版社 。
[4] 宁正元.《数据结构(C语言)》南京:东南大学出版社,20##年6月。
[5] 严蔚敏等 《数据结构(C语言版)》 北京:清华大学出版社,1997年。
[6] 胡学钢等《数据结构算法设计指导》 北京:清华大学出版社,1999年 。
[7] 明日科技编著《Visual C++程序开发范例宝典》北京:人民邮电出版社。
七、附录
源程序
#include<iostream>
#include<cstring>
using namespace std;
class employee//---------------------------------------------------基类
{
protected:
char name[20]; //姓名
int num; //个人编号
int grade; //级别
float salary;//月薪总额
static int No; //静态数据:目前编号
public:
employee(); //构造函数
~employee(); //析构函数
virtual void pay()=0; //计算月薪函数(纯虚函数)
virtual void promote(int jishu=0); //升级函数(虚函数)
void SetName(char *); //设置姓名函数
char * GetName(); //提取姓名函数
int GetNum(); //提取编号函数
int Getgrade();//提取级别函数
float Getsalary();//提取月薪函数
};
int employee::No=1000; //员工编号基数为1000
employee::employee() //输入的员工编号为编号加1
{ num=No++;
grade=1; //级别初值为1
salary=0.0;//月薪总额初值为0
}
employee::~employee(){}
void employee::promote(int jishu)
{ grade+=jishu;} //升级,提升的级数由jishu指定
void employee::SetName(char * names)//指针
{ strcpy(name,names);} //设置姓名
char* employee::GetName()
{ return name;} //提取成员姓名
int employee::GetNum()
{ return num;} //提取成员编号
int employee::Getgrade()
{ return grade;} //提取成员级别
float employee::Getsalary()
{ return salary;} //提取月薪
class technician:public employee //----------------------------------技术人员类
{
private:
float hourlyRate; //每小时酬金
int workHours;//当月工作时数
public:
technician(); //构造函数
void SetworkHours(int wh); //设置工作时数函数
void pay(); //计算月薪函数
void promote(int); //升级函数
};
technician::technician()
{ hourlyRate=100;} //每小时酬金100元
void technician::SetworkHours(int wh)
{ workHours=wh;} //设置工作时间
void technician::pay()
{ salary=hourlyRate*workHours;} //计算月薪,按小时计酬
void technician::promote(int)
{ employee::promote(2);} //调用基类升级函数,升2级
class salesman:virtual public employee //----------------------------销售人员类
{
protected:
float CommRate; //按销售额提取酬金的百分比
float sales; //当月销售额
public:
salesman(); //构造函数
void Setsales(float sl); //设置销售额函数
void pay(); //计算月薪函数
void promote(int); //升级函数
};
salesman::salesman()
{ CommRate=0.04;} //销售提成比例4%
void salesman::Setsales(float sl)
{ sales=sl;} //设置销售额
void salesman::pay()
{ salary=sales*CommRate;} //月薪=销售提成
void salesman::promote(int)
{ employee::promote(0);} //调用基类升级函数,升0级
class manager:virtual public employee //------------------------------经理类
{
protected:
float monthlyPay; //固定月薪数
public:
manager(); //构造函数
void pay(); //计算月薪函数
void promote(int); //升级函数
};
manager::manager()
{ monthlyPay=8000;} //固定月薪8000元
void manager::pay()
{ salary=monthlyPay;} //月薪总额即固定月薪数
void manager::promote(int)
{ employee ::promote(3);} //调用基类升级函数,升3级
class salesmanager:public manager,public salesman //----------------------------销售经理类
{
public:
salesmanager(); //构造函数
void pay(); //计算月薪函数
void promote(int); //升级函数
};
salesmanager::salesmanager()
{ monthlyPay=5000;
CommRate=0.005;}
void salesmanager::pay()
{ salary=monthlyPay+CommRate*sales;} //月薪=固定月薪+销售提成
void salesmanager::promote(int)
{ employee::promote(2);} //调用基类升级函数,升2级
void main()//-----------------------------------------------------主函数
{ int n;
manager ml;//声明经理对象
technician tl;//声明技术人员对象
salesmanager sml;//声明销售经理对象
salesman sl;//声明销售人员对象
char namestr[20]; //雇员姓名临时存放在namestr中
employee*emp[4]={&ml,&tl,&sml,&sl};//数组指针
cout<<"******************************************************************************"<<endl;
cout<<"------------------------------功能选项[主菜单]--------------------------------"<<endl;
cout<<"******************************************************************************"<<endl;
cout<<" "<<endl;
cout<<"[1]**************-------------各成员只输入一遍-----------------***************"<<endl;
cout<<" "<<endl;
cout<<"[2]**************-------------重复功能并运用两遍---------------***************"<<endl;
cout<<" "<<endl;
cout<<"[3]**************-------------重复功能并运用三遍---------------***************"<<endl;
cout<<" "<<endl;
cout<<"******************************请输入功能选项**********************************"<<endl;
cin>>n;
switch(n)
{
case 1:{
cout<<"******************************只输入一份信息**********************************"<<endl;
int i;
for(i=0;i<4;i++)
{
cout<<"---------------------------------------------------------请输入雇员的姓名:";
cin>>namestr;
emp[i]->SetName(namestr); //设置每个成员的姓名
emp[i]->promote(); //升级,通过基类指针访问各派生类函数
}
cout<<"---------------------------------------------------------请输入兼职技术人员 "<<tl.GetName()<<" 本月的工作时数:";
int ww;
cin>>ww;
tl.SetworkHours(ww); //设置工作时间
cout<<"---------------------------------------------------------请输入销售经理 "<<sml.GetName()<<" 所管辖部门本月的销售总额:";
float s1;
cin>>s1;
sml.Setsales(s1);
cout<<"---------------------------------------------------------请输入推销员 "<<sl.GetName()<<" 本月的销售额:";
cin>>s1;
sl.Setsales(s1);
for(i=0;i<4;i++)
{
emp[i]->pay(); //计算月薪,通过基类指针访问各派生类函数
cout<<emp[i]->GetName()<<"职工号"<<emp[i]->GetNum()<<"级别为"
<<emp[i]->Getgrade()<<"级,本月工资"<<emp[i]->Getsalary()
<<endl;
}
break;}
case 2:{
int m;
for(m=0;m<2;m++)
{
int i;
for(i=0;i<4;i++)
{
cout<<"--------------------------------------------------------请输入雇员的姓名:";
cin>>namestr;
emp[i]->SetName(namestr); //设置每个成员的姓名
emp[i]->promote(); //升级,通过基类指针访问各派生类函数
}
cout<<"--------------------------------------------------------请输入兼职技术人员 "<<tl.GetName()<<" 本月的工作时数:";
int ww;
cin>>ww;
tl.SetworkHours(ww); //设置工作时间
cout<<"--------------------------------------------------------请输入销售经理 "<<sml.GetName()<<" 所管辖部门本月的销售总额:";
float s1;
cin>>s1;
sml.Setsales(s1);
cout<<"--------------------------------------------------------请输入推销员 "<<sl.GetName()<<" 本月的销售额:";
cin>>s1;
sl.Setsales(s1);
for(i=0;i<4;i++)
{
emp[i]->pay(); //计算月薪,通过基类指针访问各派生类函数
cout<<emp[i]->GetName()<<"编号"<<emp[i]->GetNum()<<"级别为"
<<emp[i]->Getgrade()<<"级,本月工资"<<emp[i]->Getsalary()
<<endl;
}
}
break;
}
case 3:{
int u;
for(u=0;u<3;u++){
int i;
for(i=0;i<4;i++)
{
cout<<"-------------------------------------------------------请输入雇员的姓名:";
cin>>namestr;
emp[i]->SetName(namestr); //设置每个成员的姓名
emp[i]->promote(); //升级,通过基类指针访问各派生类函数
}
cout<<"-------------------------------------------------------请输入兼职技术人员"<<tl.GetName()<<"本月的工作时数:";
int ww;
cin>>ww;
tl.SetworkHours(ww); //设置工作时间
cout<<"请输入销售经理"<<sml.GetName()<<"所管辖部门本月的销售总额:";
float s1;
cin>>s1;
sml.Setsales(s1);
cout<<"------------------------------------------------------请输入推销员 "<<sl.GetName()<<" 本月的销售额:";
cin>>s1;
sl.Setsales(s1);
for(i=0;i<4;i++)
{
emp[i]->pay(); //计算月薪,通过基类指针访问各派生类函数
cout<<emp[i]->GetName()<<"编号"<<emp[i]->GetNum()<<"级别为"
<<emp[i]->Getgrade()<<"级,本月工资"<<emp[i]->Getsalary()
<<endl;
}
}
break;
}
}
}