课程设计C++之职工工资管理系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1 前言 (1)
2 需求分析 (1)
2.1 任务和要求 (1)
2.2 运行环境 (1)
2.3 开发工具 (1)
3 分析和设计 (2)
3.1 系统分析及设计思路 (2)
3.2 主要类图 (2)
3.3 函数流程图 (3)
4 具体代码实现 (4)
5 课程设计总结 (10)
5.1 程序运行结果或预期运行结果 (10)
5.2 设计结论 (12)
参考文献 (13)
致谢 (14)
1 前言
某公司内有5种不同类型的职工:技术人员(technician)、销售人员(salesman)、文秘(secretary)、技术经理(tech-manager)、销售经理(sales-manager)。
他们的工资计算方式各不相同:
1) 技术人员的工资根据他当月工作的小时数来定,时薪为35元;
2) 销售人员的工资则是根据本人当月销售额来确定,工资为销售额的5%;
3) 文秘有4000元的基本工资,奖金视当月工作情况而定;
4) 技术经理和销售经理都有6000元的固定工资,技术经理的工作业绩可分为3个等级,每级可以获得1000元奖金,
5) 销售经理除有6000元的固定工资外,销售经理的奖金由他所管理的销售员的销售业绩而定,为总销售额的0.2%。
为此设计一个工资管理系统管理职工的信息。
2 需求分析
2.1 任务和要求
使用C++面向对象程序设计一个简易的工资管理系统。
,系统的主要功能是:根据不同的职工,计算职工当月工资。
确定程序至少应该具备如下功能:.输入职工,添加职工,删除职工,结算工资,等基本模块。
1) 输入职工: 用class person *creat(void) 函数创建链表。
2) 添加职工: 用class person *insert(class person *head,class person *pe) 函数添加。
3) 删除职工:用class person *del(class person *head,double num) 函数删除。
4) 结算工资:用void selary(class person *head) 函数计算。
2.2 运行环境
(1)WINDOWS2000/XP系统
(2)Visual C++ 6.0编译环境或DEV C++ 5.0编译环境
2.3 开发工具
C++语言
3 分析和设计
3.1 系统分析及设计思路
首先公司有五类人,各类之间又有相同的部分例如:姓名、职工号等,所以定义一个基类Person,四类人相同部分为基类数据成员。
由基类Person再派生出各类:技工类Technician类、售货员类Salesman、文秘类Secretary、技术经理类Tech-manager、销售经理类Sales-manager。
(1) Person类:包含: num,wage,year, name[10],post[10],sex等数据成员等。
要完成结算工资操作,需要设计virtual void pay()作为成员函数。
(2) Technician类:继承Person类,增加hours数据。
(3) Salesman类:继承Person类,增加sales数据。
(4) Secretary类:继承Person类,增加bonus数据。
(5) Tech-manager类:继承Person类,增加bonus数据
(6) Sales-manager类:继承Person类,增加sumsales数据。
然后分析系统管理需要有几个功能,分别是输入职工,添加职工,删除职工以及结算工资。
我们为这几个功能分别建立对应的函数来实现:class person *creat(void) 、 class person *insert(class person *head,class person *pe) 、class person *del(class person *head,double num) 、void selary(class person *head) 。
并且还有输出函数print()以及保存信息函数save()
最后主函数的实现。
由于是有选择的菜单,首先想到了switch选择语句。
当输入不同值时,进入不同的case部分以实现不同的功能。
case1的功能是实现数据的输入。
用creat()函数创建职工信息,按照提示分别输入职工的信息:编号、姓名、性别、出生年份,并用save()函数保存信息。
case2的功能是实现数据的添加。
用malloc动态分配内存空间,然后输入要添加的职工信息。
用insert()函数添加进去。
用print()函数输出并保存。
case3的功能是实现数据的删除。
根据提示输入你要删除的职工编号。
按照你输入的编号,用del()函数输出该职工的所有信息。
case4的功能是计算职工的工资。
根据不同的职工类别计算工资。
3.2 主要类图
图3.1 主要类图
3.3 函数流程图
(1)主函数流程
图3.2 主函数流程图
4 具体代码实现
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(class person)
class person
{public:
virtual void pay(){}
double num,wage,year;char name[10],post[10],sex;class person *next; }; int n;
class Technician:public person
{public:
void pay(){cout<<"工时:";cin>>hours;wage=35*hours;cout<<"工资:"<<wage<<endl;}
protected: double hours;
};
class Salesman:public person
{public:
void pay(){cout<<"销售额:";cin>>sales;
wage=0.05*sales;cout<<"工资:"<<wage<<endl;}
double sales; };
class Secretary:public person
{public:
Void pay(){cout<<"奖金:";cin>>bonus;wage=4000+bonus;cout<<"工资:"<<wage<<endl;}
protected: double bonus;
};
class Techmanager:public person
{public:
void pay(){cout<<"奖金:";cin>>bonus;wage=6000+bonus;cout<<"工资:"<<wage<<endl;}
protected: double bonus;
};
class Salesmanager:public person
{public:
void pay(){cout<<"总销售额:"<<sumsales<<endl;wage=6000+sumsales*0.002;
cout<<"工资:"<<wage<<endl;}
double sumsales;
};
class person *creat(void) // 创建链表,输入职工
{
class person *head,*p1,*p2;
n=0;
p1=p2=(class person *)malloc(LEN);
cin>>p1->post>>p1->num>>p1->name>>p1->sex>>p1->year;
head=NULL;
while(p1->num!=0)
{n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;p1=(class person *)malloc(LEN);
cin>>p1->post>>p1->num>>p1->name>>p1->sex>>p1->year;}
p2->next=NULL;
return(head);
}
void print(class person *head) // 输出职工
{class person *p;
cout<<n<<"个职工信息:"<<endl;cout<<"职务 "<<"编号 "<<"姓名 "<<"性别 "<<"出生年份 "<<endl;
p=head;
if(head!=NULL)
do{
cout<<p->post<<" "<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->year<<endl;
p=p->next;
}while(p!=NULL);
}
class person *del(class person *head,double num) // 删除职工
{class person *p1,*p2;
if(head==NULL){cout<<"list null!"<<endl;goto end;}
p1=head;
while(num!=p1->num&&p1->next!=NULL)
{p2=p1;p1=p1->next;}
if(num==p1->num)
{if(p1==head)head=p1->next;
else p2->next=p1->next;
cout<<"delete:"<<num<<endl; n=n-1;}
else cout<< num<<" not been found!"<<endl;
end: return(head);
}
class person *insert(class person *head,class person *pe) //添加职工{class person *p0,*p1,*p2;
p1=head;p0=pe;
if(head==NULL)
{head=p0;p0->next=NULL;}
else{while((p0->num>p1->num)&&(p1->next!=NULL))
{p2=p1;p1=p1->next;}
if(p0->num<=p1->num)
{if(head==p1)head=p0;
else p2->next=p0; p0->next=p1;}
else{p1->next=p0; p0->next=NULL;}
} n=n+1;
return(head);
}
void save(class person *head) // 保存文件
{class person *p;
ofstream outfile("职工.txt",ios::out);
if(!outfile){cerr<<"open error!"<<endl;exit(1);}
p=head;
if(head!=NULL)
do{
outfile<<p->post<<" "<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->year<<endl;
p=p->next;
}while(p!=NULL);outfile.close();
}
void selary(class person *head) // 计算工资
{class person *p;
Technician te;Salesman sa;Secretary se; Techmanager tm; Salesmanager
sm;sm.sumsales=0;
ifstream infile("职工.txt",ios::in);
if(!infile){cerr<<"open error!"<<endl;exit(1);}
p=head;
if(head!=NULL)
do{
infile>>p->post>>p->num>>p->name>>p->sex>>p->year;
cout<<p->post<<" "<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->year<<" "<<endl;
if(p->num<200){te.pay();}
if(p->num<300 &&
p->num>200){sa.pay();sm.sumsales=sa.sales+sm.sumsales;}
if(p->num<400 && p->num>300){se.pay();}
if(p->num<500 && p->num>400){tm.pay();}
if(p->num<600 && p->num>500){sm.pay();}
p=p->next;
}while(p!=NULL);infile.close();
}
int main()
{ class person *head,*pe; double delnum;
int menu;
while(1)
{ cout<<"*****************************************************"<<endl
;
cout<<"*====================菜单选顶=======================*"<<endl; cout<<"*===================================================*"<<endl; cout<<"* 1.输入职工 2.添加职工 3.删除职工 4.结算工资 *"<<endl; cout<<"*****************************************************"<<endl; cout<<"编号:技工(101-199)售货员(201-299)文秘(301-399)"
<<endl<<" 技术经理(401-499)销售经理(501-599)"<<endl;
cout<<endl<<"请选择菜单项:";
cin>>menu;
switch(menu)
{case 1:
cout<<endl<<"输入职工:"<<endl;
cout<<"职务 "<<"编号 "<<"姓名 "<<"性别 "<<"出生年份 "<<endl;
head=creat();print(head);save(head);
break;
case 2:
cout<<endl<<"添加职工:"<<endl;
cout<<"职务 "<<"编号 "<<"姓名 "<<"性别 "<<"出生年份 "<<endl;
pe=(class person *)malloc(LEN);
cin>>pe->post>>pe->num>>pe->name>>pe->sex>>pe->year;
while(pe->num!=0)
{head=insert(head,pe);
print(head);save(head);
pe=(class person *)malloc(LEN);
cin>>pe->post>>pe->num>>pe->name>>pe->sex>>pe->year;}
break;
case 3:
cout<<endl<<"输入删除的编号:";
cin>>delnum;
while(delnum!=0)
{head=del(head,delnum);
print(head);save(head);
cout<<endl<<"输入删除的编号:";
cin>>delnum;}
break;
case 4:selary(head);break;
}
} return 0;
}
5 课程设计总结
5.1 程序运行结果或预期运行结果
图5.1 实验结果图
图5.2 实验结果图图5.3 实验结果图
图5.2 实验结果图
5.2 设计结论
本次设计我们组的题目是职工工资管理系统,因为事先老师的细心指导,我们才得以的完成这次课程设计。
在系统分析和设计的部分仍然花了比较多的时间,特别是源代码的编写和调试,经过反复的改写、调试、再改写、调试,我们最终完成了任务。
经过对职工信息管理系统的分析与编写,我们得到了很大的收获。
自主学习的必要性更是解决问题的基础,我们二个人一组,在设计的过程中,我们相互讨论,相互学习,发挥出各自的优势,发现自己的不足,取长补短,增强了团队意识。
更重要的是这次设计让我们对C++面向对象设计编程有了更深刻的认识和更
全面的掌握,也提升了我们分析问题的能力和思考问题的逻辑能力,更明白实际调研的重要性。
对面向对象编程有了深刻的理解,对软件工程有了了解。
在以后的学习中我们会更加的努力,深刻的钻研,增强团队意识。
通过这次课程设计,我们加深了对类与派生的理解。
类与派生类之间的关系,通过上机实践得到了进一步的深化。
从数据成员的继承到派生类对象对基类成员函数的调用。
整个实习过程让我的C++知识得到了应用,体验了程序员编程时的
喜怒哀乐,知识、心智,得到全方位提升,收获颇丰。
参考文献
[1] 龚晓庆,付丽娜,朱心懿.《C++面向对象程序设计》.北京:清华大学出版社,201
[2] 揣锦华等编.《C++程序设计语言》.西安:西安电子科技大学出版社,2003
[3] 吕凤翥著.《C++语言基础教程》.北京:清华大学出版社,2001
[4]张国峰编著.《C++语言及其程序设计教程》.北京:电子工业出版社,1996.
[6] 郑莉,董渊,张瑞丰.《C++语言课程设计》(第三版).北京:清华大学出版社,2004
[7] 钱能.《C++程序设计实验指导》.北京:清华大学出版社,2005
[8] 罗建军等编.《C++程序设计教程学习指导》.北京
致谢
感谢我们的指导老师柳小文老师,谢谢她在我们的课程设计过程中提出了指导性的方案和架构,并指引我们阅读相关的资料和书籍,使我们在不熟悉的领域中仍能迅速掌握新的方法和技术。
感谢校领导给我们这次难得的锻炼机会,让我们能更好的理解和实践C++面向对象编程,让我们对面向对象编程有了更深刻的认知,对已学知识有了更进一步的巩固。
也谢谢我的搭档任小雨同学,给予我许多帮助。
能够见证互相的成长,共同完成了这个课程设计。
总之,通过这次课程设计,我获益良多。
. .。