面向对象实验设计.docx
- 文档编号:8523540
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:25
- 大小:155.09KB
面向对象实验设计.docx
《面向对象实验设计.docx》由会员分享,可在线阅读,更多相关《面向对象实验设计.docx(25页珍藏版)》请在冰豆网上搜索。
面向对象实验设计
面向对象实验设计
报告
班级:
学号:
姓名:
专业:
指导老师:
2009/12/12
目录
第1章设计要求2
1.1本报告的实验课题2
第2章程序设计过程4
2.3程序设计目的4
2.3程序设计目标4
2.3程序实现思路5
2.1.1类的结构及其简单叙述5
2.1.2系统功能模块图6
2.4系统流程截图7
2.5类的层次框图9
2.6完整程序代码10
实验心得体会21
参考文献22
面向对象实验设计报告书
设计要求
实验课题
班级学生姓名学号专业
发题日期:
2009年12月07日完成日期:
2009年12月11日
题目公司人员管理系统
题目类型:
课程设计技术专题研究理论研究软件系统开发
一、设计任务及要求
1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统中至少要定义四个类,每个类中要有各自的属性和方法;
(4)在系统的设计中,至少要用到面向对象的一种机制。
3、创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能及设计出比友好的界面等。
4、写出设计说明书
二、设计方法和基本原理
1、问题描述(功能要求):
某小型公司,主要有四类人员:
经理、兼职技术人员、销售经理和兼职推销员。
现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。
要求:
1)其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。
2)程序对所有人员有提升级别的功能
3)月薪的计算方法是:
经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成,销售经理既拿固定月薪也领取销售提成。
4)能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息
2、问题的解决方案:
根据系统功能要求,可以将问题解决分为以下步骤:
(1)分析系统中的各个实体之间的关系及其属性和行为;
(2)根据问题描述,设计系统的类层次;
(3)完成类层次中各个类的描述(包括属性和方法);
(4)完成类中各个成员函数的定义;
(5)完成系统的应用模块;
(6)功能调试;
1)
程序设计过程
程序设计目的
通过设计一个较为简单的《公司人员管理系统》,进一步熟悉C++中类的概念、类的封装、继承的实现方式。
了解系统开发的需求分析、类层次设计、模块分析、编码测试、模块组装与整体调试的全过程,加深对C++的理解与VisualC++环境的使用;逐步熟悉程序设计的方法,并养成良好的编程习惯。
程序设计目标
题目:
公司人员管理系统
公司主要有四类人员:
经理、销售经理、兼职技术员、兼职推销员。
某小型公司,主要有四类人员:
经理、兼职技术人员、销售经理和兼职推销员。
现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。
要求:
1)其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。
2)程序对所有人员有提升级别的功能
3)月薪的计算方法是:
经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成,销售经理既拿固定月薪也领取销售提成。
4)能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息
程序实现思路
类结构
建立一个抽象类person再进行派生。
数据成员是protect;成员函数是public。
People派生出四个类:
{
manager、salesmanager、technician、sales
}
此外要定义一个抽象类company,所有的人员的添加和删除都是在这个类的成员函数中实现的。
此外包括数据的输入统计也都是基于这个类的成员函数实现的。
Company的成员函数包括:
Add();增加人员
Delete();删除人员
Modify();修改人员
Query();查询人员
Set();基础数据设置
Save();数据存盘(包括基础数据,人员数据)
Load();数据装入(包括基础数据,人员数据)
person派生的每一个类都定义了〝重载〞输入输出input、output函数
△屏幕显示的数据通过调用无参的输入输出函数
△保存文件save()调用的是有参的输入输出函数
系统功能模块
1.查询功能的实现:
调用workerGetAmount()SetAmount进行输出编号和姓名。
再通P1是否为空来判断是否查找到。
2.Worker的信息:
遍历链表,如果符合条件可以通过P1是否为空来判断是否查找到,也可以通过返回值是1和0来判断。
3.删除:
同样删除中的关键也是通过调用p1来判断要删除的人,然后删除对象。
调用save()自动保存。
4.排序:
通过选择排序法。
两个while循环,内循环找最小的编号,找到后存到一个空链表,再进行外循环到第二小的编号,直到外循环进行到空。
返回新链表的地址。
(每当链表的数据发生变化的时候就调用排序函数)
5.统计:
遍历链表找出符合条件的进行输出
6.修改:
调用p1找到节点进行重新赋值。
调用save()自动保存。
7.添加:
先插入到最后,再进行排序。
8.构造函数:
读文件的实现:
在读文件的时候利用构造函数读取文件里的所有内容,并且一一付给对象。
再利用选择排序的方法将链表进行从小到大的顺序进行排序。
9.析构函数:
遍历链表,释放内存空间。
系统流程截图
输入基本的数据
修改信息
查询信息
删除信息
保存信息
读取信息
系统层次框图
Company抽象类
Person抽象类
Technician
Sales
Salesmanager
Manager
完整程序代码
/*本程序有关的两个数据文件:
base.txt-基础数据文件(必须存在,且按规定格式保存)
person.txt-人员信息文件(可选)
*/
#include
#include
#include
#include
//全局数据,对象
doubleManagerSalary;//经理固定月薪
doubleSalesManagerSalary;//销售经理固定月薪
doubleSalesManagerPercent;//销售经理提成%
doubleSalesPercent;//销售人员提成%
doubleWagePerHour;//技术人员小时工资
intID;//员工标识(要保证唯一)
classPerson//员工类
{
protected:
intNo;//编号
charName[20];//姓名
intDuty;//岗位
doubleEarning;//收入
Person*next;
public:
Person(charID,char*Name,intDuty)
{
this->Duty=Duty;
strcpy(this->Name,Name);
this->No=ID;
}
virtualvoidCalcSalary()=0;
virtualvoidOutput()=0;
friendclassCompany;
};
classManager:
publicPerson//经理类
{
public:
Manager(charID,char*Name,intDuty):
Person(ID,Name,Duty){}
voidCalcSalary(){Earning=ManagerSalary;}
voidOutput()
{
CalcSalary();
cout< } }; classSalesManager: publicPerson//销售经理类 { private: doubleAmount; public: SalesManager(charID,char*Name,intDuty): Person(ID,Name,Duty){} voidSetAmount(doubles) { Amount=s; } voidCalcSalary() { Earning=SalesManagerSalary+Amount*SalesManagerPercent/100; } voidOutput() { CalcSalary(); cout< } }; classTechnician: publicPerson//技术员类 { private: doublet; public: Technician(charID,char*Name,intDuty,doubleT): Person(ID,Name,Duty) { this->t=T; } doubleGetT() { returnt; } voidSetT(doubleT) { this->t=T; } voidCalcSalary() { Earning=WagePerHour*t; } voidOutput() { CalcSalary(); cout< } }; classSales: publicPerson//销售员类 { private: doubleAmount; public: Sales(charID,char*Name,intDuty,doubleAmount): Person(ID,Name,Duty) { this->Amount=Amount; } doubleGetAmount() { returnAmount; } voidSetAmount(doubleAmount) { this->Amount=Amount; } voidCalcSalary() { Earning=SalesPercent/100*Amount; } voidOutput() { CalcSalary(); cout< } }; classCompany//公司类 { private: Person*Worker;//员工表 voidClear();//清除内存中数据 public: Company() { Worker=0; Load(); } ~Company() { Person*p; p=Worker; while(p) { p=p->next; deleteWorker; Worker=p; } Worker=0; } voidAdd();//增加人员 voidDelete();//删除人员 voidModify();//修改人员 voidQuery();//查询人员 voidSet();//基础数据设置 voidSave();//数据存盘(包括基础数据,人员数据) voidLoad();//数据装入(包括基础数据,人员数据) }; voidCompany: : Clear()//清除内存中人员数据(内部使用) { Person*p=Worker; while(p) { Worker=p->next; deletep; p=Worker; } } voidCompany: : Add() { Person*p;//新结点指针 intDuty; charName[20]; doubleAmount,T; cout<<"\n**新增员工**\n"; //输入员工信息 ID++; cout<<"输入岗位(1-经理2-销售经理3-兼职推售员4-兼职技术员): ";cin>>Duty; cout<<"输入姓名: ";cin>>Name; if(Duty==3) { cout<<"本月销售额: ";cin>>Amount; } elseif(Duty==4) { cout<<"本月工作小时数(0-168): "; cin>>T; } //创建新员工结点 switch(Duty) { case1: p=newManager(ID,Name,Duty);break; case2: p=newSalesManager(ID,Name,Duty);break; case3: p=newSales(ID,Name,Duty,Amount);break; case4: p=newTechnician(ID,Name,Duty,T);break; } p->next=0; //员工结点加入链表 if(Worker)//若已经存在结点 { Person*p2; p2=Worker; while(p2->next)//查找尾结点 { p2=p2->next; } p2->next=p;//连接 } else//若不存在结点(表空) { Worker=p;//连接 } } voidCompany: : Delete()//删除人员 { intNo; cout<<"\n**删除员工**\n"; cout<<"ID: ";cin>>No; //查找要删除的结点 Person*p1,*p2;p1=Worker; while(p1) { if(p1->No==No) break; else { p2=p1; p1=p1->next; } } //删除结点 if(p1! =NULL)//若找到结点,则删除 { if(p1==Worker)//若要删除的结点是第一个结点 { Worker=p1->next; deletep1; } else//若要删除的结点是后续结点 { p2->next=p1->next; deletep1; } cout<<"找到并删除\n"; } else//未找到结点 cout<<"未找到! \n"; } voidCompany: : Modify() { intNo,Duty; charName[20]; doubleAmount,T; cout<<"\n**修改员工**\n"; cout<<"ID: ";cin>>No; //查找要修改的结点 Person*p1,*p2;p1=Worker; while(p1) { if(p1->No==No) break; else { p2=p1; p1=p1->next; } } //修改结点 if(p1! =NULL)//若找到结点 { p1->Output(); cout<<"调整岗位(1-经理2-销售经理3-兼职推售员4-兼职技术员): ";cin>>Duty; if(p1->Duty! =Duty)//若岗位发生变动 { //修改其它数据 cout<<"输入姓名: ";cin>>Name; if(Duty==3) { cout<<"本月销售额: ";cin>>Amount; } elseif(Duty==4) { cout<<"本月工作小时数(0-168): "; cin>>T; } //创建新员工结点 Person*p3; switch(Duty) { case1: p3=newManager(p1->No,Name,Duty);break; case2: p3=newSalesManager(p1->No,Name,Duty);break; case3: p3=newSales(p1->No,Name,Duty,Amount);break; case4: p3=newTechnician(p1->No,Name,Duty,T);break; } //员工结点替换到链表 p3->next=p1->next; if(p1==Worker)//若要替换的结点是第一个结点 Worker=p3; else//若要删除的结点是后续结点 p2->next=p3; //删除原来的员工结点 deletep1; } else//若岗位没有变动 { cout<<"输入姓名: ";cin>>p1->Name; if(Duty==3) { cout<<"本月销售额: ";cin>>Amount;((Sales*)p1)->SetAmount(Amount); } elseif(Duty==4) { cout<<"本月工作小时数(0-168): ";cin>>T;((Technician*)p1)->SetT(T); } } cout<<"修改成功! \n"; } else//未找到结点 cout<<"未找到! \n"; } voidCompany: : Query() { cout<<"\n**查询人员本月销售信息**\n"; doublesum=0;//销售额总和 Person*p=Worker; while(p) { if(p->Duty==3)sum+=((Sales*)p)->GetAmount(); p=p->next; } p=Worker; doublesum2=0;//工资总和 while(p) { if(p->Duty==2)((SalesManager*)p)->SetAmount(sum); p->Output(); sum2+=p->Earning; p=p->next; } cout<<"本月盈利: "< cout<<"(按照20%利润计算)\n"; } voidCompany: : Set() { cout<<"\n**设置基础数据**\n"; cout<<"经理固定月薪["< ";cin>>ManagerSalary; cout<<"销售经理固定月薪["< ";cin>>SalesManagerSalary; cout<<"销售经理提成["< ";cin>>SalesManagerPercent; cout<<"销售人员提成["< ";cin>>SalesPercent; cout<<"技术人员小时工资["< ";cin>>WagePerHour; cout<<"员工标识[>="< ";cin>>ID; } voidCompany: : Save()//数据存盘(包括基础数据,人员数据),均采用文本文件 { ofstreamfPerson,fBase; charc; cout<<"\n保存人员和基础数据,是否继续? [Y/N]: ";cin>>c; if(toupper(c)! ='Y')return; //保存人员编号、姓名、岗位 fPerson.open("person.txt",ios: : out); Person*p=Worker; while(p) { fPerson< if(p->Duty==3) fPerson<<((Sales*)p)->GetAmount()<<"\t"; elseif(p->Duty==4) fPerson<<((Technician*)p)->GetT()<<"\t"; fPerson< p=p->next; } fPerson.close(); //保存基础数据 fBase.open("base.txt",ios: : out); fBase<<"经理固定月薪\t"< fBase<<"销售经理固定月薪\t"< fBase<<"销售经理提成%\t"< fBase<<"销售人员提成%\t"< fBase<<"技术人员小时工资\t"< fBase<<"ID\t"< fPerson.close(); cout<<"\n保存人员和基础数据已经完成...\n"; } voidCompany: : Load()//数据装入(包括基础数据,人员数据) { //基础数据装入 ifstreamfBase; charbuf[80];//buf用于保存数据文件中的注释字符串 fBase.open("base.txt",ios: : in); fBase>>buf>>ManagerSalary;//经理固定月薪 fBase>>buf>>SalesManagerSalary;//销售经理固定月薪 fBase>>buf>>SalesMana
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 实验设计