C++课程设计
班级:通信0702 姓名:
学号:0207105230 指导老师:
摘 要
C++是由C发展而来的,与C兼容。所以它可以用于面向过程的结构化程序设计,但是它又有自己的特点,它也可以用于面向对象的程序设计,是一种功能强大的混合型的程序设计语言。
虽然C++仍然允许使用从C继承来的传统用法,但是仍然提倡使用C++的新方法。面向对象的程序设计主要有四个特点:封装,继承,多态,抽象。学好C++,绝不是一个纯技术的问题,需要综合考虑多方面的因素,作出合理的决策和安排。因此必须强调多编程,多上机实践。本次课设三个题目要求设计管理系统,我选择了公司人员信息管理系统,编写的程序涵盖了C++语言中的封装,继承,多态(虚函数的使用),文件操作。在设计过程中我尽量秉持着靠近实际应用的原则,用心的从一个管理者的角度出发并解决了自己在程序中的多处不足和缺陷,例如在输入编号设计中,设计了关于数据有效性的操作等。在系统设计
中我加强了界面的美观设计,使程序在简洁的基础上可读性更强,更人性化!最后我在设计过程中也尝试了创新的方法,也收到了很好的效果。总之,两周的课设过去了,我感觉自己在整体上有了一个很大的提高,知识更加系统化,理论化,我会继续努力和不断地钻研!!! 本文利用Microsoft Visual C++6.0编写程序,实现了用户对公司职员信息的增加?更改?删除?查找?显示?存储等操作。
关键词:类 继承 派生 多态性 虚函数 输入输出 文件操作
一:设计任务与要求:
假设要为某个公司编写雇员工资支付程序。一般工人(Worker)按每月工作的天数计算工资;销售人员(Salesman)在基本工资基础上每月还有销售提成;经理(Manager) 每月按固定工资支付,临时工(Floater )按小时支付。要求设计抽象类(Employee)描述所有雇员的共同特性(如姓名,性别,出生日期,员工类别),含有计算工资的纯虚函数computeSalay(),所有员工用该方法计薪。要求用多态实现。
经理工资计算:月工资()
销售人员工资计算:基本工资+每件产品提成额*销售的产品数量
一般工人工资计算:每天工资额*工作天数
临时工工资计算:每小时工资额*总工作小时数
文本界面为:
1.新增员工信息
2.删除员工信息
3.员工信息搜索(按姓名)
4.员工信息统计(按姓名或工资或类别)
5.员工信息分类存储
6.员工信息导入
7.按工资排序
8.退出
第一章 绪论
1.1 课程设计的目的
C++作为一种面向对象的程序设计语言,它支持对类的抽象.了解面向对象的程序设计思想及其方法,其核心概念--类,包括类及其派生类的声明实现利用类来解决具体问题,并达到以下目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
1.2 课程设计的背景和意义
C++是一门实践性很强的课程,光靠听课和看书是学不好的。衡量学习好坏的标准不是懂不懂。因此必须强调多编程,多上机实践。所以开设了这次课程设计,目的在于使学生达到熟练掌握C++语言的基本知识和技能,掌握面向对象程序设计的基本思路和方法,能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。这对于进一步巩固C++知识是一个很好的机会。
同时我们在这次课程设计的过程中学到了很多课本以外的知识,解决了很多以前没有碰到的问题,可以说对程序设计这门课有了一个新的认识。
1.3 课程设计环境
本次课设采用的是Microsoft Visual C++6.0编写程序
第二章 需求分析
2.1 问题描述
制作公司人员信息管理系统实现数据录入、数据删除、数据保存和数据显示以及数据查询等一些功能。
2.2 功能要求
(1)根据自己的喜好设计系统封面
(2).系统应包括记录编辑和记录查询等功能模块。记录编辑功能完成职工记录编辑的记录增加、记录删除和记录查询等功能。记录查询功能可以对数据集中的记录进行查询,要求按职工姓名进行查询
2.3 问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
2)分析系统中的各个实体及它们之间的关系;
3)根据问题描述,设计系统的类层次;
4)完成类层次中各个类的描述;
5)完成类中各个成员函数的定义;
6)完成系统的应用模块;
7)功能调试;
8)完成系统总结报告。
第三章 系统设计
3.1 数据设计
3.1.1 类设计
本次程序设计一共定义了五个类:Employee, Manager,Floater,Workers和Salesman。 在Employee类里定义了Empoyee类的缺省构造函数和它的析构函数,ADD函数用于实现新增成员的输入,delete1函数用于实现数据的删除,displayall函数用于实现数据的显示。Find用于实现在查找的时候得到姓名。Sort用于分类。排序用于根据工资排序。Manager,worker,floater和Salesman类公有继承Employee类,它们的函数功能,数据成员与基类的基本相同。
3.1.2 函数设计
在五个类里定义了它们的的缺省构造函数和它的析构函数,Add函数用于实现新增成员的输入,通过for循环给对象数组赋值来实现。change函数实现数据的更改。delete1函数用于实现数据的删除。displayall函数用于实现数据的显示。Find用于实现根据姓名查找。 Paixu实现通过工资高低排序。Sort实现通过员工信息分类存储。
3.2 结构设计
3.2.1系统流程图
3.2.2 程序清单
1、main 函数:实现各个参数的定义及赋初值,提供选择界面;
2、基类:定义参数、相关函数以及虚函数
3、派生类:实现新增员工信息、删除员工信息、员工信息搜索(按姓名)、员工信息统计(按姓名或工资或类别)、员工信息分类存储、员工信息导入、按工资排序、退出等功能。
3.2.3源程序代码:
#include
#include
#include }; //普通工人 class Worker:public Employee { private: float dayRate; //每天酬金 int workDays; //当月工作天数 public: Worker(){dayRate=180;} virtual void get_data() { cout<<"(姓名 性别 出生日期 员工类别 工作天数)"; cin>>name>>gender>>date>>Staffcategory>>workDays; } float get_dayRate(){return dayRate;} int get_workDays (){return workDays;} void computeSalay(){accumPay=dayRate*workDays;} void display() { //cout<<"一般工人显示数据如下:"< //cout<<"姓名 性别 出生日期 员工类别 当月工作天数 每天酬金 月薪总额"< cout< < } }; //销售人员 class Salesman:public Employee { private: float commRate;//每件产品提成额 float sales; //销售的产品数量 float salary; //基本工资 public: Salesman() { commRate=8; salary=3000; } virtual void get_data() { cout<<"(姓名 性别 出生日期 员工类别 销售产品数量)"; cin>>name>>gender>>date>>Staffcategory>>sales; } void computeSalay(){accumPay=commRate*sales+salary;} void display() { //cout<<"销售人员数据显示数据如下:"< //cout<<"姓名 性别 出生日期 员工类别 销售的产品总量 每件产品提成额 基本工资" //<<" "<<"月薪总额"; cout< < } }; //经理 class Manager:public Employee { private: float monthSalary;//月工资 public: Manager(){monthSalary=10000;} virtual void get_data() { cout<<"(姓名 性别 出生日期 员工类别)"; cin>>name>>gender>>date>>Staffcategory; } float get_monthSalary(){return monthSalary;} void computeSalay(){accumPay=monthSalary;} void display() { //cout<<"经理显示数据如下:"< //cout<<"姓名 性别 出生日期 员工类别 月薪总额"< < } }; //临时工 class Floater:public Employee { private: float hourRates; //每小时酬金 int workHours; //当月工作时数 public: Floater(){hourRates=15;} virtual void get_data() { cout<<"(姓名 性别 出生日期 员工类别 当月工作时数)"; cin>>name>>gender>>date>>Staffcategory>>workHours; } float get_hour_Rates(){return hourRates;} int get_workHours(){return workHours;} void computeSalay(){accumPay=hourRates*workHours;} void display() { //cout<<"一般工人显示数据如下:"< //cout<<"姓名 性别 出生日期 员工类别 当月工作时数 每小时酬金 月薪总额"< cout< < } }; Employee *E[100]; Employee *W[100]; Employee *S[100]; Employee *F[100]; Employee *M[100]; void displayAll() { ifstream in("employee.dat",ios::binary); if(in.fail()) { cout<<"The File is not sucessfully opened"< { E[n]=new Salesman(); E[n]->get_data(); E[n]->computeSalay(); output.write((char*)E[n],sizeof(E[n])); n++; } if(t=='f') { E[n]=new Floater(); E[n]->get_data(); E[n]->computeSalay(); output.write((char*)E[n],sizeof(E[n])); n++; } }; output.close(); } //排序 void Paixu() { ifstream in("employee.dat",ios::binary); for(int p=0;p E[j+1]=temp; } if(!swap)break; } ofstream out("employee.dat",ios::binary); for(int t=0;t cout<<"输入要查询的姓名:"; cin>>sname; for(int i=0;i if(strcmp(E[i]->get_Staffcategory(),"Floater")==0) { F[H]=new Floater(); F[H]=E[i]; out2.write((char*)F[H],sizeof(F[H])); //F[H]->display(); H++; } if(strcmp(E[i]->get_Staffcategory(),"Manager")==0) { M[M0]=new Manager(); M[M0]=E[i]; out2.write((char*)M[M0],sizeof(M[M0])); //M[M0]->display(); M0++; } } cout<<"一般工人信息显示如下:"< for(int b=0;b { in1.read((char*)W[b],sizeof(W[b])); W[b]->display(); } cout<<"销售工人显示如下:"< for(int c=0;c { in3.read((char *)S[c],sizeof(S[c])); S[c]->display(); } cout<<"临时工信息显示如下:"< for (int d=0;d { in2.read((char *)F[d],sizeof(F[d])); F[d]->display(); } cout<<"经理信息如下:"< for(int e=0;e { in4.read((char *)M[e],sizeof(M[e])); M[e]->display(); } } void main() { system ( "color 1f"); int choice=1; while(choice!=0) { cout< cout< cout< cout< cout< cout< cout< cout< cin>>choice; switch(choice) { case 1:do{ cout<<"(1:新增,2:删除信息,3:员工信息检索,4:员工信息分类储存,5:员工信息导入,6:按工资排序,7:退出)"< cout<<"请选择:"; int m; cin>>m; switch(m) { case 1: ADD(); displayAll(); break; case 2: DELETE(); displayAll(); break; case 3: Find(); break; case 4: sort(); break; case 5: displayAll(); break; case 6: Paixu(); displayAll(); break; case 7: cout< cout< cout< break;} }while(1);} } } 运行结果: 总 结 本次课设我做的是公司人员管理系统,其优点是有友好的界面,可以有效地进行数据的增加,更改,删除,查找,显示和保存,并且在输入数据时有关于数据有效性的判断。但是也有一些缺点,就是删除数据时是把内容赋为空值,而不能把他从内存中彻底删除,导致内存空间的浪费。究其原因主要是对链表的掌握不熟练,所以以后要加强对链表知识的学习。总之,一周的课设,让我感觉自己在整体上有了一个很大的提高,知识更加系统化,理论化,我会继续努力和不断地钻研!!! 致 谢 本课题在选题及进行过程中得到林志强老师的悉心指导。论文行文 过程中,林志强老师多次帮助我分析思路,开拓视角,在我遇到困难想放弃的时候给予我最大的支持和鼓励。林志强老师严谨求实的治学态度,踏实坚韧的工作精神,将使我终生受益。再多华丽的言语也显苍白。在此,谨向林志强老师致以诚挚的谢意和崇高的敬意。同时也要感谢我的同学们在编写代码的过程中给予我的帮助。 参考文献 [1]吕凤翥. C++语言基础教程.清华大学出版社 .19xx年3月第一版 [2]郑莉 董渊 张瑞丰. C++语言程序设计. 清华大学出版社.. 2005 [3]张国峰.C++语言及其程序设计教程. 电子工业出版社. 1997 [4]和克智.C++程序设计. 西安交通大学出版社.2004 [5]张基温.C++程序开发教程. 清华大学出版社.2002-12 [6]揣锦华.C++程序设计语言. 西安电子科技大学出版社.2003-2 [7]裘宗燕.c++程序设计语言(特别版). 机械工业出版社.2002-7 [8]候捷译.C++设计新思维. 华中科技大学出版社.2003-3