面向对象程序设计报告.docx
《面向对象程序设计报告.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计报告.docx(33页珍藏版)》请在冰豆网上搜索。
![面向对象程序设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/26/0cf01756-552d-4199-9c52-fcf2afdf2be5/0cf01756-552d-4199-9c52-fcf2afdf2be51.gif)
面向对象程序设计报告
面向对象程序设计(C++)
课程设计报告
班级:
191152
学号:
188
姓名:
夏体凡
日期:
2016年7月4日
一、原创性申明…………………………………………3
二、题目与要求…………………………………………4
三、需求分析…………………………………………….4
四、概要设计……………………………….…………..5
五、详细设计…………………………………….……5
六、测试……………………………………………….….7
七、结论…………………………………………….…..9
八、附录………………………………………….….11
原创性声明:
本人声明报告者中的内容和程序为本人独立完成,引用他人的文献、数据、图件、资料均已明确标注出。
除标注内容外,不包含任何形式的他人成果,无侵权和抄袭行为,并愿意承担由此而产生后果。
作者签字:
时间:
指导教师评语:
课程成绩:
程序界面(10分)
程序结构和功能(40分)
程序安全和效率(40分)
报告(10分)
指导教师签字:
时间
题目与要求
设计如下类,其功能和部分成员如下:
Object:
抽象类,所有的物体都有价值(profit)属性;Point:
点的位置三维空间;LineSegment(线段),Rectangle,Cuboid,Square,Cube,Circle,Cylinder
功能:
能够实现上述物体的移动(move),放大(zoomin),缩小(zoomout),大小比较(compare),打印物品信息(cout<<编号、面积、容积和价值)等操作,且所有物品的对象实现自动编号。
移动:
Line类对象移动其中点,Rectangle、Square和Circle:
移动重心,Cubiod、Cube和Cylinder:
移动底面重心
放大和缩小:
以倍数为参数,进行相应组件的放大和缩小
判断:
空间内某一点(Point)是否在另一物体内;线段(Line)是否和另一物体相交
默认比较方式:
Line:
比较长度,Rectangle、Square和Circle:
比较面积
Cubiod、Cube和Cylinder:
比较体积。
同维度(或不同维度)空间内的不同类物体之间可进行大小比较。
相等返回0,小于返回-1、大于返回1
再设计一个容器类(Container).容器具有最大容量属性。
功能:
能容纳以上定义的各种3D物品(Cylinder,Cube和Cuboid),实现添加一个物品(add),移除容器里的一个物品(remove),重载[],排序:
不改变物品在容器中的位置(下标),把物品的id按照排序结果(根据物品某一关键字)返回;
附加功能:
给定一定数量的物品(假设物品的总容量超过容器最大容量),挑选部分装入容器中,设计算法实现所装物品的总价值最大。
需求分析
1.本次上机题目主要运用继承和派生建立多个类,这些类都主要一个点类point继承而来,然后每一个类设计一个头文件和一个源文件,然后最后设计一个操作类container,用来处理移动(move),放大(zoomin),缩小(zoomout),大小比较(compare),打印物品信息(cout<<编号、面积、容积和价值)等操作,最后设计一个主函数,用来控制整个系统。
2.系统环境、运行要求:
Visual Studio 2015
概要设计
从设计的要求可知,要有一个最底层的抽象基类即Object类,然后就是多个类之间的关系,Point继承Object——然后Line继承Point,添加length新成员;Circle继承Point,添加新成员R;Square继承Point,添加L1新成员;Rectangle继承Point,添加L1,L2新成员;最后Cylinder继承Circle,添加height新成员;Cube继承Square,添加high新成员;Cuboid继承Rectangle,添加high新成员。
这样就完成了继承与派生类的设计。
除了这些类,还必须有操作,否则就没有意义了,要实现上述物体的move,zoomin,zoomout,compare,打印物品信息等操作,这里要用到运行时的多态,即需要基类的指针,将在下一条详细讲,这里要做的是函数成员的设计,这要求在每个类要有同名函数,即(overriding a virtual function),返回值类型,参数类型等都得一样,而且基类的要是virtual function。
再设计一个容器类Container,所有物品的对象实现自动编号。
这里的容器要用vector来做,我们在Container类中定义vector Po数据成员既可实现自动编号又可实现运行时的多态。
详细设计
在所有的类Point,LineSegment(线段),Rectangle,Cuboid,Square,Cube,Circle,Cylinder中包含一个构造函数,一个析构函数,并且在每个类中定义该类面积(area),长度(lenth),体积(volume)的计算方法,同时定义各个类放大,缩小,移动,打印功能的执行方法。
在操作类中定义所有的操作移动(move),放大(zoomin),缩小(zoomout),大小比较(compare),打印物品信息,其中,移动,放大,缩小几个功能返回该类所在的原函数进行,
大小比较在操作函数中进行,采用的方法是有体积比较体积,没体积比面积,没面积比长短,
打印操作还分为全部打印和单个打印。
在主函数中包含了一个功能菜单,用来方便操作,功能菜单通过指针连向所有功能函数。
功能实现示意图
继承
测试
添加物体的信息
移动物体的位置
放大或缩小物体
比较
打印
删除
结论
本学期较上学期来说做了更多的课程设计,有了更多的实践经验,对于此次的设计,我感觉知识的综合能力较强,毕竟c++已经学习了一个学期,对于类的设计也不能仅仅局限于一个或俩个,要学会从分散到集中,从少到多。
本次上机的主要目的是熟悉继承与派生(inheritance and polymorphism),这是c++的核心内容,也是比较难掌握的,但总的来说,这次上机实践我的收获还是很大的,我从中找到我的错误和不足之处。
对于这个面向对象的程序设计,我个人认为这个程序的优点在于:
1.在做的过程中使用了多文件的结构,便于编译和改错;
2.类的设计,在程序中共有10个类,,每个类都有自己独立的数据成员和函数成员,声明和定义都是分开的,都是按照类的标准设计来做的;
3.实现了运行时的多态,在Container类中用了vector Po,即指向基类的指针容器,。
在缺点方面,首先是在继承与派生时对概念弄得不是很清晰,逻辑上出现了一些错误,再加上理解题意出了问题,导致派生关系弄得不对或复杂了,还有就是关于继承类的构造函数没有写好,忽略了关键点,即基类成员和新增成员的使用和关系,还有就是有功能没有实现,像给定一定数量的物品,假设物品的总容量超过容器最大容量,挑选部分装入容器中,设计算法实现所装物品的总价值最大。
程序安全性不足,存在内存泄漏等等,C++课本的教学知识已经学完了,但对于我来说还差得很远很远,光靠这一年的时间是远远不够的,需要更多的知识灌溉和实践,C++之路曼曼其修远兮,吾将上下而求索。
在以后的学习生活中多练习,用勤补拙,不断提高自己的c++水平。
要成为一名合格的程序员还有许多的路要走,我会一直坚持下去!
附录
*********************************************************
#ifndefPOINT_H
#definePOINT_H
#include
#include
#include""
usingnamespacestd;
classPoint:
publicObject{
protected:
doublem_x,m_y,m_z;
public:
Point():
Object(){
m_x=m_y=m_z=0;
}
Point(Point&c):
Object(c){
m_x=;
m_y=;
m_z=;
}
Point(doublea,doubleb,doublec,doubled);
voidgetPoint();
virtualdoublegetlength(){return0;}
virtualdoublegetarea(){return0;}
virtualdoublegetvolume(){return0;}
virtualvoidmovexyz();
virtualvoidzoom();
virtualvoidprint();
~Point(){}
};
#endif
************************************************
#ifndefLINE_H
#defineLINE_H
#include
#include
#include""
usingnamespacestd;
classLine:
virtualpublicPoint{
protected:
doublem_length;
public:
Line():
Point(){
m_length=0;
}
Line(Line&c):
Point(c){
m_length=;
}
Line(doublea,doubleb,doublec,doubled,doublee);
doublegetlength();
doublegetvolume(){return0;}
doublegetarea(){return0;}
voidmovexyz();
voidzoom();
voidprint();
~Line(){}
};
#endif
**************************************************
#ifndefCIRCLE_H
#defineCIRCLE_H
#include
#include
#include""
usingnamespacestd;
classCircle:
virtualpublicPoint{
protected:
doublem_R;
public:
Circle():
Point(){
m_R=0;
}
Circle(Circle&c):
Point(c){
m_R=;
}
Circle(doublea,doubleb,doublec,doubled,doublee);
doublegetarea();
doublegetlength(){return0;}
doublegetvolume(){return0;}
voidmovexyz();
voidzoom();
voidprint();
~Circle(){}
};
#endif
*****************************************
#ifndefCONTAINER_H
#defineCONTAINER_H
#include
#include
#include""
#include""
#include""
#include""
usingnamespacestd;
classContainer{
private:
Point*pi[20];
Pointpo[20];
Lineli[20];
Circleci[20];
Cylindercy[20];
Squaresq[20];
Rectanglere[20];
Cuboidcub[20];
Cubecu[20];
constdoubleV=50;
doubleVc=0;
vectorPo;
public:
voidAddobject();
voidMoveposition();
voidZoominorout();
voidCompare();
voidPrint();
voidDeleteobject();
Point*&operator[](inti);
};
#endif
******************************************************
#ifndefCUBE_H
#defineCUBE_H
#include
#include
#include""
usingnamespacestd;
classCube:
publicSquare{
protected:
doublem_High;
public:
Cube();
Cube(doublep,doublex1,doublex2,doublex3,doubler,doublem_High);
Cube(Cube&c):
Square(c){
m_High=;
}
doublegetarea(){return0;}
doublegetlength(){return0;}
doublegetvolume();
voidmovexyz();
voidzoom();
voidprint();
~Cube(){};
};
#endif
**********************************************************
#ifndefCUBOID_H
#defineCUBOID_H
#include
#include
#include""
usingnamespacestd;
classCuboid:
publicRectangle{
protected:
doublem_High;
public:
Cuboid();
Cuboid(Cuboid&c):
Rectangle(c){
m_High=;
}
Cuboid(doublep,doublex1,doublex2,doublex3,doubler1,doubler2,doublem_High);
doublegetvolume();
doublegetlength(){return0;}
doublegetarea(){return0;}
voidmovexyz();
voidzoom();
voidprint();
~Cuboid(){};
};
#endif
***********************************************
#ifndefCYLINDER_H
#defineCYLINDER_H
#include
#include
#include""
usingnamespacestd;
classCylinder:
publicCircle{
private:
doublem_high;
public:
Cylinder():
Circle(){
m_high=0;
}
Cylinder(Cylinder&c):
Circle(c){
m_high=;
}
Cylinder(doublea,doubleb,doublec,doubled,doublee,doublef);
doublegetvolume();
doublegetlength(){return0;}
doublegetarea(){return0;}
voidmovexyz();
voidzoom();
voidprint();
~Cylinder(){}
};
#endif
**********************************************
#ifndefRECTANGLE_H
#defineRECTANGLE_H
#include
#include
#include""
usingnamespacestd;
classRectangle:
publicPoint{
protected:
doubleR1,R2;
public:
Rectangle();
Rectangle(Rectangle&c):
Point(c){
R1=;
R2=;
}
Rectangle(doublep,doublex1,doublex2,doublex3,doubler1,doubler2);
doublegetarea();
doublegetlength(){return0;}
doublegetvolume(){return0;}
voidmovexyz();
voidzoom();
voidprint();
~Rectangle(){};
};
#endif
************************************************
#ifndefSQUARE_H
#defineSQUARE_H
#include
#include
#include""
usingnamespacestd;
classSquare:
publicPoint{
protected:
doubleR;
public:
Square();
Square(Square&c):
Point(c){
R=;
}
Square(doublep,doublex1,doublex2,doublex3,doubler);
doublegetarea();
doublegetlength(){return0;}
doublegetvolume(){return0;}
voidmovexyz();
voidzoom();
voidprint();
~Square(){};
};
#endif
**************************************************
#ifndefOBJECT_H
#defineOBJECT_H
#include
#include
constdoublePI=;
usingnamespacestd;
classObject{
protected:
doubleProfit;
public:
Object():
Profit(0){}
Object(doublea):
Profit(a){}
~Object(){}
virtualvoidprint()=0;
};
#endif
*******************************************
#include""
Point:
:
Point(doublea,doubleb,doublec,doubled):
Object(a),m_x(b),m_y(c),m_z(d){
}
voidPoint:
:
getPoint(){
cout<<"x坐标:
"<"<"<}
voidPoint:
:
movexyz(){
doublea,b,c;
cout<<"请重新输入坐标:
"<cin>>a>>b>>c;
m_x=a;
m_y=b;
m_z=c;
}
voidPoint:
:
zoom(){
cout<<"点不能放大或缩小"<}
voidPoint:
:
print(){
cout<<"点:
"<cout<<"价值:
"<cout<<"坐标:
"<<"("<}
*************************************************
#include""
Line:
:
Line(doublea,doubleb,doublec,doubled,doublee):
Point(a*e,b,c,d),m_length(e){
};
doubleLine:
:
getlength(){
returnm_length;
}
voidLine:
:
movexyz(){
doublea,b,c;
cout<<"请重新输入中点坐标:
"<cin>>a>>b>>c;
m_x=a;
m_y=b;
m_z=c;
}
voidLine:
:
zoom(){
cout<<"这是一个线段,请输入你放大或缩小时的倍数"<doublea;
cin>>a;
m_length=a*m_length;
}
voidLine:
:
print(){
cout<<"线段"<cout<<"价值:
"<cout<<"坐标:
"<<"("<cout<<"长度:
"<