课程设计小型人员信息管理系统的设计与实现_第1页
课程设计小型人员信息管理系统的设计与实现_第2页
课程设计小型人员信息管理系统的设计与实现_第3页
课程设计小型人员信息管理系统的设计与实现_第4页
课程设计小型人员信息管理系统的设计与实现_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、封封 皮皮 (按学校要求手工填写)(按学校要求手工填写) 课 程 设 计 任 务 书 学院学院信息科学与工程学院信息科学与工程学院专业专业通信工程通信工程 学生姓名学生姓名张昊张昊学号学号 设计题目设计题目小型人员信息管理系统的设计与实现 内容及要求: 小型人员信息管理系统的设计与实现 某小型公司主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在, 需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。 人员编号基数为 1000,每输入一个人员信息编号顺序加 1。 程序要有对所有人员提升级别的功能。本例中为简单起见,所有人员的初始级别均为 1 级,然后进行升级,

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

3、; 第 18 周:程序的设计、调试与实现; 第 19 周:程序测试与分析,撰写课程设计报告,进行答辩验收 指导教师(签字):指导教师(签字): 年年 月月 日日 学院院长(签字)学院院长(签字) 年年 月月 日日 1 需求分析 .- 1 - 2 算法基本原理 .- 1 - 3 类设计 .- 2 - 4 详细设计 .- 3 - 4.1 类的接口设计 .- 3 - 4.2 类的实现 .- 5 - 4.3 主函数设计 .- 10 - 5 DOS 界面程序运行结果及分析 .- 11 - 5.1 程序运行结果 .- 11 - 5.2 运行结果分析.- 12 - 6 基于 MFC 的图形界面程序开发.-

4、13 - 6.1 基于 MFC 的图形界面程序设计.- 13 - 6.2 程序测试 .- 17 - 6.3 MFC 程序编写总结.- 19 - 7 参考文献 - 19 - 1 需求分析需求分析 (1)对小型公司做一个小型人员信息管理系统。该公司主要有四类人员:经理、 兼职技术人员、销售经理和兼职推销员。 (2)该管理系统需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪 总额并显示全部信息。 (3)该系统具体要求:人员编号基数为 1000,每输入一个人员信息编号顺序 加 1;对所有人员提升级别,所有人员的初始级别均为 1 级,然后进行升 级,经理升为 4 级,兼职技术人员和销售经理升为 3

5、 级,推销员认为 1 级; 经理拿固定月薪 8000 元;兼职技术人员按每小时 100 元领取月薪;兼职 推销员的月薪按该推销员当月销售额的 4提成;销售经理即拿固定月薪 也领取销售提成,固定月薪为 5000 元,销售提成为所管辖部门当月销售 总额的千分之五;要求为每一类人员单独建立文件,并在每个文件中手工 录入一些人员基本信息,并根据这些基本信息计算职工的月薪,并将计算 结果保存入相应的磁盘文件中。 2 算法基本原理算法基本原理 1、 定义一个员工虚基类 Employee()包含姓名、编号、级别、当月薪水四 个共有属性的数据成员;并在该虚基类基础上派生出经理 Mansger() 、 兼职技术

6、人员 Technology() 、销售经理 Salemansger()和兼职推销员 Salesman()四类派生类。四种派生类分别实现各自的的员工升级、编号, 添加各自特有的数据成员并计算出各自的月薪。 (1)员工等级直接按照要求赋值即可; (2) 在积累中定义静态数据成员 static int count,并初始化 int Employee:count=1000, 并在基类构造函数中实现编号的赋值 +count; num=count; (3)派生类调用构造函数时对数据成员进行赋值,并对各种派生类输入 各自的用于计算月薪的数据成员,并按照要求计算各自的月薪。 2、 定义一个结构体链表 stru

7、ct Linked,并将该链表头指针封装在友元类 Head()中。 3、 运行时构造对象指针,并存在链表中,讲链表的头指针封装在一个友元类中。利用类 中的成员函数来实行对链表节点的打印、添加、删除以及查询。这里所以的操作均为数据 结构中对单链表的操作。 3 类设计类设计 首先定义一个员工类 Employee 作为基类,由于要派生多个派生类,所以将 其定义成虚基类;然后由基类派生出四种派生类,分别是 Mansger,Technology,Salemansger 和 Salesman。 定义一个结构体链表 Linked 用来存放生成的对象指针,并将头指针封装存放在 友元类 Head 中。 基类 E

