
《面向对象程序设计》课程设计报告
设计题目:公司人员管理系统
学 院:信息学 院
专 业:电子信息工程
班 级:xxxxx班
学 号:xxxxxxxxxx
学生姓名: xxxxxxxxx
**** ***
2011.6.13-2011.6.24
内蒙古科技大学课程设计任务书
| 课程名称 | C++语言课程设计 | ||
| 设计题目 | 公司人员管理系统 | ||
| 指导教师 | 余金林 | 时间 | 2011.6.13—2011.6.24 | 
| 一、教学要求 1. 巩固和加深学生对C++语言课程的基本知识的理解和掌握 2. 掌握C++语言编程和程序调试的基本技能 3. 利用C++语言进行基本的软件设计 4. 掌握书写程序设计说明文档的能力 5. 提高运用C++语言解决实际问题的能力 二、设计资料及参数 每个学生在教师提供的课程设计题目中任意选择一题,完成,可根据设计内容适当修改题目名称。 公司人员管理系统 定义人员基类,并派生出兼职技术人员类、经理类、部门管理人员类并在类中声明各自的成员函数; 要求至少设计以下各功能模块: 输入记录 查询功能 计算工资 显示信息 三、设计要求及成果 1. 分析课程设计题目的要求 2. 写出详细设计说明 3. 编写程序代码,调试程序使其能正确运行 4. 设计完成的软件要便于操作和使用 4. 设计完成后提交课程设计报告 四、进度安排 资料查阅与讨论(1天) 系统分析(2天) 系统的开发与测试(5天) 编写课程设计说明书和验收(2天) 五、评分标准 1. 根据平时上机考勤、表现和进度,教师将每天点名和检查 2. 根据课程设计完成情况,必须有可运行的软件。 3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。 六、建议参考资料 1.《C++面向对象程序设计》,吴敏、杨国林 主编,内蒙古大学出版社 2.《C++语言程序设计(第三版)》,郑莉,清华大学出版社 | |||
二.需求分析————————————
三.概要设计————————————
四.详细设计 ———————————
五.总结 ——————————————
六.参考文献 ————————————
一.摘要
C++简介:
Stroustrup工作起于1979年的C with Classes。这个构思起源于 Stroustrup 做博士论文时的一些程序撰写经验。他发现Simula具备很利于大型软件开发的特点,但Simula的运行速度太慢,无法对现实需求发挥功效;BCPL虽快得多,但它过于低级的特性,使其不适于大型软件的开发。当Stroustrup开始在贝尔实验室工作时,他有分析UNIX核心关于分布式计算的问题。回想起他的博士论文经验,Stroustrup开始为C语言增强一些类似Simula的特点。之所以选择C,是因为它适于各种用途、快速和可移植性。除了C和Simula之外,同时也从其它语言中取得灵感,如ALGOL 68、Ada、CLU以及ML。刚开始时,类、派生类、存储类型检查、内联和默认参数特性,都是通过CfrONt引入C语言之中。1985年10月出现了第一个商业化发布。
1983年,C with Classes改命名为C++。加入了新的特性,其中包括虚函数、函数名和运算符重载]]、参考、常数、用户可控制的自由空间存储区控制、改良的类型检查,以及新的双斜线(//)单行注解风格。1985年,发布第一版《C++程序设计语言》,提供一个重点的语言参考,至此还不是官方标准。19年,发布了Release 2.0。引入了多重继承、抽象类、静态成员函数、常数成员函数,以及成员保护。1990年,出版了The Annotated C++ Reference Manual。这本书后来成为标准化的基础。稍后还引入了模板、异常处理、命名空间、新的强制类型转换,以及布尔类型。
随着C++语言的演变,也逐渐演化出相应的标准程序库。最先加进C++标准库的是流I/O程序库,其用以取代传统的C函数,如printf和scanf。随后所引入的程序库中最重要的便是标准模板库,简称STL。
多年后,一个联合的ANSI-ISO委员会于1998年对C++标准化(ISO/IEC 14882:1998)。在官方释出1998标准的若干年后,委员会处理缺陷报告,并于2003年发布一个C++标准的修正版本。2005年,一份名为Library Technical Report 1(简称TR1)的技术报告释出。虽然还不是官方标准的一部分,不过它所提供的几个扩展可望成为下一版C++标准的一部分。几乎所有目前仍在维护的C++编译器皆已支持TR1。
虽然C++免专利,但标准文件本身并不是免费的,尽管标准文档不是免费的,但是很容易从网络中取得,最简单的就是C++标准文档之前的最后一次草稿版本,它与标准的差别几乎只在于排版上。
C++语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构造出模拟现实问题的实体和操作;编写出的程序具有结构清晰、易于扩充等优良特性,适合于各种应用软件、系统软件的程序设计。用C++编写的程序可读性好,生成的代码质量高,运行效率仅比汇编语言慢10%~20%。
C++语言具有以下特点:
(1) C++是C语言的超集。它既保持了C语言的简洁、高效和接近汇编语言等特点,又克服了C语言的缺点,其编译系统能检查更多的语法错误,因此,C++比C语言更安全。
(2) C++保持了与C语言的兼容。绝大多数C语言程序可以不经修改直接在C++环境中运行,用C语言编写的众多库函数可以用于C++程序中。
(3) 支持面向对象程序设计的特征。C++既支持面向过程的程序设计,又支持面向对象的程序设计。
(4) C++程序在可重用性、可扩充性、可维护性和可靠性等方面都较C语言得到了提高,使其更适合开发大中型的系统软件和应用程序。
每个学生在教师提供的课程设计题目中任意选择一题,完成,可根据设计内容适当修改题目名称。
二.需求分析
某小型公司,主要有四类人员:经理、技术工人、销售人员以及部门管理人员。现在、需要建立一个小型的公司人员管理系统,能够以文件方式存储这些人员的各类信息并能按照其编号查询输出所输入的所有信息,还要按照公司的要求计算出每名员工一个月的工资。
要求:
1)可以录入并保存四类人员的信息;
2)可以按照职工的类别以及姓名查询并显示四类人员的信息;
3)可以按照规定的方法计算每名员工每月所得的工资;
方法:
A 经理:固定工资(5000 可更改)+工龄工资(工龄*100)+领导能力评价;
B 技术工人:固定工资(2500 可更改)+工龄工资(工龄*50)+工时工资(工时*10)+工作表现评价;
C 销售员:工龄工资(工龄*50)+销售额*0.05+销售效率评价;
D 部门管理人员:固定工资(3500 可更改)+工龄工资(工龄*50)+销售额*0.005+统率力评价;
其中,每一类员工的前一部分的计算方法是固定了的,而后面的评价部分分为了优、良、中、差四个等级,在最终评定某一位员工该月应得的工资时可以按评定等级酌情考虑,这样能更加体现人性化并且更能够提高员工积极性。
4)可以在各个界面中实现退出以及进入的循环。
5)可以退出本系统。
三.概要设计
3.1系统功能分析和设计思路、系统功能模块
我们使用面向对象程序设计方法的思路进行分析,得出了整个系统应该涉及两个基类的信息和操作,首先是公司雇员这一个大基类,其它诸如经理等的类应该由此类派生;再有、为了方便实现各类信息以文件方式的储存以及实现各种功能和界面,我们决定再创建一个系统类。所以我们接下来所要做的一切工作都要围绕这两个类(公司雇员类 employee以及系统类 system)来展开。
(1)公司雇员类 employee:可以说这是本系统的一个“总基类”,我们按照预期的设计及要求由它(公司雇员类 employee)派生出了经理类 manager、一般工人类 worker、销售员类 sale以及部门管理人员类 Branch_manage。由于考虑到各个小的分类之间在形式下差不多,为了不出现“二义性”的问题,我们主要在各个类之间采取定义虚基类以及纯虚函数的思路进行调用。另外、由于我们对链表的运用以及链表的掌握还不是很熟练,再加上为了使各个类方便与系统类 system进行直接连接,我们遂决定采用对象数组存放文件中读入或读出的各类公司人员信息。但是我们发现这样做有一个缺陷:因为无法事先确定各类人员及各类人员的各种信息,所以无法确定对象数组的大小。这里我们讨论后决定事先确定一个较大的数组空间来决定这个问题,当然,解决这个问题的最好方法还是采用异质链表来存放从文件中读取的信息。
(2)系统类 system:由于这个系统涉及到了文件的应用,所以系统类 system是必不可少的。我们对问题分析、讨论以后决定,系统类 system的主要成员函数要包括:提供输入各类数据的 inform、确认各类输入成功的 success、添加各类信息的 in_information、用于各类查询的 search、计算并显示总工资的 out_total_salary以及用于各个选项之间输出界面的 interface。
(3)由于考虑到这应该是一个完整的管理系统,加上我们希望这个系统的界面能够做到清晰、明了,我们经讨论后决定采用一个总操作界面,三个分操作界面。
总操作界面应该包括 (分别对应 1.输入信息 2.查询信息并显示 3.计算总工资并显示 4.退出)
输入信息界面中又因该包括 1.经理类 2.工人类 3.销售员类 4.部门管理人员类 5.退出。
查询信息并显示界面中又应该包括 1.经理类 2.工人类 3.销售员类 4.部门管理人员类 5.退出。
计算总工资并显示界面中又应该包括 1.经理类 2.工人类 3.销售员类 4.部门管理人员类 5.退出。
3.2系统使用说明
文字说明:
进入主菜单后: 选1-1为输入经理类的记录;1-2为输入工人类的记录;1-3为输入销售员类的记录;1-4为输入部门管理人员类的记录;1-5为退出此界面并返回到主界面。
选2-1为查找经理类的记录;2-2为查找工人类的记录;2-3为查找销售员类的记录;2-4为查找部门管理人员类的记录;2-5为退出此界面并返回到主界面。以上操作的详细流程请参照流程图3。
选3-1为计算经理类的总工资;3-2为计算工人类的总工资;3-3为计算销售员类的总工资;3-4为计算部门管理人员类的总工资;3-5为退出此界面并返回到主界面。以上操作的详细流程请参照流程图4。
选4会输出“谢谢您使用本系统,次再见!”并退出程序。
软件界面说明例子:
四.详细设计
4.1系统流程图
说明:以下是对应上面系统功能模块实图的系统流程图。
4.2程序代码
//Employee.h
#include #include #include #include class Employee       /*基类(雇员类)*/ { protected:     int lb;     int num;     char name[20];     int  work_age;     double total_salary; public:     int Get_lb(){return lb;};     int Get_num();     int Get_work_age();     char *Getname();     double Get_total_salary();     virtual void Compute_total_salary()=0;     virtual void Input();     virtual void Output(); }; class Manager:virtual public Employee       /*派生类(经理类)*/ { protected:     float salary;     char leadership[10]; public:     Manager(){lb=1;};     ~Manager(){};     void Input();     void Output();     void Compute_total_salary(); }; class Worker:public  Employee       /*派生类(技术工人类)*/ {     float salary;     int work_hour;     char performance[10]; public:     Worker(){lb=2;};     ~Worker(){};     void Input();     void Output();     void Compute_total_salary(); }; class Sale:virtual public Employee       /*派生类(销售人员类)*/ { protected:     float sale;     char efficiency[10]; public:     Sale(){lb=3;};     ~Sale(){};     void Input();     void Output();     void Compute_total_salary(); }; class Branch_Manage:public Manager, public Sale     /*派生类(部门管理人员类)*/ {     char command[10]; public:     Branch_Manage(){lb=4;};     ~Branch_Manage(){};     void Input();     void Output();     void Compute_total_salary(); }; class System       /*系统类*/ {     Manager B[10];     Worker C[10];     Sale D[10];     Branch_Manage E[10];     static int j1,j2,j3,j4;     void infor1();     void infor2();     void infor3();     void infor4();     void Search1(int h,char ch[20]);     void Out_total_salary1(int h,char *name);     void Interface1(); public:     System(){};     void In_information();     void Search();     void Out_total_salary();     void Interface(); }; //carry out.cpp #include #include #include #include char fileName[]="company.dat"; int Employee::Get_num() {     return num; } int Employee::Get_work_age() {     return work_age; } double Employee::Get_total_salary() {     return total_salary; } char *Employee::Getname() {     return name; } void Employee::Input() {     cout<<"\\\员工编号:";     cin>>num;     cout<<"\\\员工姓名:";     cin>>name;     cout<<"\\\员工工龄:";     cin>>work_age;     } void Employee::Output() {     cout<<"\\\员工编号:"< void Manager::Input() {     Employee::Input();     cout<<"\\\固定工资:";     cin>>salary;     cout<<"\\\领导能力(优、良、中、差):";     cin>>leadership; } void Manager::Output() {     Employee::Output();     cout<<"\\\领导能力(优、良、中、差):"< void Manager::Compute_total_salary() {     total_salary=salary+100*work_age; } void Worker::Input() {     Employee::Input();     cout<<"\\\固定工资:";     cin>>salary;     cout<<"\\\工时:";     cin>>work_hour;     cout<<"\\\工作表现(优、良、中、差):";     cin>>performance; } void Worker::Output() {     Employee::Output();     cout<<"\\\工时:"< void Worker::Compute_total_salary() {     total_salary=salary+10*work_hour+50*work_age; } void Sale::Input() {     Employee::Input();     cout<<"\\\当月销售额:";     cin>>sale;     cout<<"\\\销售效率(优、良、中、差):";     cin>>efficiency; } void Sale::Output() {     Employee::Output();     cout<<"\\\当月销售额:"< void Sale::Compute_total_salary() {     total_salary=50*work_age+sale*0.05; } void Branch_Manage::Input() {     Employee::Input();     cout<<"\\\固定工资:";     cin>>salary;     cout<<"\\\当月销售总额:";     cin>>sale;     cout<<"\\\统率力(优、良、中、差):";     cin>>command; } void Branch_Manage::Output() {     Employee::Output();     cout<<"\\\当月销售总额:"< void Branch_Manage::Compute_total_salary() {     total_salary=salary+50*work_age+sale*0.005; } int System::j1=0; int System::j2=0; int System::j3=0; int System::j4=0; void System::Interface1() {     cout<<"\\n\\n\\n";     cout<<"\\   *********按雇员类别进行管理*********"< } void System::In_information() {     int rev1;     int again=1;     char t;     while(again)     {         Interface1();         cin>>rev1;         switch(rev1)         {         case 1:            infor1();            break;         case 2:            infor2();            break;         case 3:            infor3();            break;         case 4:            infor4();            break;         case 5:            Interface();            break;         default:            cout<<"\\\     对不起、没有此类人员!"<         }         cout<<"\\\     信息储存成功!"<         cin>>t;         cout<             again=0;     }     Interface(); } void System::infor1() {     fstream datafile(fileName,ios::in|ios::out|ios::binary);     datafile.seekp(0,ios::end);     B[j1].Input();     datafile.write((char *)&B[j1],sizeof(class Manager));     datafile.close();     j1++;      } void System::infor2() {     fstream datafile(fileName,ios::in|ios::out|ios::binary);     datafile.seekp(0,ios::end);     C[j2].Input();     datafile.write((char *)&C[j2],sizeof(class Worker));     datafile.close();     j2++;     } void System::infor3() {     fstream datafile(fileName,ios::in|ios::out|ios::binary);     datafile.seekp(0,ios::end);     D[j3].Input();     datafile.write((char *)&D[j3],sizeof(class Sale));     datafile.close();     j3++;     } void System::infor4() {     fstream datafile(fileName,ios::in|ios::out|ios::binary);     datafile.seekp(0,ios::end);     E[j4].Input();     datafile.write((char *)&E[j4],sizeof(class Branch_Manage));     datafile.close();     j4++;     } void System::Search1(int h,char ch[20]) {     int s=0,found=0;     switch(h)     {     case 1:         while(s             if(strcmp(ch,B[s].Getname())==0)             {                 B[s].Compute_total_salary();                 B[s].Output();                 cout<<"\\\*****************"<             }             s++;         }         break;     case 2:         while(s             if(strcmp(ch,C[s].Getname())==0)             {                 C[s].Compute_total_salary();                 C[s].Output();                 cout<<"\\\*****************"<             }             s++;         }         break;     case 3:         while(s             if(strcmp(ch,D[s].Getname())==0)             {                 D[s].Compute_total_salary();                 D[s].Output();                 cout<<"\\\*****************"<             }             s++;         }         break;     case 4:         while(s             if(strcmp(ch,E[s].Getname())==0)             {                 E[s].Compute_total_salary();                 E[s].Output();                 cout<<"\\\*****************"<             }             s++;         }         break;     }     if(found==0)         cout<<"\\n\\n\\   对不起,该类别中并没有此人!"< void System::Search() {     int rev;     char name[20];     int again=1;     char t;     while(again)     {         Interface1();         cin>>rev;         if(rev==5) break;         cout<<"\\\请输入您要查询的人员姓名:";         cin>>name;         Search1(rev,name);         cout<<"\\\是否继续查询(y/n)?";         cin>>t;         cout<             again=0;     }     Interface(); } void System::Out_total_salary1(int h,char *name) {     int s=0,found=0;     switch(h)     {     case 1:         while(s             if(strcmp(name,B[s].Getname())==0)             {                 B[s].Compute_total_salary();                 B[s].Output();                 found=1;break;             }                             s++;         }         break;     case 2:         while(s             if(strcmp(name,C[s].Getname())==0)             {                 C[s].Compute_total_salary();                 C[s].Output();                 found=1;break;             }             s++;         }         break;     case 3:         while(s             if(strcmp(name,D[s].Getname())==0)             {                 D[s].Compute_total_salary();                 D[s].Output();                 found=1;break;             }                         s++;         }         break;     case 4:         while(s             if(strcmp(name,E[s].Getname())==0)             {                 E[s].Compute_total_salary();                 E[s].Output();                 found=1;break;             }             s++;         }         break;     }     if(found==0)         cout<<"\\n\\n\\   对不起,该类别中并没有这种类型的总工资!"< void System::Out_total_salary() {     int rev;     char name[20];     int again=1;     char t;     while(again)     {         Interface1();         cin>>rev;         if(rev==5) break;         cout<<"\\n\\\请输入您将要查看总工资的人员姓名:";         cin>>name;         Out_total_salary1(rev,name);         cout<<"\\是否继续查看总工资(y/n)?";         cin>>t;         cout<             again=0;     }     Interface(); } void System::Interface() {     int rev;     cout<<"\\n\\n\\n\\n\\n\\n\\n";     cout<<"\\   ***************欢迎使用***************"<     cin>>rev;     switch(rev)     {     case 1:         In_information();         break;     case 2:         Search();         break;     case 3:         Out_total_salary();         break;     case 4:         cout<<"\\\   谢谢您使用本系统,下次再见!"<     } } //主函数:main.cpp void main(void) {     System s;     s.Interface(); } 五.总结、心得与体会 通过这次课题设计,我觉得做好一个程序,灵活运用是关键。把基础学好不一定能把程序编好,但基础知识不好,一定编不出好程序。做大规模的程序不只是一个人努力就行了,一定要有团队合作能力。编程最主要是思路清晰,只要你把思路理顺了,就有利于你在编程的过程中少走弯路。  要想学好C++我觉得除了在课堂上认真学习之外也要做好以下几点: 1.认真对待每一个程序的编写; 2.做好对每一个所编程序的总结 3.写程序尽量要规范、严谨,效率尽量要高; 4.养成自我测试的习惯; 5.多看一些别人编的程序,把好的思路和方法记下来,以备不时之需 6.要有恃之以恒的精神以及严谨的科学研究作风 。 在这短短的两个星期的努力奋斗中、在余金林老师的辛勤指导下。我们终于把本次课题设计顺利完成。回想起课题设计过程中面对程序错误一大堆的失望与成功完成程序中每一个模块的喜悦时,我真正的体会到了:1. 一个人好难做得来,需要一个团队合作来做好一件工作,提高工作的质量与效率;2.细节决定成败;3.学术不管是哪一门,只要你用心去对待它,它也会用心地来回报你,这也正印证了一句话:“一分耕耘一分收获”! 六.参考书目 1.《C++面向对象程序设计》,吴敏,杨国林 主编,内蒙古大学出版社 2.《C++语言程序(第三版)》,郑莉,清华大学出版社 3.《面向对象程序设计与Visual C++6.0教程》,陈天华,清华大学出版社
