资源描述
设计题目 职工工资管理系统设计
xxx技术学院课程设计任务书
课程名称
《面向对象程序设计》课程设计
课程代码
设计题目
职工工资管理系统的设计
题目序号
设计时间
系(院)
班级
一、课程设计任务(条件)、具体技术参数(指标)
本课程设计是《面向对象程序设计》课程的后继教学环节,学好C++语言就必须坚持用面向对象的思维方式分析问题、解决问题,最好的方法是仿照教材编写C++实际应用程序。
根据教材中人事管理应用程序框架,在此基础上按要求完成以下实际应用程序。
职工工资管理系统课程设计题目:
实现一个简单的工资管理系统。系统的主要功能是计算职工当月工资并存档。公司内有5种不同类型的职工:技术人员、销售人员、文秘、技术经理和销售经理,他们的工资计算方式各不相同。
技术人员的工资根据他当月工作的小时数来定,时薪35元;销售人员的工资则是根据本人当月销售额来确定,工资为销售额的5%;文秘有4000元的基本工资,奖金视为当月工作情况而定;技术经理和销售经理都有6000元的固定工资,技术经理的工作业绩可分为3个等级,每级可获得1000元奖金,销售经理的奖金由他所管理的销售员的销售业绩而定,总销售额的2%
职工工资管理系统的设计:
对于整个系统的设计思路是,首先,由员工输入用户信息,包括编号、姓名和职务;然后,在计算某职工的当月工资时,系统先从已输入的职工信息文件中获取职工的工作类型,接着调用不同的处理程序进行计算;最后将结果存档。
从用户需求中,可以发现5种类型的职员都可以分别设计为一个类。首先,他们都属于雇员,因此可以设计一个基类employee(雇员),然后从中派生出technician(技术人员)类,salesman(销售人员)类、secretary(文秘)类。对于技术经理和销售经理来说,他们都属于经理,所以设计时可以从employee类中派生出一个manager(经理)类作为techmanager(技术经理)和salesman(销售经理)类的父类。而经理类本身并不对应实际的员工类型,由于技术经理有技术人员和经理的双重特点,因此techmanager类同时继承technician类和manger类;销售经理有销售人员和经理的双重特点,因此salesmanager类同时继承salesman类和manager类。
根据用户需要employee类应该拥有的属性有:编号、姓名、职务、月份和工资。Employee类的服务可以包括info()、 search()、countSalary()、recordInfo()和recordSalary()。其中,info()函数用于接收用户输入的职工信息;search()函数用来根据职工名查找职工信息;countSalary()函数为工资计算函数,但在基类中为空,原因是各类人员的工资计算方法不同,无法在基类中统一定义,必须在派生类中分别定义。recordInfo()函数和recordSalary()函数分别是职工信息和职工工资的记录函数,分别将信息存入文件info.txt和salary.txt。
具体的基类和派生类的定义如下图:
二、对课程设计成果的要求(包括课程设计说明书、图纸、图表、实物等软硬件要求)
(1) 分析职工工资管理系统程序结构: 画出程序粗略的流程图和各个模块的详细流程图,每个功能模块用文字说明他们的功能(与对应流程图放在一起);
(2) 对你已经实现的功能(修改的、新编写的)做详细的说明, 并附上流程图及程序清单。
(3) 自己对该职工工资管理系统的进一步设想;
(4) 对于有设想但最终未实现的功能的大致编程思路的阐述;
(5) 论述在设计过程中遇到的并且对你具有启发性的问题。
(6) 严禁抄袭,发现雷同,双方扣分。
三、课程设计工作进度计划:
周一、二:教师布置任务,讲解本课设模块。画出主程序粗略的流程图和各个模块的详细流程图。设计程序及调试程序。
周三、四:设计程序及调试程序。同时着手写报告。
周五:完成设计,提交报告,接受教师考评。
四、主要参考资料
(1)《面向对象程序设计》 ,郑莉,清华大学出版社,
(2)《面向对象程序设计C++语言》,朱战立等编 西安电子科技大学出版社
(3)《面向对象程序设计----Visual C++》,刘斌等编, 清华大学出版社
(4)《面向对象程序设计----C++语言描述》, Richard Johnsonbaugh(美)等著,蔡宇辉等译,机械工业出版社, 2003
目录
1 概述: 5
1.1 基本功能 5
1.2 拓展功能 5
2 课题分析 6
2.1 类的设计 6
2.2 类的实现 6
3 详细设计说明 7
3.1 程序主界面 7
3.2 方案 7
3.3 程序描述(输入input) 9
4 课程设计总结 12
5 软件使用说明 12
6 附录(参考文献,原代码:) 13
6.1 参考文献: 13
6.2 原代码 13
1 概述:
1.1 基本功能
实现一个简单的工资管理系统。系统的主要用来计算职工当月工资并存档。
由于公司内有5种不同类型的职工:技术人员、销售人员、文秘、技术经理和销售经理,他们的工资计算方式各不相同。所以,此系统的基本功能是:
首先,由员工输入用户信息(包括编号、姓名和职务;然后,计算某职工的当月工资(系统先从已输入的职工信息文件中获取职工的工作类型;
接着调用不同的处理程序进行计算);
最后,可以选择将结果(所有员工的编号、姓名、职位、工资等信息)存档。
1.2 拓展功能
1.设定好5种职位各不相同的工资计算方式:
技术人员的工资根据他当月工作的小时数来定,时薪35元;
销售人员的工资则是根据本人当月销售额来确定,工资为销售额的5%;
文秘有4000元的基本工资,奖金视为当月工作情况而定;
技术经理和销售经理都有6000元的固定工资,技术经理的工作业绩可分为3个等级,PS:每级可获得1000元奖金(¥1000、¥2000、¥3000);
销售经理的奖金由他所管理的销售员的销售业绩而定,总销售额的2%。
2.添加某个职工信息的查询功能:
只要输入一个已经存在数据库内的雇员名字,即可查到该雇员的编号、姓名、职位和工资的信息。
3.清屏功能:
为了保护雇员个人信息不外露。
4.警报功能:
在查询职员工资信息的时候,会发出警报音“滴——”的一声。
5.退出确定功能
退出程序时,会让用户再次确定是否真的要退出的界面。
2 课题分析
2.1 类的设计
从用户需求中,可以发现5种类型的职员都可以分别设计为一个类。首先,他们都属于雇员,因此可以设计一个基类employee(雇员),然后从中派生出technician(技术人员)类,salesman(销售人员)类、secretary(文秘)类、techmanager(技术经理)类和manager(销售经理)类。
根据用户需要employee类应该拥有的属性有:编号、姓名、职务、月份和工资。Employee类的服务可以包括input(),print(),find(),save()。其中,input()函数用于接收用户输入的职工信息;print()函数用于输出用户输入的职工信息;find()函数用来根据职工名查找职工信息;save()函数为将职工信息写入文本。
由于各类人员的工资计算方法不同,无法在基类中统一定义,必须在派生类中分别定义。
2.2类的实现
class Technician:public Employee //技术员类(公有继承雇员类)
{
public:
Employee类
Techmanager类
Technician类
Manager类
Salesman类
Secretary类
void input()
{
cout<<"技术员的";
Employee::input();
cout<<"工作时间:";
cin>>worktime;
}
void print()
{ pay=worktime*hourpay;
Employee::print();
}
void find()
{
pay=worktime*hourpay;
Employee::find();
}
void save()
{ pay=worktime*hourpay; 其他类,类似形成。
Employee::save();
}
protected:
double worktime; //工作时间(小时)
};
3 详细设计说明
3.1 程序主界面
图表 1主菜单目录
输入用户信息,包括编号、姓名和职务
从已输入的职工信息文件中获取职工的工作类型
调用不同的处理程序进行查询,职员信息
将结果存档
开始
开始
3.2 方案
在明确了整个程序基本的功能目的后,接着,便是思考如何具体实现:
问题1:存入的数据放在哪里?
const int n1=1,n2=1,n3=1,n4=1,n5=1;
/*定义公司各类职工人数(可修改)
(n1:技术员人数;n2:经理人数;n3:销售员人数;n4:销售经理人数 )*/
事先设定好可修改的全局变量。然后确定好全局对象数组。如此便可以按照所需存入员工信息
输入用户信息,包括编号、姓名和职务
从已输入的职工信息文件中获取职工的信息
调用不同的处理程序进行查询,职员信息
将结果存档
开始
开始
问题2:如何程序要求,落实?
派生类
派生类
派生类
派生类
基类
派生类
问题3:怎样处理2个菜单关系?(输入职员信息菜单、目录菜单)
让目录菜单作为主菜单,输入职员信息的菜单成为二级菜单。并运用清屏的功能,及时清除输入的职员信息,作为一种安全保护。
3.3 程序描述(输入input)
* 由主菜单选择进入“1”的数据输入菜单,进行数据输入(进入二级菜单后会自动清屏)。
图表 2子菜单(程序中的menu 3)
* 根据需要选择输入要输入的职员信息。(只需按照中文提示,依次输入英语或数字信息)
图表 3子菜单中选择输入技术经理信息的一个状态
* 一个职员的信息全部输入完成后,会自动清屏,回到“财务部门输入数据系统”主菜单
图表 4 子菜单
* 以此类推,随意输入你要输入的职员信息。若输入全部完成,可以回到主菜单
* 然后,在主菜单中选择数据查询,可以根据你填入的职工姓名,查到他的所有信息
图表 5 由主菜单选择查询一操作时,反馈信息的状态
* 也可选择数据备份,会自动清屏。并让所有已输入过的职工信息,全打印在所在磁盘的一个txt文档里。
图表 6 由主菜单选择数据备份一操作后的状态
* 如果想要退出系统,可以选择主菜单的退出系统,选择过后,会清屏,显示以下界面,警告用户,是否真的要推出。
图表 7 选择主菜单退出系统一操作后的状态
4 课程设计总结
通过此次面向对象程序设计的实践课程学习,本人受益匪浅。
经过一系列的编程,本人更加体会到纸上得来终觉浅,绝知此事要躬行。实践是检验真理的唯一标准。这两句话说的真切。
遇到的难关1.
在编写销售经理的类的时候,由于思维混乱,继承乱用,以致真个程序一片混乱,运行不出,且外加几十个错误警告。经过回顾自己先前写的流程图,本人得到了很大的顿悟。关系捋清楚了,思路也豁然开朗了,下笔如有神。
遇到的难关2.
五种职员在计算工资的时候,先前一直查询不到正确的工资数额。在反复检查、测试的过程中,才发现那些计算公式,继承没有问题,问题出在查询的那个函数忘记将重新计算工资的公式写上。所以一直显示的是employee的工资数,而不是各个职位员工的工资数。
遇到的难关3.
在增加清屏这一功能时,本以为这很简单。可在具体操作时,才发现,这也考验一个人思维逻辑的严谨。曾设想,为了不泄密,将清屏这一函数放在查询函数后。结果没想到,这导致测试时:工资信息一显示,立刻被擦掉,根本来不及看的窘境。
存在的不足1.
本程序设计上还有明显的不妥,就是查询工资信息的时候,要求输入的仅仅为用户姓名。由于还是英语输入,难免有同名同姓的状况出现,容易混乱与出错,还需改进。
存在的不足2.
原本思路是将程序分为两个入口:管理员入口和职员入口。管理员入口:需要输入通行账户和密码。进入后,有两个功能——输入所有职工信息(编号、姓名、岗位、月份、业绩奖励等等基本信息)和数据备份。职员入口:则面向所有员工。进入后,只有一个功能——根据自己的名字和编号查询自己的工资等信息。
可是由于实际精力有限,时间的不足。只能不分入口,直接将所有功能放在一个界面内——主菜单内。这样不能很好的起到原先设想的保护功能。实乃缺失。
总之,这不到一周的实践课,让本人的对于知识的应用能力有了显著的提升。本人也明白了,想要真正会编程,就要课后下功夫,多“实战”。这样的进步才更大。
5 软件使用说明
1.主菜单中,先输入1,按回车。进入输入数据职员的菜单界面。
2.按文字提示信息,依次输入5种职员的各个信息。
EG:编号 姓名 职位
101 zhao techmanager
202 qian technician
303 sun salesman
404 li manager
505 zhou secretary
3.输入完毕后,输入0,按回车。再次回到主菜单。
4.输入2,按回车。可以输入你想查看的职工姓名,按回车,查看其信息。
5.输入3,按回车。可以将所有职工的信息,做成文本。
6.输入0,按回车。可以通过输入y或n选择,是否退出程序。
友情提示:1.由于语言局限,输入的信息仅限26个字母和阿拉伯数字。
2.自动清屏是出于对雇员信息的保护和界面整洁。并非出错,请勿恐慌。
3.备份资料时,电脑发出的“滴”的警报声,只是提示用户,备份已完成。
6 附录(参考文献,原代码:)
6.1 参考文献:
(1)《面向对象程序设计》 ,郑莉,清华大学出版社,
(2)《面向对象程序设计C++语言》,朱战立等编 西安电子科技大学出版社
(3)《面向对象程序设计----Visual C++》,刘斌等编, 清华大学出版社
(4)《面向对象程序设计----C++语言描述》, Richard Johnsonbaugh(美)等著,蔡宇辉等译,机械工业出版社, 2003
6.2原代码
#include<fstream>
#include<iostream>
#include<string>
#include<iomanip>
#include<stdlib.h>
using namespace std;
//常变量(供修改用):
const int n1=1,n2=1,n3=1,n4=1,n5=1; /*定义公司各类职工人数(可修改)
(n1:技术员人数;n2:经理人数;n3:销售员人数;n4:销售经理人数 )*/
const double m_salary=6000; //经理固定月工资
const double hourpay=35; //技术员小时工资
const double basicpay=6000; //销售经理的底薪
const double secretarypay = 4000;//文秘的底薪
const double s_proportion=5.0/100; //销售员的工资提成比例
const double sm_proportion=2.0/100; //销售经理的提成比例
double sold_amount;
//声明部分:
void menu(); //主菜单(1/2/3/0)
void menu3(); //数据打印二级菜单(1/2/3/4/5/0)
void data_input(); //数据输入函数
double sm_salary(); //销售经理工资计算
void data_find(); //数据查询
void data_save(); //数据备份(做到txt中)
void clear();
ofstream outfile; //打开磁盘文件流对象
string f_name; //全局变量(查询用)
//定义类:
class Employee //雇员类(基类)
{
public:
void input() //数据输入函数
{
cout<<"编号:";
cin>>num;
cout<<"其姓名:";
cin>>name;
cout<<"职位:";
cin>>status;
cout<<"月份:";
cin>>month;
}
void print() //打印数据函数
{
cout<<" 编号\t姓名\t职位\t\t月份\t工资 "<<endl;
cout<<num<<"\t"<<name<<"\t"<<status<<"\t"<<month<<"\t"<<pay<<endl;
}
void find() //查询函数
{
if(f_name==name )
{
print();
cout<<endl;
}
}
void save() //备份数据函数
{
outfile<<num<<"\t"<<name<<"\t"<<status<<"\t"<<month<<"\t"<<pay<<endl;
}
protected:
int num; //职工号
string name; //职工姓名
string status; //职工职位
int month; //工资月份
double pay; //职工工资
};
class Technician:public Employee //技术员类(公有继承)
{
public:
void input()
{
cout<<"技术员的";
Employee::input();
cout<<"工作时间:";
cin>>worktime;
}
void print()
{ pay=worktime*hourpay;
Employee::print();
}
void find()
{
pay=worktime*hourpay;
Employee::find();
}
void save()
{ pay=worktime*hourpay;
Employee::save();
}
protected:
double worktime; //工作时间(小时)
};
class Manager:public Employee //技术经理类
{
public:
void input()
{
cout<<"技术经理的";
Employee::input();
cout<<"业绩奖励(输入金额数:1000、2000或3000):";
cin>>m_expay;
}
void print()
{ pay=m_salary+m_expay;
Employee::print();
}
void find()
{ pay=m_salary+m_expay;
Employee::find();
}
void save()
{ pay=m_salary+m_expay;
Employee::save();
}
protected:
int m_expay;
};
class Sell_Manager:public Employee //销售经理类
{
public:
void input()
{ cout<<"销售经理的";
Employee::input();
}
int sm_number() //调用销售经理职工号
{
return num;
}
string sm_name() //调用销售经理姓名
{
return name;
}
void print()
{ pay=basicpay+sold_amount*sm_proportion;
cout<<" 编号\t姓名\t职位\t\t月份\t工资"<<endl;
cout<<num<<"\t"<<name<<"\t"<<status<<"\t\t"<<month;
}
void save()
{
pay=basicpay+sold_amount*sm_proportion;
outfile<<num<<"\t"<<name<<"\t"<<status<<"\t\t"<<month;
}
void find()
{
if(f_name==name )
{
print();
cout<<endl;
}
}
};
class Seller:public Employee //销售员类
{
public:
Seller(){ sold_amount=0; } //构造函数,销售额初始化为0
void input()
{
cout<<"销售员的";
Employee::input();
cout<<"销售额:";
cin>>sold_amount;
cout<<"所属销售经理的编号:";
cin>>nu;
}
void print()
{ pay=sold_amount*s_proportion;
cout<<num<<"\t"<<name<<"\t"<<status<<"\t"<<month
<<"\t"<<pay<<"\t"<<nu<<endl;
}
int s_number() //调用销售员所属销售经理职工号
{
return nu;
}
double amount() //调用销售员销售额
{
return sold_amount;
}
void find()
{ if(f_name==name)
{
cout<<" 编号\t姓名\t职位\t\t月份\t工资\t所属部门经理编号 "<<endl;
print();
}
}
void save()
{ pay=sold_amount*s_proportion;
outfile<<num<<"\t"<<name<<"\t"<<status<<"\t"<<month
<<"\t"<<pay<<"\t\t"<<nu<<endl;
}
protected:
double sold_amount; //销售额
int nu; //所属销售经理职工号
};
class Secretary:public Employee //文秘类
{
public:
void input()
{
cout<<"文秘的";
Employee::input();
cout<<"附加奖励(输入本月奖金数额):";
cin>>sy_expay;
}
void print()
{ pay=secretarypay+sy_expay;
Employee::print();
}
void find()
{
pay=secretarypay+sy_expay;
Employee::find();
}
void save()
{ pay=secretarypay+sy_expay;
Employee::save();
}
protected:
int sy_expay;
};
//定义全局对象数组
Technician t[n1]; //技术员
Manager m[n2]; //经理
Seller s[n3]; //销售员
Sell_Manager sm[n4]; //销售经理(下属若干销售员)
Secretary sy[n5]; //文秘
//主函数部分:
int main()
{
char n;
menu();
for(int i=0;i<1000;i++) //设定循环次数(便于各项操作的切换及方便查询)
{cin>>n;
switch(n)
{
case'1': //数据输入
clear();
cout<<endl<<"您所选操作为数据输入,请继续--"<<endl<<endl;
data_input();
cout<<endl;
menu();
break;
case'2': //数据查询
clear();
cout<<endl<<"您所选操作为数据查询,请继续--"<<endl<<endl;
cout<<"请输入您要查询的职工姓名: ";
cin>>f_name;
cout<<endl<<"--正在查询,请等待--"<<endl<<endl;
cout<<"您查询的信息如下:"<<endl<<endl;
data_find();
cout<<endl<<endl;
menu();
break;
case'3': //数据备份
clear();
outfile.open("C++程序设计实习.txt",ios::out); //打开磁盘文件流对象
cout<<endl<<"您所选操作为数据备份,请继续--"<<endl<<endl;
outfile<<"职工基本情况一览表如下:"<<'\n'<<endl;
data_save();
outfile.close();
cout<<endl<<endl;
cout<<'\a'<<"--数据备份完成,请继续--"<<endl<<endl;
menu();
break;
case'0': //退出系统
clear();
cout<<endl<<"是否真的要退出系统?"<<endl<<endl;
cout<<" 是( y )"<<" "<<"否( n ) ";
cin>>n;
if(n=='y')
{ cout<<'\n'<<"--请按任意键退出系统--"<<endl; exit(0); cout<<endl;}
else menu();
break;
default:
cout<<endl<<"--出错!请重新选择操作! "<<'\n'<<endl;
menu();
break;
}
}
return 0;
}
//自定义函数部分:
void menu() //菜单函数
{
cout<<" ★ 小型公司工资管理系统 ★ "<<endl;
cout<<" ┌───────────────┐"<<endl;
cout<<" │ 数据输入:1,并按回车键; │"<<endl;
cout<<" └───────────────┘"<<endl;
cout<<" │ 数据查询:2,并按回车键; │"<<endl;
cout<<" └───────────────┘"<<endl;
cout<<" │ 数据备份:3,并按回车键; │"<<endl;
cout<<" └───────────────┘"<<endl;
cout<<" │| 退出系统:0,并按回车键;| │"<<endl;
cout<<" └───────────────┘"<<endl;
cout<<" 请输入操作序号:";
}
void menu2() //数据输入二级菜单函数
{
cout<<" ★★财务部门输入数据系统★★ "<<endl;
cout<<"┌──────────────────┐"<<endl;
cout<<"│ 技术经理数据输入:1,并按回车键; │"<<endl;
cout<<"│ 技术员数据输入 :2,并按回车键; │"<<endl;
cout<<"│ 销售员数据输入 :3,并按回车键; │"<<endl;
cout<<"│ 销售经理数据输入:4,并按回车键; │"<<endl;
cout<<"│ 文秘数据输入 :5,并按回车键; │"<<endl;
cout<<"│ 返回上一级 :0,并按回车键; │"<<endl;
cout<<"└──────────────────┘"<<endl;
cout<<" 请输入操作序号:";
}
void data_input() //数据输入函数
{
char p;
int i;
menu2();
for(int j=0;j<100;j++)
{
cin >> p;
if(p=='0'){clear(); break;}
else
{
switch(p)
{
case'1':
clear();
for(i=0;i<n2;i++)
m[i].input(); //经理
cout<<endl<<"-------------------------------------------------------"<<endl;clear();menu2();break;
case'2':
clear();
for(i=0;i<n1;i++)
t[i].input(); //技术人员
cout<<endl<<"-------------------------------------------------------"<<endl;clear();menu2();break;
case'3':
clear();
for(i=0;i<n3;i++)
s[i].input(); //销售员
cout<<endl<<"--------------------------------------------------------"<<endl;clear();menu2();break;
case'4':
clear();
for(i=0;i<n4;i++)
sm[i].input(); // 销售经理
cout<<endl<<"---------------------------------------------------------"<<endl;clear();menu2();break;
case'5':
clear();
for(i=0;i<n5;i++)
sy[i].input(); // 文秘
cout<<endl<<"---------------------------------------------------------"<<endl;clear();menu2();break;
}
}
}
}
double salary[n4];
double sm_salary() //销售经理工资计算
{
int i,j;double a ;Sell_Manager b;
for(int k=0;k<n4;k++)
salary[k]=0;
for(i=0;i<n4;i++)
{ double sum=0;
for(j=0;j<n3;j++)
if(s[j].s_number()==sm[i].sm_number())
{ sum=sum+s[j].amount();
salary[i]=sum*sm_proportio
展开阅读全文