8、mployee 中的数据成员姓名、编号、等级、月薪以及一个静态变量, 静态变量用来为员工自动赋值编号,在基类构造函数中输入员工姓名,并将编 号和等级自动赋值。 派生类 Mansger 中无需添加新成员,在派生类 Technology 中添加工作时间, 在 Salemansger 中添加部门月销售额,在 Salesman 添加月销售额。派生类的功 能有输出函数 print() ,储存函数 save() ; 友元类 Head 中存放的数据成员有 Linked *top,功能有构造函数 Head() , 插入函数 Insert() ,查询函数 Check() ,删除函数 Delete() ,输出函数

9、 print() 。 基类与各派生类之间的关系如图: Mansger # name20: char # num: int # rank: int #wages: float +Employee() +print(): void + Mansger () +print(): void +save(): void Employee # name20: char # num: int # rank: int #wages: float #count: int=1000 +Employee() +print(): void Salesman # name20: char # num: int # ra

10、nk: int #wages: float +Employee() +print(): void -sum1 :int +Salesman () +print(): void +save(): void Salemansger # name20: char # num: int # rank: int #wages: float +Employee() +print(): void -sum :int +Salemansger() +print(): void +save(): void Technology # name20: char # num: int # rank: int #wag

11、es: float +Employee() +print(): void -time :int +Technology() +print(): void +save(): void Head -top: struct* +Insert(Employee *temp) 4 详细设计详细设计 整个程序分为三部分,各种职员的类,结构体链表以及封装链表的类。实 现时先生成各职员的对象指针,之后将生成的对象指针插入到链表中,最后通 过封装类的成员函数对链表节点进行操作,最后实现对各员工的操作。 4.1 类的接口设计 #include #include #include using namespace s

12、td; class Employee /基类 Employee 声明 protected: /数据成员 char name20; /员工姓名 int num; /员工编号 int rank; /员工登记 float wages; /员工月薪 static int count; /静态变量 public: /外部接口 Employee(); /构造函数 void print(); /输出函数 friend class Head; /声明友元类 ; class Mansger:virtual public Employee /派生类 Mansger 声明 public: Mansger():Emp

13、loyee(); /构造函数 void print(); /输出函数 void save(); /储存函数 friend class Head; ; +Check(): void +Delete():void +print():void class Salemansger:virtual public Employee /派生类 Salemansger 声明 protected: int sum; /部门销售额 public: Salemansger():Employee(); /构造函数 void print(); /输出函数 void save(); /储存函数 friend class

14、Head; class Technology:virtual public Employee /派生类 Technology 声明 protected: int time; /工作时间 public: Technology():Employee(); /构造函数 void print(); /输出函数 void save(); /储存函数 friend class Head; ; class Salesman:virtual public Employee /派生类 Salesman 声明 protected: int sum1; /个人销售额 public: Salesman():Emplo

15、yee(); /构造函数 void print(); /输出函数 void save(); /储存函数 friend class Head; ; struct Linked /定义单链表 Employee *p; Linked *next; ; class Head /友元类 Head 声明 public: Head(); /构造函数 void Insert(Employee *temp); /单链表插入函数 void Check(); /查找函数 void Delete(); /删除函数 void print(); /输出函数 Head(); /析构函数 private: Linked *t

16、op; /单链表头指针 ; 4.2 类的实现 Employee /基类的实现 Employee :Employee() /基类的构造函数 coutname; +count; num=count; rank=1; /基类成员赋值 void Employee: print() /输出类数据成员 cout编号num 姓名name 等级rank 月薪wagesendl; Mansger /派生类的实现 Mansger :Mansger():Employee() /派生类构造函数 rank=4; wages=8000; void Mansger: print() /输出函数 cout编号num 姓名na

17、me 等级rank 月薪wagesendl; void Mansger :save() /储存函数 ofstream fs(d:Mansger.txt); fswages; coutMansger OKendl; Salemansger /派生类的实现 Salemansger:Salemansger():Employee() /派生类构造函数 rank=3; coutsum; wages=0.005*sum; void Salemansger:print() /输出函数 cout编号num 姓名name 等级rank 月薪wagesendl; void Salemansger:save() /

18、储存函数 ofstream fs(d:Salemansger.txt); fswages; coutSalemansger OKendl; Technology /派生类的实现 Technology:Technology():Employee() /派生类的构造函数 rank=3; couttime; wages=100*time; void Technology:print() /输出函数 cout编号num 姓名name 等级rank 月薪wagesendl; void Technology:save() /储存函数 ofstream fs(d:Technology.txt); fswag

