还剩23页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
封皮(按学校要求手工填写)课程设计任务书学院信息科学与工程学院专业通信工程学生姓名张昊学号1203060417设计题目小型人员信息管理系统的设计与实现内容及要求.小型人员信息管理系统的设计与实现某小型公司主要有四类人员经理、兼职技术人员、销售经理和兼职推销员现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息人员编号基数为1000,每输入一个人员信息编号顺序加1程序要有对所有人员提升级别的功能本例中为简单起见,所有人员的初始级别均为1级,然后进行升级,经理升为4级,兼职技术人员和销售经理升为3级,推销员认为1级月薪计算办法是经理拿固定月薪8000元;兼职技术人员按每小时100元领取月薪;兼职推销员的月薪按该推销员当月销售额的4%提成;销售经理即拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的千分之五要求为每一类人员单独建立文件,并在每个文件中手工录入一些人员基本信息,并根据这些基本信息计算职工的月薪,并将计算结果保存入相应的磁盘文件中要求编写程序实现上述功能,并且可以通过实例演示上述功能进度安排第17周分析题目,查阅课题相关资料,进行类设计、算法设计;第18周程序的设计、调试与实现;第19周程序测试与分析,撰写课程设计报告,进行答辩验收指导教师(签字)年月日学院院长(签字)年月日1需求分析-1-2算法基本原理-1-3类设计-2-4详细设计-3-
4.1类的接口设计-3-
4.2类的实现-5-
4.3主函数设计-10-5DOS界面程序运行结果及分析-11-
5.1程序运行结果-11-
5.2运行结果分析-12-6基于MFC的图形界面程序开发-13-
6.1基于MFC的图形界面程序设计-13-
6.2程序测试-17-
6.3MFC程序编写总结-19-7参考文献··························································-19-1需求分析
(1)对小型公司做一个小型人员信息管理系统该公司主要有四类人员经理、兼职技术人员、销售经理和兼职推销员
(2)该管理系统需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息
(3)该系统具体要求人员编号基数为1000,每输入一个人员信息编号顺序加1;对所有人员提升级别,所有人员的初始级别均为1级,然后进行升级,经理升为4级,兼职技术人员和销售经理升为3级,推销员认为1级;经理拿固定月薪8000元;兼职技术人员按每小时100元领取月薪;兼职推销员的月薪按该推销员当月销售额的4%提成;销售经理即拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的千分之五;要求为每一类人员单独建立文件,并在每个文件中手工录入一些人员基本信息,并根据这些基本信息计算职工的月薪,并将计算结果保存入相应的磁盘文件中2算法基本原理
1、定义一个员工虚基类Employee()包含姓名、编号、级别、当月薪水四个共有属性的数据成员;并在该虚基类基础上派生出经理Mansger()、兼职技术人员Technology()、销售经理Salemansger()和兼职推销员Salesman()四类派生类四种派生类分别实现各自的的员工升级、编号,添加各自特有的数据成员并计算出各自的月薪
(1)员工等级直接按照要求赋值即可;
(2)在积累中定义静态数据成员staticintcount,并初始化intEmployee::count=1000,并在基类构造函数中实现编号的赋值++count;num=count;
(3)派生类调用构造函数时对数据成员进行赋值,并对各种派生类输入各自的用于计算月薪的数据成员,并按照要求计算各自的月薪
2、定义一个结构体链表structLinked,并将该链表头指针封装在友元类Head()中
3、运行时构造对象指针,并存在链表中,讲链表的头指针封装在一个友元类中利用类中的成员函数来实行对链表节点的打印、添加、删除以及查询这里所以的操作均为数据结构中对单链表的操作3类设计首先定义一个员工类Employee作为基类,由于要派生多个派生类,所以将其定义成虚基类;然后由基类派生出四种派生类,分别是Mansger,Technology,Salemansger和Salesman定义一个结构体链表Linked用来存放生成的对象指针,并将头指针封装存放在友元类Head中基类Employee中的数据成员姓名、编号、等级、月薪以及一个静态变量,静态变量用来为员工自动赋值编号,在基类构造函数中输入员工姓名,并将编号和等级自动赋值派生类Mansger中无需添加新成员,在派生类Technology中添加工作时间,在Salemansger中添加部门月销售额,在Salesman添加月销售额派生类的功能有输出函数print(),储存函数save();友元类Head中存放的数据成员有Linked*top,功能有构造函数Head(),插入函数Insert(),查询函数Check(),删除函数Delete(),输出函数print()基类与各派生类之间的关系如图Employee#name
[20]:char#num:int#rank:int#wages:float#count:int=1000+Employee+print:voidSalesman#name
[20]:char#num:int#rank:int#wages:float+Employee+print:void-sum1:int+Salesman+print:void+save:voidSalemansger#name
[20]:char#num:int#rank:int#wages:float+Employee+print:void-sum:int+Salemansger+print:void+save:voidTechnology#name
[20]:char#num:int#rank:int#wages:float+Employee+print:void-time:int+Technology+print:void+save:voidMansger#name
[20]:char#num:int#rank:int#wages:float+Employee+print:void+Mansger+print:void+save:voidHead-top:struct*+InsertEmployee*temp+Check:void+Delete:void+print:void4详细设计整个程序分为三部分,各种职员的类,结构体链表以及封装链表的类实现时先生成各职员的对象指针,之后将生成的对象指针插入到链表中,最后通过封装类的成员函数对链表节点进行操作,最后实现对各员工的操作
4.1类的接口设计#includeiostream#includestring.h#includefstreamusingnamespacestd;classEmployee//基类Employee声明{protected://数据成员charname
[20];//员工姓名intnum;//员工编号intrank;//员工登记floatwages;//员工月薪staticintcount;//静态变量public://外部接口Employee;//构造函数voidprint;//输出函数friendclassHead;//声明友元类};classMansger:virtualpublicEmployee//派生类Mansger声明{public:Mansger:Employee;//构造函数voidprint;//输出函数voidsave;//储存函数friendclassHead;};classSalemansger:virtualpublicEmployee//派生类Salemansger声明{protected:intsum;//部门销售额public:Salemansger:Employee;//构造函数voidprint;//输出函数voidsave;//储存函数friendclassHead;}classTechnology:virtualpublicEmployee//派生类Technology声明{protected:inttime;//工作时间public:Technology:Employee;//构造函数voidprint;//输出函数voidsave;//储存函数friendclassHead;};classSalesman:virtualpublicEmployee//派生类Salesman声明{protected:intsum1;//个人销售额public:Salesman:Employee;//构造函数voidprint;//输出函数voidsave;//储存函数friendclassHead;;};structLinked//定义单链表{Employee*p;Linked*next;};classHead//友元类Head声明{public:Head;//构造函数voidInsertEmployee*temp;//单链表插入函数voidCheck;//查找函数voidDelete;//删除函数voidprint;//输出函数~Head;//析构函数private:Linked*top;//单链表头指针};
4.2类的实现Employee//基类的实现Employee::Employee//基类的构造函数{cout输入姓名:;cinname;++count;num=count;rank=1;}//基类成员赋值voidEmployee::print//输出类数据成员{cout编号num姓名name等级rank月薪wagesendl;}Mansger//派生类的实现Mansger::Mansger:Employee//派生类构造函数{rank=4;wages=8000;}voidMansger::print//输出函数{cout编号num姓名name等级rank月薪wagesendl;}voidMansger::save//储存函数{ofstreamfsd:\\Mansger.txt;fswages;coutMansgerOKendl;}Salemansger//派生类的实现Salemansger::Salemansger:Employee//派生类构造函数{rank=3;cout输入部门销售总额;cinsum;wages=
0.005*sum;}voidSalemansger::print//输出函数{cout编号num姓名name等级rank月薪wagesendl;}voidSalemansger::save//储存函数{ofstreamfsd:\\Salemansger.txt;fswages;coutSalemansgerOKendl;}Technology//派生类的实现Technology::Technology:Employee//派生类的构造函数{rank=3;cout输入工作时间;cintime;wages=100*time;}voidTechnology::print//输出函数{cout编号num姓名name等级rank月薪wagesendl;}voidTechnology::save//储存函数{ofstreamfsd:\\Technology.txt;fswages;coutTechnologyOKendl;}Salesman//派生类的实现Salesman::Salesman:Employee//派生类的构造函数{cout输入月销售额;cinsum1;wages=
0.04*sum1;}voidSalesman::print//派生类的输出函数{cout编号num姓名name等级rank月薪wagesendl;}voidSalesman::save//储存函数{ofstreamfsd:\\Salesman.txt;fswages;coutSalesmanOKendl;}Head//友元类得实现Head::Head//友元类的构造函数{iftop=newLinked==NULLexit-1;top-next=NULL;}voidHead::InsertEmployee*temp//链表的插入函数{Linked*ttop=top;whilettop-nextttop=ttop-next;ttop-next=newLinked;ttop-next-p=temp;ttop-next-next=0;}voidHead::Check//链表的查找函数{chars
[20];cout输入要查找人的姓名:;cins;Linked*pbuf=top-next;whilepbuf!=NULL{ifstrcmppbuf-p-names!=0pbuf=pbuf-next;elseifstrcmppbuf-p-names==0{cout编号pbuf-p-num姓名pbuf-p-name等级pbuf-p-rank月薪pbuf-p-wagesendl;pbuf=pbuf-next;continue;}elsecout查无此人endl;}}voidHead::Delete//链表的删除函数{inta;cout输入要删除人的编号:;cina;Linked*pbuf=top*q;whilepbuf-next!=NULLifa!=pbuf-next-p-numpbuf=pbuf-next;elseifa==pbuf-next-p-num{q=pbuf-next;pbuf-next=pbuf-next-next;deleteq;cout删除成功endl;}elsecout查无此人endl;}voidHead::print//链表的输出{Linked*pbuf=top-next;whilepbuf!=NULL{pbuf-p-print;pbuf=pbuf-next;}}Head::~Head//友元类的析构函数{Linked*ttop*q;ttop=top-next;whilettop!=NULL{q=ttop;ttop=ttop-next;deleteq;}}voidmnueHead*Data//菜单函数{intn;cout请输入
1、查找
2、删除
3、打印
0、退出\n;cinn;switchn{case1:Data-Check;//查找链表节点break;case2:Data-Delete;//删除链表节点break;case3:Data-print;//输出链表节点break;case0:break;}cout是否继续继续请按1/退出请按0;cinn;ifn!=0mnueData;}voidmenuHead*Data//菜单函数{Mansger*M;Salemansger*S;Technology*T;Salesman*SA;//声明类指针intn;cout请输入
1、经理
2、销售经理
3、技术员
4、销售员
0、退出\n;cinn;switchn{case1:M=newMansger;//构造对象指针M-save;//储存对象数据Data-InsertM;//将对象指针插入到链表中break;case2:S=newSalemansger;//构造对象指针S-save;//储存对象数据Data-InsertS;//将对象指针插入到链表中break;case3:T=newTechnology;//构造对象指针T-save;//储存对象数据Data-InsertT;//将对象指针插入到链表中break;case4:SA=newSalesman;//构造对象指针SA-save;//储存对象数据Data-InsertSA;//将对象指针插入到链表中break;case0:break;}cout是否继续继续请按1/退出请按0;cinn;ifn!=0menuData;//递归调用}在类的成员函数实现过程中,派生类的构造函数使用参数调用了基类的构造函数在类外定义成对象指针,并用new生成动态内存空间来储存,并将其插入到链表中并进行封装通过封装类对链表的操作从而调用各员工类中的成员函数对各员工类进行题目所需功能的操作
4.3主函数设计voidmain//主函数{HeadData;//构造对象intn;while1{cout请输入(
1、输入
2、其他操作
0、退出)\n;cinn;switchn{case1:menuData;//菜单函数1break;case2:mnueData;//菜单函数2break;case0:systempause;return;}}systemcls;}5DOS界面程序运行结果及分析
5.1程序运行结果对员工类进行输入操作实现查找、删除以及输出功能
5.2运行结果分析整个程序是采用单链表的形式来储存对象指针,合理的利用的内存资源为了通过封装链表的类对各员工类里的成员函数进行调用,再次将该类声明成友元类类的外部为对象指针申请动态的储存空间,并将其插入到单链表中,通过头结点对各个节点进行访问操作最后执行析构函数的时候讲点链表的节点一个一个释放掉利用MFCAppWizard创建一个基于对话框的MFC应用程序该程序使用链表类,对公司的员工信息进行输入、删除、存盘以及读取的功能6基于MFC的图形界面程序开发MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与DOS界面程序的主要不同点是MFC图形界面程序与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面采用标准Windows窗口和控件实现输入输出,因此必须在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成
6.1基于MFC的图形界面程序设计
(1)界面设计首先在VC中建立MFCAppWizardexe工程,名称为GuassLineGUI,并在向导的Step1中选择Dialogbased,即建立基于对话框的应用程序,如下图4~5所示将对话框资源中的默认对话框利用工具箱改造成如下界面,如图所示
6.2详细设计本程序链表类对象为一结构体CFund,它记录了姓名,编号,等级,月薪等所有员工的信息structCFund{CStringm_name;//姓名CStringm_rank;//等级floatwages;//月薪floatincome;//用于计算月薪的变量};声明一个CPtrList型的链表类m_fundlistpublic:Ch8Demo2DlgCWnd*pParent=NULL;//standardconstructorCPtrListm_fundlist;为对话框类添加一个成员函数Resfiesh,将链表对象中的数据在列表框显示voidCh8Demo2Dlg::Reflesh{CStringstrstr1;m_cTheList.ResetContent;//清空列表框if!m_fundlist.IsEmpty//链表不为空{POSITIONpos=m_fundlist.GetHeadPosition;//获取链表头的位置forinti=0;im_fundlist.GetCount;i++//遍历链表{CFund*m_pFund=CFund*m_fundlist.GetNextpos;str
1.Format%fm_pFund-income;//格式化月薪str=姓名+m_pFund-m_name+等级+m_pFund-m_rank+薪水+str1;m_cTheList.AddStringstr;//添加列表框数据}}UpdateDatafalse;//更新总量编辑框}对列表框类进行输入删除的操作代码如下:voidCh8Demo2Dlg::OnCheck{UpdateDataTRUE;//获得编辑框数据CFund*m_pFund=newCFund;//创建结构体对象指针switchm_radio{case0://插入操作ifm_name.IsEmpty{AfxMessageBox用户输入不正确;return;}m_pFund-m_name=m_name;m_pFund-m_rank=4;//m_pFund-wages=m_wages;m_pFund-income=8000;m_fundlist.AddTailm_pFund;m_name=;m_wages=0;UpdateDatafalse;Reflesh;break;case1://插入操作ifm_name.IsEmpty{AfxMessageBox用户输入不正确;return;}m_pFund-m_name=m_name;m_pFund-m_rank=3;m_pFund-wages=m_wages;m_pFund-income=m_wages*100;m_fundlist.AddTailm_pFund;m_name=;m_wages=0;UpdateDatafalse;Reflesh;break;case2://插入操作ifm_name.IsEmpty{AfxMessageBox用户输入不正确;return;}m_pFund-m_name=m_name;m_pFund-m_rank=3;m_pFund-wages=m_wages;m_pFund-income=5000+m_wages*
0.005;m_fundlist.AddTailm_pFund;m_name=;m_wages=0;UpdateDatafalse;Reflesh;break;case3://插入操作ifm_name.IsEmpty{AfxMessageBox用户输入不正确;return;}m_pFund-m_name=m_name;m_pFund-m_rank=1;m_pFund-wages=m_wages;m_pFund-income=m_wages*
0.04;m_fundlist.AddTailm_pFund;m_name=;m_wages=0;UpdateDatafalse;Reflesh;break;case4://去除表头操作ifm_fundlist.GetCount{m_fundlist.RemoveHead;}m_name=;m_wages=0;UpdateDatafalse;Reflesh;break;case5://去除表尾操作ifm_fundlist.GetCount{m_fundlist.RemoveTail;}m_name=;m_wages=0;UpdateDatafalse;Reflesh;break;}}为更方便使用在操作单选按钮是设置了一下响应函数:voidCh8Demo2Dlg::OnRadio1//单选按钮的响应函数{UpdateDataTRUE;switchm_radio{case0:m_temp=nothing;break;case1:m_temp=工作时间;break;case2:m_temp=部门销售额;break;case3:m_temp=销售额;break;case4:m_temp=nothing;break;case5:m_temp=nothing;break;}UpdateDatafalse;}存盘操作函数:voidCh8Demo2Dlg::OnButton2{charszName
[40];CStringstrFilterstrFileNamestrText;strFilter=BOOKINFOFiles*.*|*.*||;CFileDialogdlgFALSENULLNULLOFN_EXPLORER|OFN_HIDEREADONLY|OFN_ENABLESIZING|OFN_FILEMUSTEXISTstrFilter;ifdlg.DoModal==IDOK//显示保存文件对话框{strFileName=dlg.GetPathName;//获取文件名CFilem_filestrFileNameCFile::modeCreate|CFile::modeWrite;ifm_fundlist.GetCount==0{AfxMessageBox数据为空!;return;}forinti=0;im_fundlist.GetCount;i++{m_cTheList.GetTextistrText;//获取列表框数据strcpyszNamestrText;m_file.WriteszNamesizeofszName;//写文件数据}m_file.Close;//关闭文件对象}}读取函数:voidCh8Demo2Dlg::OnButton3{charszName
[40];//记录从文件读取的数据CStringstrFilterstrFileNamestrText;strFilter=BOOKINFOFiles*.*|*.*||;CFileDialogdlgFALSENULLNULLOFN_EXPLORER|OFN_HIDEREADONLY|OFN_ENABLESIZING|OFN_FILEMUSTEXISTstrFilter;ifdlg.DoModal==IDOK//显示打开文件对话框{intnvalue=MessageBox现有数据如果没有保存将丢失,是否继续?提示4+32+256;ifnvalue==6//用户按下了”是”按钮{m_cTheList.ResetContent;//清空列表框CStringfileName=dlg.GetPathName;CFilem_filefileNameCFile::modeRead;inti=0;m_file.SeekToBegin;whilem_file.ReadszNamesizeofszName!=0//读出数据不为空{m_cTheList.AddStringCStringszName;}m_file.Close;//关闭文件}else{return;}}}运行结果与分析输入操作:删除操作:存盘操作:读取操作:
6.3MFC程序编写总结MFC程序与DOS界面程序编写的最大不同是程序员需要将编程精力放在图形界面设计、图形界面输入输出以及界面元素和代码对应转换等问题上,而这些问题在DOS界面程序中是不存在的,因此,初学MFC的编程者会对此感到困难,然而,当你编写出一个基于Windows界面的程序时,所获得的满足程度远远大于简单的DOS界面程序,况且基于Windows的图形界面的程序设计已成为主流,作为程序员而言,是非学会不可的本次课程设计作为编写Windows程序的初步尝试,能够实现程序的主要功能,可以说是取得了成功,然而好的程序绝不仅仅是只有功能性这一个指标,本此编写的MFC程序虽然能实现所需功能,但从面向对象程序设计理念和图形界面设计要求来说,尚存在不足7参考文献
[1]徐士良.C常用算法程序集.北京:清华大学出版社1995
[2]郑莉董渊张瑞丰.C++语言程序设计第3版.北京:清华大学出版社2007
[3]钱能.C++程序设计教程第二版.北京:清华大学出版社2007
[4]陈志泊王春玲.面向对象的程序设计语言—C++.北京:人民邮电出版社2002
[5]李庆扬王能超易大义.数值分析.湖北:华中理工大学出版社1986。