小型人员信息管理系统设计_第1页
小型人员信息管理系统设计_第2页
小型人员信息管理系统设计_第3页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、成绩评定表学生班级学号专业通信工程课程设计题目小型人员信息管理系统的设计与实现评语组长签字:成绩日期20 年 月曰课程设计任务书学院信息科学与工程专业通信工程学生班级学号课程设计题目小型人员信息管理系统的设计与实现实践教学要求与任务某小型公司主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现 在,需要存储这些人员的、编号、级别、当月薪水,计算月薪总额并显示全部信息。 人员编号基数为1000,每输入一个人员信息编号顺序加1。程序要有对所有人员提升级别的功能。本例中为简单起见,所有人员的初始级别 均为1级,然后进行升级,经理升为4级,兼职技术人员和销售经理升为 3级,推销 员认为1级。月

2、薪计算办法是:经理拿固定月薪8000元;兼职技术人员按每小时100元领取月 薪;兼职推销员的月薪按该推销员当月销售额的4%提成;销售经理即拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的千分之五。要求为每一类人员单独建立文件,并在每个文件中手工录入一些人员基本信息, 并根据这些基本信息计算职工的月薪,并将计算结果保存入相应的磁盘文件中。要求 编写程序实现上述功能,并且可以通过实例演示上述功能。工作计划与进度安排第17周:分析题目,查阅课题相关资料,进行类设计、算法设计;第18周:程序的设计、调试与实现;第19周:程序测试与分析,撰写课程设计报告,进行答辩验收。

3、指导教师:201年 月曰专业负责人:201 年 月曰学院教学副院长:201 年 月曰C+是支持面向过程的设计,更是支持基于对象和面向对象的程序设计。类是C+中十分重要的概念,它是实现面向对象程序设计的基础。本文采用虚基类及其派生类实 现了对小型人员信息的管理,类的封装性和信息隐蔽性可以很好的保护公司员工的信 息,同时采用了 Visual C+ 6.0 的控制台工程和MFC工程实现了对员工基本信息的输 入和全部信息的输出及保存。1 需求分析 12算法基本原理 13类设计 24基于控制台的应用程序 34.1 类的接口设计 44.2 类的实现 74.3主函数设计 114.4基于控制台的应用程序测试

4、125基于MFC的应用程序 145.1基于MFC勺应用程序设计5.1.1 MFC程序界面设计.5.1.2 MFC程序代码设计.5.2基于MFC勺应用程序测试结论参考文献.151516. 2123241需求分析(1) 对小型公司进行小型人员信息操作管理系统。 该公司主要有四类人员: 经理、销售经理、兼职技术人员、兼职推销员;定义一个虚基类并且派生四个子 类。(2) 系统需要存储这些人员的、编号、级别、当月薪水,输入基本信息,计算月薪总额,显示并保存全部信息;每个派生类的构造函数要实现对其特有数 据成员的初始化。(3) 系统具体要求: 编号要求:人员编号基数为1000,每输入一个员工编号加1;编号

5、定义 为全局静态变量即可。 级别要求:所有人员的初始级别均为 1级,然后进行升级,经理升为4 级,兼职技术人员和销售经理升为 3级,兼职推销员为1级;直接对级别赋值即 可。 月薪要求:经理拿固定月薪 8000元;兼职技术人员按每小时100元领 取月薪;兼职推销员的月薪按该推销员当月销售额的 4%提成;销售经理既拿固 定月薪也领取销售提成,固定月薪为 5000元,销售提成为所管辖部门当月销售 总额的千分之五。 总体要求:为每一类人员单独建立文件,并在每个文件中手工录入一些 人员基本信息,并根据这些基本信息计算职工的月薪, 并将计算结果保存入相应 的磁盘文件中。2算法基本原理(1) 定义一个员工虚

6、基类Employmee(),包括员工、级别、编号月薪共有 的基本数据成员;(2) 在基类的基础上派生出经理 Mansger()类、销售经理Salemansger() 类、兼职技术人员Tech no logy()类和兼职推销员Salema n()类,并在这四个派 生类中添加各自数据成员和成员函数。具体分析如下: 员工编号的可以定义全局静态变量static in t cou nt=O ;并且初始化员工编号number=1000+count;每输入一个员工的编号加 1。 员工等级按照要求直接赋值即可; 在派生类的构造函数中初始化数据成员并且按照要求计算各成员的月 薪。(3) 定义一个结构体链表 st