19、es; coutTechnology OKendl; Salesman /派生类的实现 Salesman :Salesman():Employee() /派生类的构造函数 coutsum1; wages=0.04*sum1; void Salesman:print() /派生类的输出函数 cout编号num 姓名name 等级rank 月薪wagesendl; void Salesman:save() /储存函数 ofstream fs(d:Salesman.txt); fswages; coutSalesman OKnext=NULL; void Head:Insert(Employee *

20、temp) /链表的插入函数 Linked *ttop = top; while(ttop-next) ttop = ttop-next; ttop-next = new Linked; ttop-next-p = temp; ttop-next-next = 0; void Head:Check() /链表的查找函数 char s20; couts; Linked *pbuf = top-next; while(pbuf!=NULL) if(strcmp(pbuf-p-name,s)!=0) pbuf=pbuf-next; else if(strcmp(pbuf-p-name,s)=0) c

21、out编号p-num 姓名p- name 等级p-rank 月薪p-wagesnext; continue; else cout查无此人endl; void Head:Delete() /链表的删除函数 int a; couta; Linked *pbuf = top,*q; while(pbuf-next!=NULL) if(a!=pbuf-next-p-num) pbuf=pbuf-next; else if(a=pbuf-next-p-num) q=pbuf-next; pbuf-next=pbuf-next-next; delete q; cout删除成功endl; else cout

22、查无此人next; while(pbuf!=NULL) pbuf-p-print(); pbuf=pbuf-next; Head:Head() /友元类的析构函数 Linked *ttop,*q; ttop = top-next; while(ttop!=NULL) q=ttop; ttop = ttop-next; delete q; void mnue(Head *Data) /菜单函数 int n; coutn; switch(n) case 1: Data-Check(); /查找链表节点 break; case 2: Data-Delete(); /删除链表节点 break; cas

23、e 3: Data-print(); /输出链表节点 break; case 0: break; coutn; if(n!=0) mnue(Data); void menu(Head *Data) /菜单函数 Mansger *M; Salemansger *S; Technology *T; Salesman *SA; /声明类指针 int n; coutn; switch(n) case 1: M=new Mansger; /构造对象指针 M-save(); /储存对象数据 Data-Insert(M); /将对象指针插入到链表中 break; case 2: S=new Salemans

24、ger; /构造对象指针 S-save(); /储存对象数据 Data-Insert(S); /将对象指针插入到链表中 break; case 3: T=new Technology; /构造对象指针 T-save(); /储存对象数据 Data-Insert(T); /将对象指针插入到链表中 break; case 4: SA=new Salesman; /构造对象指针 SA-save(); /储存对象数据 Data-Insert(SA); /将对象指针插入到链表中 break; case 0: break; coutn; if(n!=0) menu(Data); /递归调用 在类的成员函数

