- 334.00 KB
- 2022-04-21 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
课程设计课程名称C++面向对象程序设计题目名称公司人员管理系统专业班级13级计算机科学与技术一班学生姓名林涛、甑德胜、梁增辉吴志伟、李齐、江靖学号51302011015、51302011016、5130201100151302011037、51302011006、51302011009指导教师郭有强32n二○一四年六月二十日32n目录一、引言2二、课程设计报告41、问题描述42、系统总体方案43、设计思路和主要步骤54、各功能模块和流程图5(1)各功能模块5(2)流程图6三、系统测试9四、心得体会14五、参考文献16附:程序设计代码1732n一、引言1985年,管理信息系统的创始人,高登・戴维斯给出的管理信息系统的定义是:“它是一个利用计算机硬件和软件,手工作业,分析、计划、控制和决策模型,以及数据库的用户一机器系统。它能提供信息,支持企业或组织的运行、管理和决策。”这个定义说明了管理信息系统的组成要素:计算机硬件、软件、数据库、模型库和用户。随着我国社会的不断进步,人们对管理信息系统越来越重视,再加之管理信息系统在管理方面所产生的巨大影响,也使得人们越来越关注管理信息系统的发展趋势。由于管理信息系统的发展受到以上各种变革因素的制约,传统的管理信息系统必然向现代管理信息系统发展,在这个发展过程中,管理信息系统的发展将会呈现出以下趋势:管理信息系统将会越来越注重以人为本。管理科学的发展有科学管理理论、行为管理理论和现代管理理论三个发展阶段,正在向着越来越人性化的方向发展,即以人为本。基于管理学的这一研究视角,管理信息系统也将向着更加人性化的方向发展。在今后的管理信息系统中将会越来越注重人的因素,以人为出发点和中心,围绕着激发和调动人的主动性、积极性、创造性展开的,以实现人与社会共同发展的一系列管理活动。而且这种人性化还会贯穿于管理信息系统的开发设计与研究中,具体表现为今后的管理信息系统将具有更加友好的人机界面,易于人们操作,也会考虑到不同用户的不同需求,更加个性化。管理信息系统向智能化方向发展。随着人工智能技术的发展,数据仓库、数据挖掘技术在管理信息系统中的应用,管理信息系统必将向着智能化方向发展,如产生了很多的决策支持系统、专家系统等等。智能化的管理信息系统具有思维模拟活动,它具有很高的自学习、自组织和进化性,并具有知识创新功能,可以解决非结构化事务,在决策中处于主导地位,是人的向导,在体系上将是大规模分布式计算模式,以基于网络神经元构件的智能网为主。32n管理信息系统向集成化方向发展。随着当前系统集成技术的提高,集成技术和方法也逐步地运用到管理信息系统中。由于管理信息系统将包含多个子系统,因此将这些功能集合在一起以便更好地发挥它的作用,这就是集成化的管理信息系统。集成化的管理信息系统将管理信息系统的各个子系统有机地结合起来,达到互通信息、共享数据资源的目的,其支撑技术是数据库和计算机网络。集成管理则是一种全新的理念与方法,其核心是强调运用集成的思想和理念指导管理实践。而集成管理信息系统的本质是要素的整合和优势互补,在集成管理运作过程中,首先经历的是一个投入要素的聚集过程,当投入要素积累到一定量时,集成能量便开始发生膨胀裂变,从而使各种单项要素优势催化出更大的整体优势,管理效果也因而急剧放大。因此,管理信息系统是当代公司发展中不可或缺的一部分,是公司管理人员的基础。公司人员管理系统的完善也起到保护公司内部资料的作用,是公司盈利与否的必备条件之一。32n二、课程设计报告1、问题描述某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。要求:⑴其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。⑵程序对所有人员有提升级别的功能⑶月薪的计算方法是:经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成,销售经理既拿固定月薪也领取销售提成。⑷能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息。⑸用文件处理方式实现。2、系统总体方案使用面向对象的程序设计思想进行分析,整个系统涉及两大类信息和操作,公司,人员。所以系统主要涉及两个大类:公司类Company、人员类Person。系统的总体框架就是公司类,人员类的定义;主函数中定义一个公司对象,循环显示主菜单并根据用户选择调用公司类的相应方法(成员函数)。(1)公司类Company:考虑系统操作的人员信息的数量具有不确定性,所以考虑使用链表保存、处理人员信息。公司类包含:所有人员信息的一个不带头结点的链表(作为数据成员)及可以对人员信息进行增,删,改,查询经营信息,基础数据设置,数据存盘,数据装入等操作的相关模块(Add,Delete,Modify,Query,Set,Save,Load)作为成员函数。(2)人员类Person:所有人员都具有的公共信息及操作可以使用人员类进行描述。由于系统具有4类人员且4类人员数据,操作有所不同,如销售员包含销售额,而技术人员包含工作小时数且计算工资的方法不同,所以应当为4类人员创建相应的Person类的派生类。32n(3)为了使公司类可以方便处理人员信息,可以考虑将公司类确定为人员类的友元类或者人员类提供公共的方法以便公司类进行操作。为了公司类可以用共同方法操作人员类,可以将人员类的方法确定为虚函数。3、设计思路和主要步骤根据需求分析,首先我们需要建立Person基类,由此派生出了经理类(Manager),销售经理类(SalesManager),销售员类(Sales),技术人员类(Technician),在Person类中,需要将人员编号,姓名,岗位,收入,以及next指针等数据设置权限为protected;由于其他类需要访问基类数据及相应成员函数,所以我们必须设置为public。在各个派生类中,因为都需要使用了CalcSalary(),OutPut()函数,为了不出现二义性的问题,我们需要在基类中将这两个函数声明为纯虚函数,通过进一步分析,由于基类中的构造函数不能被继承,而且在派生类中又需要增加自己的数据成员,所以我们必须定义派生类的构造函数来完成相应的初始化。然后建立Company类,在public访问权限中,我们通过链表来操作人员数据,同时增加不同功能的成员函数如:voidAdd();//增加人员voidDelete();//删除人员 voidModify();//修改人员 voidQuery();//查询人员 voidSet();//基础数据设置 voidSave();//数据存盘 voidLoad();//数据装入———为了实现多文件的效果,我们将Company类定义及该类的实现分开,然后逐一对各功能函数进行代码编写。最后,我们定义了主函数,通过公司类创建了一个对象,并通过此对象完成相应的操作。在调试并测试代码过程中,当程序员输入相应的指令后,该系统自动调用相应的功能函数来达到需求效果,至此,一个公司人员管理系统的实现才算基本成功。4、各功能模块和流程图(1)各功能模块1.Person类的No-人员编号,Name-人员姓名,Duty-人员类别,Earning-工资,next-指向下一个人员的指针;Person类的CalcSalary(),Output()定义为纯虚函数分别表示要计算人员工资和输出人员信息,由于定义纯虚函数,所以Person是抽象类,具体计算工资,输出人员信息由派生类完成。32n2.各个派生的类,包含本类对象特有的数据,Sales::Amount-销售员销售额,SalesManager::Amount-销售经理的总销售额(系统统计各个销售员销售额得到销售经理的总销售额),Technician::t-技术人员工作小时数。其中:Worker就是人员链表。Clear()用于清除人员链表所有结点。Add(),Delete(),Modify(),Query(),Set(),Save(),Load()分别表示系统各个功能模块:增加人员,删除人员,修改人员,查询本月经营信息,基础数据设置,数据存盘,数据装入。(2)流程图1主函数流程 2Company::Add() 32n3Company::Delete() 4Company::Modify 5Company::Query() 6Company::Save() 32n 7Company::Load() 32n三、系统测试列出各功能具体的输入数据及对应的输出结果,说明其是否符合设计要求:增加人员数据:32n查询所添加人员的信息:删除员工:32n查询是否删除成功:修改员工的姓名:32n查询是否修改成功:数据存盘:32n数据装入:清除并退出系统:32n四、心得体会通过此次课程设计,使我们更加扎实的掌握了有关C++程序设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我们在这方面的知识欠缺和经验不足。实践出真知,通过大家的亲自动手制作,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后通过查阅相关书籍以及在大家的积极讨论下,终于迎刃而解。在今后社会的发展和学习实践过程中,我们一定会不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!课程设计诚然是一门专业课,给我们很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我们莫大的空间。同时,设计让我们感触很深。使我们对抽象的理论有了具体的认识。通过这次课程设计,我们基本掌握了C++课程设计的原理。我认为,在这学期的实验中,不仅培养了团结合作、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。回顾起此次课程设计,至今仍让我们感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高我们的实际动手能力和团结互助32n的能力。在设计的过程中遇到问题,可以说是困难重重,但可喜的是最终都得到了解决。此次设计也让我们明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。32n五、参考文献1.[美]GaryBronson著,刘勇译.ProgrammingDevelopmentandDesignUsingC++,SecondEdition(C++程序开发与设计,第2版).北京:人民邮电出版社,20022.王萍.C++面向对象程序设计.北京:清华大学出版社.20023.罗建军等.C++程序设计教程(第2版).北京:高等教育出版社,20044.谭浩强.C++程序设计.北京:清华大学出版社.20045.黄维通.VisualC++面向对象与可视化程序设计(第2版).北京:清华大学出版社,20076.张基温.C++程序设计基础.北京:高等教育出版社,20017.刁成嘉.面向对象C++程序设计.北京:机械工业出版社,20048.郭有强等编著,《C++面向对象程序设计》,清华大学出版社,2009年出版9.郭有强等编著,《C++面向对象程序设计实验指导与课程设计》,清华大学出版社,2009年出版32n附:程序设计代码//Company.h#include"Person.h"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();//数据装入(包括基础数据,人员数据) 32n};//Manager.hexterndoubleManagerSalary;classManager:publicPerson//经理类 {public:Manager(charID,char*Name,intDuty):Person(ID,Name,Duty){}voidCalcSalary(){Earning=ManagerSalary;}voidOutput(){CalcSalary();cout<Duty=Duty;strcpy(this->Name,Name);this->No=ID;}virtualvoidCalcSalary()=0;virtualvoidOutput()=0;friendclassCompany;};32n//Sales.hexterndoubleSalesPercent;//销售人员提成%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<t=T;}doubleGetT(){returnt;}32nvoidSetT(doubleT){this->t=T;}voidCalcSalary(){Earning=WagePerHour*t;}voidOutput(){CalcSalary();cout<next;32ndeletep;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)//若已经存在结点32n{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)//若要删除的结点是第一个结点32n{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)//若找到结点32n{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//若岗位没有变动32n{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;}32ncout<<"本月盈利:"<>ManagerSalary;cout<<"销售经理固定月薪["<>SalesManagerSalary;cout<<"销售经理提成["<>SalesManagerPercent;cout<<"销售人员提成["<>SalesPercent;cout<<"技术人员小时工资["<>WagePerHour;cout<<"员工标识[>="<>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<No<<"t"<Name<<"t"<Duty<<"t";if(p->Duty==3)fPerson<<((Sales*)p)->GetAmount()<<"t";elseif(p->Duty==4)32nfPerson<<((Technician*)p)->GetT()<<"t";fPerson<next;}fPerson.close();//保存基础数据fBase.open("base.txt",ios::out);fBase<<"经理固定月薪t"<>buf>>ManagerSalary;//经理固定月薪 fBase>>buf>>SalesManagerSalary;//销售经理固定月薪 fBase>>buf>>SalesManagerPercent;//销售经理提成% fBase>>buf>>SalesPercent;//销售人员提成% fBase>>buf>>WagePerHour;//技术人员小时工资 fBase>>buf>>ID;//员工标识fBase.close();//清除内存人员数据Clear();//人员数据数据装入ifstreamfPerson;Person*p=Worker;intNo;charName[20];intDuty;32ndoubleAmount,T;fPerson.open("person.txt",ios::in);//读一条记录fPerson>>No>>Name>>Duty;if(Duty==3)fPerson>>Amount;elseif(Duty==4)fPerson>>T;while(fPerson.good()){//创建员工结点switch(Duty){case1:p=newManager(No,Name,Duty);break;case2:p=newSalesManager(No,Name,Duty);break;case3:p=newSales(No,Name,Duty,Amount);break;case4:p=newTechnician(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;//连接}//读下一条记录fPerson>>No>>Name>>Duty;if(Duty==3)fPerson>>Amount;32nelseif(Duty==4)fPerson>>T;}fPerson.close();cout<<"n人员和基础数据已经装入...n";}//main.cpp#include"iostream.h"#include"Company.h"//全局数据,对象 doubleManagerSalary;//经理固定月薪 doubleSalesManagerSalary;//销售经理固定月薪 doubleSalesManagerPercent;//销售经理提成% doubleSalesPercent;//销售人员提成%doubleWagePerHour;//技术人员小时工资 intID;voidmain(){charc;Companya;do{cout<<"n***公司人员管理系统***n";cout<<"1-增加人员n";cout<<"2-删除人员n";cout<<"3-修改人员n";cout<<"4-查询本月经营信息n";cout<<"5-基础数据设置n";cout<<"6-数据存盘n";cout<<"7-数据装入n";cout<<"8-退出n请选择(1-8):";cin>>c;switch(c){case'1':a.Add();break;32ncase'2':a.Delete();break;case'3':a.Modify();break;case'4':a.Query();break;case'5':a.Set();break;case'6':a.Save();break;case'7':a.Load();break;}}while(c!='8');}32