7、ruct Lin ked ,并将链表的头指针头封装在友 元类Head()中。(4) 运行时构造对象指针,并存在链表中,利用类中的成员函数来实现对 链表节点的打印、添加、保存。这些操作均作为数据结构中对单链表的操作。3类设计首先定义一个员工基类 Employee,由于要派生出多个子类,所以将其定义 为虚基类;在类外定义全局静态变量,用于记录员工的编号。虚基类 Employee 中的数据成员包括、编号、等级、月薪。虚基类的成员函数包括打印函数 prin tf(),并声明友元类。然后派生出经理 Mansger类、销售经理 Salemansger类、兼职技术人员 Tech no logy类和兼职推销员

8、Saleman类。在派生类Man sger的构造函数直接对 月薪和等级赋值:月薪8000,等级4;在派生类Salemansger的构造函数中定义 特有的数据成员:销售总额sum1,并根据要求计算月薪,等级赋值3;在派生类 Technology的构造函数中定义特有的数据成员:工作时间time,并根据要求计算月薪,等级赋值3;在派生类Saleman的构造函数中定义特有的数据成员:销 售额sum2并根据要求计算月薪,等级赋值1。派生类的功能有打印函数printf(),储存函数 save()。友元类Head存放的数据成员有Linked top,功能有构造函数Head()、插 入函数Insert()、打

9、印函数printf() 以及析构函数Head();其中功能构造 函数用来开辟储存空间,插入函数采用单链表现实信息的输入,打印函数用来输 出录入员工的全部信息,析构函数用来释放空间。基类与各派生类之间的关系如下图所示:图1 Employee类和其派生类关系的图形表示在程序实现过程中,各派生类的成员函数需要访问基类Employee的数据成员,利用公有继承方式派生,同时将 Employee类中的数据成员的访问控制设置 为保护类型。这样,经过公有派生之后,基类的保护成员在派生类中依然是保护 成员,可以被派生类的成员函数访问。4基于控制台的应用程序整个程序分为三部分,各种职员的类,结构体链表以及封装在结

10、构体链表的 类。实现时先生成各种职员的对象指针,之后将生成的对象指针插入到链表中, 最后通过封装类类的成员函数对链表节点进行操作,实现对员工的操作。4.1 类的接口设计#in clude<iostream>#i ncludevstri ng.h>#in clude<fstream>using n amespace std;static int coun t=0;/工编号/定义虚基类class Employeepublic:Employee。/ cout«" 请输入员工:cin>>n ame;+co unt;nu mber=co un

11、 t+1000;全局动态变量,用于记录员构造函数,初始化员工基本信息level=1;void prin tf();/frie nd class Head;/protected:/char n ame30;int nu mber;in t level;float wages;/派生类Mansger打印函数声明友元类数据成员为保护类型class Man sger: public virtual Employee public:Man sger():Employee()level=4;wages=8000; /void save();/构造函数定义储存函数打印函数声明友元类构造函数定义计算销售经理工

12、资储存函数打印函数销售总额构造函数定义计算技术人员工资储存函数打印函数工作时间/void printf();frie nd class Head;/;/ 派生类 Salemansgerclass Salema nsger: public virtual Employeepublic:Salema nsger():Employee()/level=3;coutvv"输入月部门销售总额:"cin> >sum1;wages=5000+0.005*sum1;/void save ();/void prin tf();/frie nd class Head;protect

13、ed:int sum1;/;/ 派生类 Tech no logyclass Tech no logy: public virtual Employeepublic:Tech nology():Employee()/level=3;coutvv" 输入该技术人员的工作时间:"cin> >time;wages=100*time;/void save();/void prin tf();/frie nd class Head;protected:float time;/;/派生类Salemanclass Salema n: public virtual Employe

14、epublic:Salema n( ):Employee()/构造函数定义level=1;coutvv"输入部门月销售总额:"cin> >sum2;wages=0.04*sum2;/计算销售员工资void save ();/储存函数void printf();friend class Head;protected:int sum2;/销售总额;/定义友元类class Headpublic:Head();/构造函数单链表的插入函数 打印函数析构函数void In sert(Employee*temp);void prin tf();Head();private:L

15、in ked*top;经过公有派生,四个派生类获得了除构造函数之外的Employee类的全部成员,由于基类的成员是公有和保护类型, 因此在派生类中的成员函数中, 基类继 承来的成员全部可以访问,而对于建立派生类对象的外部模块来讲, 基类的保护/单链表的头结点成员是无法访问的。通过保护访问类型和公有的继承方式,实现了基类Employee 的数据的有效共享和可靠保护。友元类可以实现外部函数对类中数据成员的调 用,在程序中,员工的基本信息的输入,全部信息的保存都是在基类、派生类的 构造函数以及友元类的成员函数中完成,它们的清理工作在友元类析构函数中完 成。4.2 类的实现/基类输出函数void Em