25、实现过程中,派生类的构造函数使用参数调用了基类的构 造函数。在类外定义成对象指针,并用 new 生成动态内存空间来储存,并将其 插入到链表中并进行封装。通过封装类对链表的操作从而调用各员工类中的成 员函数对各员工类进行题目所需功能的操作。 4.3 主函数设计 void main() /主函数 Head Data; /构造对象 int n; while(1) coutn; switch(n) case 1: menu( /菜单函数 1 break; case 2: mnue( /菜单函数 2 break; case 0: system(pause); return; system(cls); 5

26、 DOS 界面程序运行结果及分析界面程序运行结果及分析 5.1 程序运行结果 对员工类进行输入操作 实现查找、删除以及输出功能 5.2 运行结果分析 整个程序是采用单链表的形式来储存对象指针,合理的利用的内存资源。 为了通过封装链表的类对各员工类里的成员函数进行调用,再次将该类声 明成友元类。类的外部为对象指针申请动态的储存空间,并将其插入到单链表 中,通过头结点对各个节点进行访问操作。 最后执行析构函数的时候讲点链表的节点一个一个释放掉。 利用 MFC AppWizard 创建一个基于对话框的 MFC 应用程序。 该程序使用链表类,对公司的员工信息进行输入、删除、存盘以及读取的功能 6 基于

27、基于 MFC 的图形界面程序开发的图形界面程序开发 MFC 的图形界面程序设计可在上述类设计的基础上进行改造,MFC 的图 形界面程序与 DOS 界面程序的主要不同点是:MFC 图形界面程序与 DOS 界面 程序的输入输出方式不同,DOS 界面程序采用字符交互式实现数据输入输出, 主要通过 cin,cout 等 I/O 流实现,而 MFC 的图形程序界面采用标准 Windows 窗口和控件实现输入输出,因此必须在 MFC 类的框架下加入上面所设计的矩 阵和方程组类,并通过图形界面的输入输出改造来完成。 6.1 基于 MFC 的图形界面程序设计 (1)界面设计)界面设计 首先在 VC 中建立 M

28、FC AppWizard(exe)工程,名称为 GuassLineGUI,并在 向导的 Step1 中选择 Dialog based,即建立基于对话框的应用程序,如下图 45 所示。 将对话框资源中的默认对话框利用工具箱改造成如下界面,如图所示。 6.2 详细设计详细设计 本程序链表类对象为一结构体 CFund,它记录了姓名,编号,等级,月薪 等所有员工的信息。 struct CFund CString m_name; /姓名 CString m_rank; /等级 float wages; /月薪 float income; /用于计算月薪的变量 ; 声明一个 CPtrList 型的链表类

29、m_fundlist。 public: Ch8Demo2Dlg(CWnd* pParent = NULL); / standard constructor CPtrList m_fundlist; 为对话框类添加一个成员函数 Resfiesh,将链表对象中的数据在列表框显 示。 void Ch8Demo2Dlg:Reflesh() CString str,str1; m_cTheList.ResetContent (); /清空列表框 if(!m_fundlist.IsEmpty() /链表不为空 POSITION pos=m_fundlist.GetHeadPosition(); /获取链表

30、头的位置 for(int i=0;iincome); /格式化月薪 str=姓名:+m_pFund-m_name+ 等级:+m_pFund- m_rank+ 薪水:+str1; m_cTheList.AddString(str); /添加列表框数据 UpdateData(false); /更新总量编辑框 对列表框类进行输入,删除的操作代码如下: void Ch8Demo2Dlg:OnCheck() UpdateData(TRUE); /获得编辑框数据 CFund *m_pFund=new CFund; /创建结构体对象指针 switch(m_radio) case 0: /插入操作 if(m_

31、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.AddTail(m_pFund); m_name= ; m_wages=0; UpdateData(false); Reflesh(); break; case 1: /插入操作 if(m_name.IsEmpty() AfxMessageBox(用户输入不正确); return; m_pFund-m_name

32、=m_name; m_pFund-m_rank=3; m_pFund-wages=m_wages; m_pFund-income=m_wages*100; m_fundlist.AddTail(m_pFund); m_name= ; m_wages=0; UpdateData(false); Reflesh(); break; case 2: /插入操作 if(m_name.IsEmpty() AfxMessageBox(用户输入不正确); return; m_pFund-m_name=m_name; m_pFund-m_rank=3; m_pFund-wages=m_wages; m_pFu

33、nd-income=5000+m_wages*0.005; m_fundlist.AddTail(m_pFund); m_name= ; m_wages=0; UpdateData(false); Reflesh(); break; case 3: /插入操作 if(m_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.AddTail(m_pFu

34、nd); m_name= ; m_wages=0; UpdateData(false); Reflesh(); break; case 4: /去除表头操作 if(m_fundlist.GetCount() m_fundlist.RemoveHead(); m_name= ; m_wages=0; UpdateData(false); Reflesh(); break; case 5: /去除表尾操作 if(m_fundlist.GetCount() m_fundlist.RemoveTail(); m_name= ; m_wages=0; UpdateData(false); Reflesh

35、(); break; 为更方便使用,在操作单选按钮是设置了一下响应函数: void Ch8Demo2Dlg:OnRadio1() /单选按钮的响应函数 UpdateData(TRUE); switch(m_radio) case 0: m_temp=nothing; break; case 1: m_temp=工作时间; break; case 2: m_temp=部门销售额; break; case 3: m_temp=销售额; break; case 4: m_temp=nothing; break; case 5: m_temp=nothing; break; UpdateData(fa

36、lse); 存盘操作函数: void Ch8Demo2Dlg:OnButton2() char szName40; CString strFilter,strFileName,strText; strFilter=BOOKINFO Files(*.*)|*.*|; CFileDialog dlg(FALSE,NULL,NULL,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_ENAB LESIZING|OFN_FILEMUSTEXIST,strFilter); if(dlg.DoModal()=IDOK) /显示保存 文件对话框 strFileName=dlg.GetPathName(); /获取文件 名 CFile m_file(strFileName,CFile:modeCreate|CFile:modeWrite); if(m_fundlist.GetCount()=0) AfxMessageBox(数据为空!); return; for(int i=0;im_fundlist.GetCount();i+) m_cTheList.GetText(i,strText); /获取列表 框数据 strcpy(sz

温馨提示

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

评论

0/150

提交评论