c++课题设计报告.doc

上传人:jian****018 文档编号:8990730 上传时间:2020-04-02 格式:DOC 页数:44 大小:744.50KB
返回 下载 相关 举报
c++课题设计报告.doc_第1页
第1页 / 共44页
c++课题设计报告.doc_第2页
第2页 / 共44页
c++课题设计报告.doc_第3页
第3页 / 共44页
点击查看更多>>
资源描述
课 程 设 计 报 告课程名称 面向对象程序设计 课题名称 公司人员管理系统 专 业 班 级 学 号 姓 名 指导教师 2011年 12 月 28 日湖南工程学院课 程 设 计 任 务 书课程名称 面向对象程序设计 课 题 公司人员管理系统 专业班级 学生姓名 学 号 指导老师 审 批 任务书下达日期 2011 年 11 月 15 日任务完成日期 2011 年 12 月 28 日一、设计内容与设计要求1.课程设计目的:面向对象程序设计课程设计是集中实践性环节之一,是学习完面向对象程序设计课程后进行的一次全面的综合练习。要求学生达到熟练掌握C+语言的基本知识和技能;基本掌握面向对象程序设计的思想和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题,从而提高动手编程解决实际问题的能力。2.课题题目1)公司库存管理系统2)高校学籍管理系统3)高校工资管理系统4)高校人事管理系统5)通讯录程序设计6)学生成绩管理系统7) 图书管理系统8)文本编辑器的设计与实现9)学生考勤管理系统10)公司人员管理系统3设计要求: 设计课题题目:每位同学根据自己学号除以10所得的余数加1选择相应题号的课题。随意换题者不记成绩。 根据自己对应的课题完成以下主要工作:完成系统需求分析:包括系统设计目的与意义;系统功能需求(系统流程图);输入输出的要求。完成系统总体设计:包括系统功能分析;系统功能模块划分与设计(系统功能模块图)。完成系统详细设计:包括数据库需求分析;数据库概念结构设计(ER图);数据库逻辑结构设计;类层次图;界面设计与各功能模块实现。系统调试:调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。使用说明书及编程体会:说明如何使用你编写的程序,详细列出每一步的操作步骤。关键源程序(带注释) 按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。 不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。二、进度安排第 17 周 星期一 8:0012:00 星期二 8:0012:00 星期四 8:0012:00第 18 周 星期一 8:0012:00 星期二 14:3018:30 星期三 8:0012:00三、参考书籍1.C程序设计课程设计 刘振安编著 TP312C5632.C+ Builder和Delphi课程设计与系统开发案例 伍俊良 清华大学出版社 7-302-06072-X 3.Visual C+课程设计案例精编 严华峰 中国水利水电出版社 7-5084-2007-1 2004 4.Visual C+课程设计与系统开发案例 伍俊良 清华大学出版社 7-302-05968-3 20025.Visual C+语言课程设计 : 案例精选与编程指导 陈清华朱红 东南大学出版社 7-81089-275-4 2003 6.VisualC+课程设计案例精编 中国水利水电出版社 7-5084-1004-1 2002 7.数据结构课程设计案例精编 : 用C/C+描述 李建学李光元吴春芳 清华大学出版社 7-302-14536-9 2007 (编程平台不限,vc+, c+ Builder等等。)课题5:公司人员管理系统(一)、课程设计题目:公司人员管理系统(二)、目的与要求: 1、目的: (1)要求学生达到熟练掌握C+语言的基本知识和技能; (2)基本掌握面向对象程序设计的基本思路和方法; (3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。 2、基本要求: (1)要求利用面向对象的方法以及C+的编程思想来完成系统的设计; (2)要求在设计的过程中,建立清晰的类层次; (3)在系统中至少要定义四个类,每个类中要有各自的属性和方法; (4)在系统的设计中,至少要用到面向对象的一种机制。 3、创新要求: 在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。 4、写出设计说明书 (三)、设计方法和基本原理: 1、问题描述(功能要求): 公司人员管理系统实现对公司人员按姓名或者编号显示、查找、增加、删除和保存各类人员信息的操作。 某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。 人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。 程序对所有人员有提升级别的功能 。薪金的计算方法是:经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成 ,销售经理既拿固定月薪也领取销售提成。 能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息 。在基本要求达到后,可设计出比较友好的界面(如下拉菜单),也可用VC+ ClassWizard 设计(选作)。2、问题的解决方案: 根据系统功能要求,可以将问题解决分为以下步骤: (1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;(2)分析系统中的各个实体及它们之间的关系包括属性和行为; (3)根据问题描述,设计系统的类层次; (4)完成类层次中各个类的描述(包括属性和方法); (5)完成类中各个成员函数的定义; (6)完成系统的应用模块; (7)功能调试; (8)完成系统总结报告以及系统使用说明书。目 录1.系统需求分析.12.总体设计.33.详细设计 54.系统调试.115.结果分析.186.总结.207.附录.21 1. 系统需求分析1.1问题描述公司人员管理系统实现对公司人员按姓名或者编号显示、查找、增加、删除和保存各类人员信息的操作。 某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。 人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。 程序对所有人员有提升级别的功能 。薪金的计算方法是:经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成 ,销售经理既拿固定月薪也领取销售提成。 能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息 。在基本要求达到后,可设计出比较友好的界面(如下拉菜单),也可用VC+ ClassWizard 设计(选作)1.2功能分析查询功能:void Query() 删除功能:void Delete()添加功能:void Add() 修改功能:void Modify() 保存功能:void Save()数据装入:void Load()1.2.1 查询功能函数原型:void Query() 说明:查询一个职员的基本信息,包括职工号,姓名,性别,所在部门,职务,薪水。 1.2.2 删除功能函数原型:void Delete() 说明:能够对一个职员的信息进行删除,按职工号+姓名进行删除。1.2.3 添加功能函数原型:void Add() 说明:添加一个职员的基本信息,包括职工号,姓名,性别,所在部门,职务,薪水。 12.4 修改功能函数原型:void Modify()说明:对满足条件的职员的信息进行修改,可以修改职工所在部门、 职务、工资。 1.2.5 保存功能函数原型:void Save() 说明:保存想要保存的人员信息。1.2.6数据装入函数原型:void Load()说明:将保存在磁盘的数据装入到内存中,以便对数据的再次管理和操作。2. 总体设计2.1 系统总体框架系统总体框架使用面向对象的程设计思想进行分析,整个系统涉及两大类信息和操作,公司,人员。所以系统主要涉及两个大类:公司类 Company、人员类 Person。系统的总体框架就是公司类,人员类的定义;主函数中定义一个公司对象,循环显示主菜单并根据用户选择调用公司类的相应方法(成员函数)。 (1)公司类 Company:考虑系统操作的人员信息的数量具有不确定性,所以考虑使用链表保存、处理人员信息。公司类包含:所有人员信息的一个不带头结点的链表(作为数据成员)及可以对人员信息进行增,删,改,查询, 数据存盘等操作的相关模块 (Add,Delete,Modify,Query,Set)作为成员函数。 (2)人员类 Person:所有人员都具有的公共信息及操作可以使用人员类进行 描述。由于系统具有4类人员且4类人员数据,操作有所不同,如销售员包含销 售额,而技术人员包含工作小时数且计算工资的方法不同,所以应当为 4 类人员创建相应的 Person 类的派生类。 (3)为了使公司类可以方便处理人员信息,可以考虑将公司类确定为人员类 的友元类或者人员类提供公共的方法以便公司类进行操作。为了公司类可以用共 同方法操作人员类,可以将人员类的方法确定为虚函数。2.2 结构框图公司员工管理系统查 询 人 员删 除 人 员添 加 人 员修 改 人 员保 存 人 员 2.3类的层次图People类 SalesManager类Sales类Manager类Technician类 其中: (1)Person类有No-人员编号,Name-人员姓名,Duty-人员类别,Earning-工资,next-指向下一个人员的指针;Person 类的 CalcSalary(),Output()定义 为纯虚函数分别表示要计算人员工资和输出人员信息,由于定义纯虚函数,所以 Person是抽象类,具体计算工资,输出人员信息由派生类完成。 (2)各个派生的类,包含本类对象特有的数据,Sales:Amount-销售员销 售额,SalesManager:Amount-销售经理的总销售额(系统统计各个销售员销售额得到销售经理的总销售额) ,Technician:t-技术人员工作小时数。CompanyPersor *Worker, Company(),Company(),Add(),Delete(),Modify(),Query(),Set(),Save(), Load()其中: Worker 就是人员链表。 Add(),Delete(),Modify(),Query(),Set(),Save(),Load()分别表示系统各个功能模块:增加人员,删除人员,修改人员,查找人员,基本数据的设置,数据存盘,数据装入。3. 详细设计3.1.程序的运行步骤及函数的实现(1)主函数流程 (2) Company:Add()开始ID号增1输入岗位员工对象加入结点结束输入数据,创建员工对象结点(3) Company:Delete()开始输入员工ID查找要删除的结点结点存在结束链表删除员工结点提示未找到并返回否是 (4) Company:Modify开始输入员工ID查找结点结点存在结束修改结点提示未找到并返回否是(5) Company:Query() 开始输入员工编号 查找节点节点存在输出节点人员的相关信息提示不存在并返回主函数结束否是(6)Company:Save()(7) Company:Load()4. 系统调试4.1 界面的显示,选择功能项 图4.14.2 最开始先增加人员1)增加经理 图4.2.1 2)增加销售经理 图4.2.2 3)增加技术人员 图4.2.34.3 增加后对增加的人员进行查找 图4.34.4 如果能查找到就说明增加成功,然后在进行修改操作 图4.44.5 修改之后再查找这个人员,看是否修改成功。 图4.54.6 确定修改成功后再进行删除人员 图4.64.7 确定是否删除成功 图4.74.8 确定删除之后再进行保存 图4.84.9 对数据进行修改 图4.94.10 看一下修改后的效果 图4.104.11 修改正确,整个系统无误,退出系统 图4.115. 结果分析一.本系统独特的设计1.两个类的设计 1.1 Company类有数据成员员工,这个类的主要功能是对功能模块的实现,可以设计Add(),Delete(),Modify(),Query(),Set(),Save(),Load()函数对系统功能需求的实现。查询功能void Query()查询一个职员的基本信息,包括职工号,姓名,性别,所在部门,职务,薪水。 删除功能void Delete() 能够对一个职员的信息进行删除,按职工号+姓名进行删除。添加功能void Add()添加一个职员的基本信息,包括职工号,姓名,性别,所在部门,职务,薪水。 修改功能void Modify() 对满足条件的职员的信息进行修改,可以修改职工所在部门、 职务、工资。 保存功能void Save() 保存想要保存的人员信息。数据装入void Load()将保存在磁盘的数据装入到内存中,以便对数据的再次管理和操作。1.2 People类有数据成员姓名,编号,职务,月总工资,还有两个纯虚函数,纯虚数不给出实现,在People类的派生类中再给出两个纯虚函数的相应的实现,一个纯虚函数是virtual void CalcSalary()=0; 实现对每个人员工资的计算,另一个就是virtual void Output()=0;实现对每个人员的具体信息的输出。这个设计是一个亮点。 2.链表的设计,使用链表可以动态的增加人员,而不受内存的限制,先定义一个People类的链表头指针,再在以后每增加的人员设置为一个节点然后再把节电连接到头指针就实现了人员的增加。3.界面的设计,每对一个具体的操作进行完之后,利用一个return ;就可以返回主函数,在进行下一步操作,这是个很好的操作。二.本系统不足之处1. 我设计的思路是由People类派生出四个类,Manager类,Sales类,SalesManager类, 和Technician类。但也可以用Manager类和Sales类共同派生出SalesManager类,这样就更接近我们学习的面向对象的设计的思路,这是一个不足之处。2. 本系统的删除功能不是很完善,问题就是每当删除一个人员的时候,这个人员的所有信息都被删除了,包括人员的编号,编号一旦删除了就找不回了,也就是说删除了一号,这个系统就没有了一号,这是一个不足之处。其他的还算比较好。n 6.总结这次课程设计所设计的公司员工管理系统(CEMS)是一个小型的人事信息管理系统,该系统实现了职工信息的添加、删除、修改、显示、查询等功能,并且运用了文件操作技术,可以实现数据的永久性保存。通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大 提高。运用学习成果,把课堂上学到的系统化的理论知识,尝试性地应用于实际设计工作,并从理论的高度对设计工作的现代化提出一些有针对性的建议和设想。检验学习成果,看一看课堂学习与实际工作到底有多大距离,并通过综合分析,找出学习中存在的不足,以便为完善学习计划,改变学习内容与方法提供实践依据。对我们计算机专业的本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。这也是一次预演和准备毕业设计工作。通过课程设计,让我们找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。经过两周的C+课程实践, 我对C+语言设计有了一个更深, 更全面的了解, 尤其体会到C+面向对象操作对简化程序的重要作用.下面是我的几点体会: 刚拿到课题时,我一脸的茫然,看到如此庞大的工程,不知如何下手.这个工资管理系统中职工子信息竟然包15条,以前从来没有遇到过如此多的变量.和同学讨论很久好,我发现其实可以化繁为简的,信息15条不一定全都要,因为其中本身就有重复的.所以做任何事情都必须要开动脑筋,积极思考,有时还要学会化繁为简. 在编程时条理清晰是至关重要的.主函数,函数,成员函数之间的层次关系,调用关系一定要有一个全面的把握,尤其要体会类的封装性.另外很重要的一点就是一定要对链表的五种操作熟练的掌握. 在编译,链接,调试的过程中一定要有耐心.因为一个程序中会有很多小的错误,甚至有的问题要几个小时才能解决.遇到问题,一定要全面分析,有时候还要向同学请教.总得来说,编程时极需要耐心的. C+课程设计实践为我们提供了一个综合运用所学知识,解决实际问题的平台,增强了我们实践动手的能力和工程实践能力,并且锻炼和培养了我们的自学能力,让我们对 C+有了一个更全面的了解。7.附录源程序清单:#include #include #include #include #include /全局数据,对象double ManagerSalary=5000; /经理固定月薪double SalesManagerSalary=2000; /销售经理固定月薪 double SalesManagerPercent=0.5; /销售经理提成double SalesPercent=5; /销售人员提成double WagePerHour=20; /技术人员小时工资int ID; /员工标识(要保证唯一)class Person /员工类protected: int No; /编号 char Name20; /姓名 int Duty; /岗位 double Earning; /收入 Person *next;public: Person(char ID,char *Name,int Duty) this-Duty=Duty; strcpy(this-Name,Name); this-No=ID; virtual void CalcSalary()=0; virtual void Output()=0; friend class Company;class Manager:public Person /经理类public: Manager(char ID,char *Name,int Duty):Person(ID,Name,Duty) void CalcSalary()Earning=ManagerSalary; void Output() CalcSalary(); coutNotNamet经理tEarningAmounts=Amounts; void SetAmounts(double s) Amounts=s;double GetAmounts() return Amounts; void CalcSalary() Earning=SalesManagerSalary+Amounts*SalesManagerPercent/100; void Output() CalcSalary(); coutNotNamet销售经理tAmountstEarningt=T; double GetT() return t; void SetT(double T) this-t=T; void CalcSalary() Earning=WagePerHour*t; void Output() CalcSalary(); coutNotNamet技术员ttt EarningAmount=Amount; double GetAmount() return Amount; void SetAmount(double Amount) this-Amount=Amount; void CalcSalary() Earning=SalesPercent/100*Amount; void Output() CalcSalary(); coutNotNamet销售员tAmountt Earningnext; delete Worker; Worker=p; Worker=0; void Add(); /增加人员 void Delete(); /删除人员 void Modify(); /修改人员 void Query(); /查询人员 void Set();/设置基本数据 void Save(); /数据存盘(包括基础数据,人员数据) void Load();/数据的装入;void Company:Add()/增加人员 Person *p; /新结点指针 int Duty; char Name20; double Amount,Amounts,T; coutn* 新增员工 *n; ID+;/输入员工信息 coutDuty; coutName;if(Duty=2)coutAmounts;if(Duty=3) coutAmount;else if(Duty=4) coutT;/创建新员工结点switch(Duty)case 1:p=new Manager(ID,Name,Duty); break;case 2:p=new SalesManager(ID,Name,Duty,Amounts); break;case 3:p=new Sales(ID,Name,Duty,Amount); break;case 4:p=new Technician(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; /连接 /数据的保存coutch;if(ch=Y)Save();void Company:Delete() /删除人员 int No; coutn* 删除员工 *n; coutNo;/查找要删除的结点 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; delete p1; else /若要删除的结点是后续结点 p2-next=p1-next; delete p1; cout找到并删除n; else /未找到结点 cout未找到!n; char ch; coutch; if(ch!=0) return ; void Company:Modify()/修改人员函数的实现 int No,Duty; char Name20; double Amount,Amounts,T; coutn* 修改员工 *n; coutNo;/查找要修改的结点 Person *p1,*p2; p1=Worker; while(p1) if(p1-No=No) break; else p2=p1; p1=p1-next;/修改结点 if(p1!=NULL)/若找到结点char ch; p1-Output(); coutDuty; if(p1-Duty!=Duty) /若岗位发生变动 /修改其它数据 coutName; if(Duty=2) coutAmounts; if(Duty=3) coutAmount; else if(Duty=4) coutT;/创建新员工结点 Person *p3; switch(Duty) case 1:p3=new Manager(p1-No,Name,Duty); break; case 2:p3=new SalesManager(p1-No,Name,Duty,Amounts); break; case 3:p3=new Sales(p1-No,Name,Duty,Amount); break; case 4:p3=new Technician(p1-No,Name,Duty,T); break;/员工结点替换到链表 p3-next=p1-next; if(p1=Worker) /若要替换的结点是第一个结点 Worker=p3; else /若要删除的结点是后续结点 p2-next=p3;/删除原来的员工结点 delete p1; else /若岗位没有变动 coutp1-Name; if(Duty=2) coutAmounts; (SalesManager *)p1)-SetAmounts(Amounts); if(Duty=3) coutAmount; (Sales *)p1)-SetAmount(Amount); else if(Duty=4) coutT; (Technician *)p1)-SetT(T); cout修改成功!n;coutch; if(ch=Y) Save();else /未找到结点cout未找到要查询的人员!n; char ch;coutch;if(ch!=0)return ;void Company:Query()int i;Person *p1,*p2;p1=Worker;if(p1)couti;while(p1)if(p1-No=i)break;elsep2=p1;p1=p1-next;if(p1!=NULL)if(p1-Duty=1) cout编号 姓名 职位 月总工资Output();if(p1-Duty=2)cout编号 姓名 职位 月销售量 月总工资Output();if(p1-Duty=3)cout编号 姓名 职位 月销售量 月总工资Output();if(p1-Duty=4)cout编号 姓名 职位 月工作量 月总工资Output();elsechar ch;coutch;if(ch!=0)return ;elsecout系统还未存入人员endl;return ;void Company:Set()/基本数据的设置 coutn* 设置基础数据 *n; cout经理固定月薪ManagerSalaryManagerSalary; cout销售经理固定月薪SalesManagerSalarySalesManagerSalary; cout销售经理提成SalesManagerPercentSalesManagerPercent; cout销售人员提成SalesPercentSalesPercent; cout技术人员小时工资WagePerHourWagePerHour; cout=IDID;void Company:Save() /数据存盘(包括基础数据,人员数据),均采用文本文件 ofstream fPerson,fBase; char c; coutc; if(c!=Y)cout数据未保存!endl;return;/保存人员编号、姓名、岗位 fPerson.open(person.txt,ios:out); Person *p=Worker; while(p) fPersonNotNametDutyDuty=2) fPersonGetAmounts()Duty=3) fPersonGetAmount()Duty=4) fPersonGetT()t; fPersonnext; fPerson.close();/保存基础数据 fBase.open(base.txt,ios:out); fBase经理固定月薪tManagerSalaryendl; fBase销售经理固定月薪tSalesManagerSalaryendl; fBase销售经理提成tSalesManagerPercentendl; fBase销售人员提成tSalesPercentendl; fBase技术人员小时工资tWagePerHourendl; fBaseIDtIDendl; fPerson.close(); coutbufManagerSalary; /经理固定月薪 fBasebufSalesManagerSalary; /销售经理固定月薪 fBasebufSalesManagerPercent; /销售经理提成 fBasebufSalesPercent; /销售人员提成 fBasebufWagePerHour; /技术人员小时工资 fBasebufID; /员工标识 fBase.close(); /清除内存人员数据 ifstream fPerson; Person *p=Worker; int No; char Name20; double Amount,Amounts,T; int Duty; fPerson.open(person.txt,ios:in); /读一条记录 fPersonNoNameDuty;if(Duty=2) fPersonAmounts; if(Duty=3) fPersonAmount; else if(Duty=4) fPersonT; while(fPerson.good() /创建员工结点 switch(Duty) case 1:p=new Manager(No,Name,Duty); break; case 2:p=new SalesManager(No,Name,Duty,Amounts); break; case 3:p=new Sales(No,Name,Duty,Amount); break; case 4:p=new Technician(No,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; /连接 /读下一条记录 fPersonNoNameDuty; if(Duty=2) fPersonAmounts; if(Duty=3) fPersonAmount; else if(Duty=4) fPersonT; fPerson.close(); coutn 人员和基础数据已经装入.n; return ; void main()int c;Company a;docout * endl;cout * * endl;cout *
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!