16、ployee:pri ntf()cout<v":"v<name«""<<"编号:"<<number<<""<<"等级:"vvlevelvv" "<<"月薪:"<<wages<<e ndl;/派生类Mansger输出函数void Man sger:pri ntf()cout<<":"<<name«&q

17、uot;"<<"编号:"<<number<<""<<"等级:"vvlevelvv" "<<"月薪:"<<wages<<e ndl;/派生类Mansger储存函数void Man sger:save()ofstream fs("f:Ma nsger.txt");fs<v":"v<namevv" "<<"编号:&q

18、uot;<<numbervv" "<<"等级:"vvlevelvv""<<"月薪:"vvwagesvvendl;coutvv"Mansger OK"vvendl;/ 派生类Salemansger输出函数void Salema nsger:pri ntf()coutvv":"vvnamevv""vv"编号:"vvnumbervv""vv"等级:"vvlevelvv

19、" "vv"月薪:"vvwagesvve ndl;/派生类Salemansger储存函数void Salema nsger:save()ofstream fs("f:Salema nsger.txt");fsvv":"vvnamevv" "vv" 编号:"vvnumbervv" "vv"等级:"vvlevelvv""vv"月薪:"vvwagesvvendl;coutvv"Salema n

20、sger OK"vve ndl;/ 派生类Tech no logy输出函数void Tech no logy:pri ntf()cout<v":"v<name«""<<"编号:"<<numbervv""<<"等级:"vvlevelvv" "<<"月薪:"<<wages<<e ndl;/派生类Tech no logy储存函数void Tech no log

21、y:save()ofstream fs("f:Tech no logy.txt");fs<<":"<<name«" "<<"编号:"<<number<<" "<<"等级:"vvlevelvv""<<"月薪:"vvwagesvvendl;cout<<"Tech no logy OK"<<e ndl;/派

22、生类Saleman输出函数void Salema n:pri ntf()coutvv":"v vn amevv" 级:"vvlevelvv" "vv""vv"编号:"vvnumbervv""vv"等月薪:"vvwagesvve ndl;/派生类Saleman:储存函数void Salema n:save()ofstream fs("f:Salema n.txt");fs<v":"v<namevv"

23、; "<<"编号:"<<numbervv" "<<" 等级:"vvlevelvv""<<"月薪:"vvwagesvvendl;coutvv"Saleman OK"vve ndl;/友元类的实现Head:Head()/友元类的构造函数实现初始化链表if(top=new Lin ked)=NULL) exit(-1);top->n ext=NULL;void Head:l nsert(Employee*temp) L

24、in ked*ttop=top;while(ttop->n ext)/空间ttop=ttop->n ext;ttop->n ext=new Lin ked;ttop->n ext->p=temp;ttop->n ext- >n ext=0;/链表的输出函数void Head:pri ntf() Lin ked*pbuf=top->n ext;while(pbuf!=NULL)pbuf->p->pri ntf();/pbuf=pbuf- >n ext;/链表的析构函数Head:Head() Lin ked*ttop,*q;ttop

25、=top->n ext; while(ttop!=NULL) q=ttop;ttop=ttop->n ext;delete q;/菜单函数/链表的插入函数链表的头结点的下个结点不为空时,开辟插入打印函数释放空间void menu( Head*Data) int n;cout«"请输入1、打印0、退出:"cin>>n;switch( n)/多分支选择语句case 1:Data->pri ntf();/输出链表节点break;case 0:break;coutvv"是否继续?如果继续请按1,退出请按0:"cin>

26、>n;if(n !=0)menu (Data);/递归调用/菜单函数1void me nu1(Head*Data) Man sger*M;/声明类指针Salema nsger*S;Tech nology*T;Salema n*S1;int n;coutvv"请输入1、经理2、销售经理3、技术人员4、销售员0、退出:"cin>>n;switch( n) case 1:M=new Man sger;/M->save(); /Data->I nsert(M);/break;构造对象指针储存对象数据将对象指针插入到链表中case 2:S=new Sal

27、ema nsger;/S->save();/Data->l nsert(S);/break;case 3:T=new Tech no logy;/T->save();/Data->I nsert(T);/break;case 4:S1= new Salema n;/S1->save();/Data->I nsert(S1);/break;case 0:break;coutvv"是否继续?如果继续请按cin>>n;if(n !=0)me nu1(Data);/构造对象指针储存对象数据将对象指针插入到链表中构造对象指针储存对象数据将对象指针

28、插入到链表中构造对象指针储存对象数据将对象指针插入到链表中1,退出请按0:"递归调用在类的成员函数实现过程中,派生类的成员函数调用了基类的构造函数,只 是整个调用过程中完全是由系统部完成。基类的保护数据成员,经过公有派生之 后,在派生类中是以保护成员的身份出现的, 派生类的成员函数可以自由地进行 访问。通过定义友元类访问类的保护成员, 并通过单链表法开辟输入空间以便插 入员工的信息。最后通过友元类的析构函数释放空间。4.3主函数设计/主函数void mai n() Head Data;/构造对象int n;while(1) cout«"请输入:1、输入2、打印0、

29、退出:";cin»n;switch( n)/多分支语句进行菜单的选择case 1:me nu1(& Data);break;case 2:menu(&Data);break;case 0:system("pause");return; system("cls");在程序的主函数部分,定义一个构造对象以便实现调用。Switch多分支选择语句可以选择菜单从而实现输入、打印操作。4.4基于控制台的应用程序测试程序运行结果如图2-1和2-2所示t:芹UEbngVh艷生.eera技术人员亀销售员薔箱入员工&名Ilansy

30、er 0X是否;艇貧如賈继倾请按-退出请按肌1衬入为工逸白输?V月萌门销善总额:?0000SLendtnsqei* 0H 是否:陋烈如冥继绫请按一 懐腿Ai、境里J销害證理3匸人兵的工作盯即100亠"7如負继续淸按匚邁出请榔汕丈销善经理3、技朮人员4.槌告员护理3.技术磁4.潴员输;峻癡.rechnologv OKLenan OK0.返出.1臥返岀:2臥退l岀:3缶 Mti; 4图2-1程序运行结果1匚"F八霁世芹MlebucXhS.Jae:2月月月翳 他出 月® 按115:3:3按 LnJ 1 等 L 1 |_ s i 2 3 1 按刃出9O0Q购4撓 请2,.

31、退:1:1:1阳土F 矣、号口岳方:1续 继X-丿编编编号室 踝/ 编嘿 戈、r玉堂蓉i I > 、湘屋美嘴斬 111W聲入九洙泊哪S 八b否各各各否.图2-2程序运行结果2为每类员工保存的文件夹如图 3-1所示的Mansger.txt、Salemansger.txt、Saleman.txt、Technology.txt文畔即 咛i卽 兰査世)mu)王員帕 曙幻團W7*丁曲让峙7 口I« HNhnwhsr i set"41二匸卩k片 3230110&4'11'|2122_Fli:m&it-=辽【;(ED血12WLL0M;=4苗E1 zr

32、 Dicit ±k:«111 3 ZJ UBIrzrrEft V? =a<lir bnr<dir tjt图3-1存盘文件夹为经理建立的文件夹打开后如图 3-2所示:图3-2显示经理文件夹为销售经理建立的文件夹打开后如图 3-3所示:图3-3显示销售经理文件夹为兼职技术人员建立的文件夹打开后如图3-4所示:为兼职推销员建立的文件夹打开后如图3-5所示:从图2-1到3-5可以看出,在DOS界面通过对菜单的选择可以输入和打印员 工的信息。经理只需要输入,销售经理要输入和当月的部门的销售总额,兼职技术人员要输入和工作时间,兼职推销员要输入和月销售额,然后选择打印菜单即

33、可输出各类人员的全部信息,而这些信息已经通过程序的文件输出流以 TXT的格 式保存在了电脑磁盘梁庶芹文件夹中。打开后便可显示各类员工的全部信息。5基于MFC的应用程序MFC是通过窗口和控件实现输入输出,设置 MFC界面也很重要,界面的美观 程度直接影响了程序设计的好坏。下面在MFC类的框架下加入上述类并实现人员 的信息管理,通过图形界面的输入和输出。5.1 基于MFC的应用程序设计5.1.1 MFC程序界面设计首先在VC中建立MFCAppWizard(exe)工程,名称为Isq,并在向导的Stepl中选择Dialog based,即建立基于对话框的应用程序,如下图 41和4-2所示。图 4-1

34、 建立 MFC AppWizard (exe)工程图4-2建立基于对话框的应用程序将对话框资源中的默认对话框利用工具箱改造成如下界面,如图4-3所示EditEdit技沐人员門工1E師EditSlit严级别一1fi祐1ELiEdit3LiEditBitElilUAEcit回瑋僅BaHi图4-3显示员工信息程序界面设计图4-3所示的界面中包含了 5个Group Box, 7个Static Text 控件,5个Button控件,和15个Edit Box控件,控件的基本信息列表如下表1所示。表1控件基本信息控件类别控件ID控件 Caption说明Group BoxIDC_STATIC职位见图6级别月薪

35、存盘StaticTextIDC STATIC经理见图6销售经理技术人员推销员销售总额工作时间销售额Bott onIDC_BUTTON1提交IDC_BUTTON2Man sgerIDC_BUTTON3Salema nsger见图6IDC_BUTTON4Tech no logyIDC_BUTTON5Salema nEdit BoxIDC_JL栏第一个EditIDC_XSJL栏第二个EditIDC_JSRY栏第三个EditIDC_TXY栏第四个EditIDC_DJ1级别栏第一个EditIDC_DJ2级别栏第二个EditIDC_DJ3级别栏第三个EditIDC_DJ4级别栏第四个EditIDC_YX1

36、月薪栏第一个EditIDC_YX1月薪栏第二个EditIDC_YX1月薪栏第三个EditIDC_YX1月薪栏第四个EditIDC_XSZE销售总额右边EditIDC_GZSJ工作时间右边EditIDC_XSE销售额右边Edit5.1.2 MFC程序代码设计为了能够将对话框界面上的控件能够与代码联系起来,需要为15个Edit Box 控件建立 Member Variables,按 Ctrl+w 键进入 MFC ClassWizard 界面,选择 Member Variables选项卡,可显示成员变量设置界面,如图 4-4和4-5所示。OC Class-Vizardf ? 11X |Message

37、 Member Variables | Automfttlon | ActiveX Lnti | Cltaa InraProjed;Chile jpmt;Add Chcfi. 1时二CLsgUIgAdd teMlB.HEAlsqUsqDIg.hp EsqUsqDIg.qpCudlrvl IDs:MemberIDC GZSJIntmIDC JLCStrlng ManagerUpdate golumne 1IDC.JSRY(Stringm TechiDlogyD:' .1 Pll1图4-4成员变量设置界面1图4-5成员变量设置界面 2通过该界面设置与15个Edit Box控件对应的成员变量

38、,具体Type与Member 请详见图4-4和4-5MFC编写代码也是非常重要的阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写如下。 各员工的直接在MFC界面的档中输入,等级和月薪直接赋值即可。 修改容包括:将显示员工信息的prin ft() 函数去掉,因为在图形界面的程序上已经 不需要连个函数承担输出功能了;将存盘函数save()去掉直接在MFC界面的存盘档位每类员工建立文件夹并保存,仍然使用文件输出流;菜单函数也不再需要,直接通过对按钮的选择进行输入输出和存盘操 作。具体代码如下:/为提交键编写的程序,用来实现信息的输出:void CLsqDlg:O

39、 nButto n1()UpdateData(TRUE);if(m_Ma nsger)/为经理的等级和月薪赋值mevel1=4;m_wages 仁8000;if(m_Salema nsger)/为销售经理的等级和月薪赋值m_level2=3; m_wages2=5000+m_sum2*0.005;if(m_Tech no logy)/为兼职技术人员的等级和月薪赋值mevel3=3;m_wages3=m_time*100;if(m_Salema n)/为兼职推销员的等级和月薪赋值m_level4=1;m_wages4=m_sum1*0.04;UpdateData(FALSE); /为经理建立文件

40、夹,将其信息保存在磁盘中void CLsqDlg:O nButto n2()ofstream fs("f:MFCMa nsger.txt");fs<v":"vvm_Mansgervv""<<"等级:"<<mevel1<<""<<"月薪:"<<m_wages1<<e ndl; 为销售经理建立文件夹,将其信息保存在磁盘中void CLsqDlg:O nButto n3()ofstream fs(&quo

41、t;f:MFCSalema nsger.txt");fs<v":"vvm_Salemansgervv" "<<" 等级:"<<mevel2<<" "<<" 月 薪:"vvm_wages2v<e ndl; 为兼职技术人员建立文件夹,将其信息保存在磁盘中void CLsqDlg:O nButto n4() ofstream fs("f:MFCTech nology.txt");fs<v":&qu

42、ot;vvm_Technologyvv" "<<" 等级:"<<mevel3<<" "<<" 月 薪:"vvm_wages3<ve ndl; 为兼职推销员建立文件夹,将其信息保存在磁盘中void CLsqDlg:O nButto n5() ofstream fs("f:MFCSalema n. txt");fs<v":"vvm_Saleman<<""<<"等级:"<<mevel4<<""<<"月薪:"vvm_wages4v<e ndl;5.2基于MFC的应用程序测试运行程序后,首先出现的界面如图 5-1所示图5-1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论