面向对象程序设计C++实验报告.docx
- 文档编号:12680304
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:43
- 大小:43.05KB
面向对象程序设计C++实验报告.docx
《面向对象程序设计C++实验报告.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计C++实验报告.docx(43页珍藏版)》请在冰点文库上搜索。
面向对象程序设计C++实验报告
电子科技大学信息与软件工程学院
标准实验报告
(实验)课程名称:
面向对象程序设计C++
电子科技大学教务处制表
学生姓名:
赵天豪
学号:
2014220902010指导教师:
李巧勤
实验地点:
信软学院实验室实验时间:
15/12/21
一、实验室名称:
信软学院软件实验室
二、实验项目名称:
基于MFC的C++桌面应用开发
三、实验学时:
16学时
四、实验原理:
本次实验基于MFC开发C++桌面应用程序,实现可视化操作。
五、实验目的:
充分运用所学的C++的数据封装、继承与派生、多态等全部核心内容,补充完整一个基于MFC的应用,使学生能够基本掌握OOA、OOD方法;熟练掌握OOP方法;初步了解基于Windows平台的桌面图形化应用的开发过程,掌握编程工具的使用;初步掌握建模工具的使用;基本掌握阅读、调试程序的能力。
六、实验内容:
一位小学教师Ken希望完成这样的任务:
针对于小学生正在学习四边形(quadrangle)的特性,编写一个小软件,能够随机在屏幕上显示矩形(rectangle)正方形(square)、平行四边形(parallelogram)、梯形(trapezoid)和菱形(diamond)五种形体之一,同时显示该形体的特性和关键数据(随机产生),学生复习形体的特性,然后根据给出的关键数据计算形体的面积,软件判断其结果的正确性。
在学习过程中,软件记录产生的每一个形体,在学生选择不再继续后,将其学习的过程重放一遍,用以重温,加深印象。
根据上述描述,需要完成:
1)必做内容
根据Ken老师的要求,需要至少编写六个类:
Rect//注意:
类名不要使用Rectangle
Square
Parallelogram
Trapezoid
Diamond
List
(注:
这六个类必须以上述名字命名)
其中,前五个类用于描述五种形体。
五种形体不用顶点坐标的表示形式,而只是简单地用它们的特征值表示。
例如:
矩形、平行四边形用长和高表示;正方形用边长表示;梯形用两条平行边长和高表示;菱形用两条对象线长表示。
要求为这五种形体编写相应的类,每个类的设计要求如下:
(1)Quadrangle类必须成为抽象类,是其它形体类的祖先。
它拥有如下
成员:
成员
类型
是否纯虚
name
数据
/
area
函数
是
draw
函数
是
what
函数
可选
(2)其它形体类之间的继承关系请自行拟定。
其中,Parallelogram类必
须拥有如下虚成员:
Width();//返回宽
Height();//返回高
(3)每个形体类必须完成如下操作:
[1]设置标志名属性name五种形体的标志名必须是Parallelogram、
Rectangle、DiamondTrapezoid和Square之一(第一个字母大写,其余小写);
[2]重载area()成员;
[3]重载draw()成员;
[4]重载Width()成员以返回宽;
[5]重载Height()成员以返回高;
[6]提供Width2()成员以返回第二条平行边长(仅对梯形)
(4)List类必须拥有如下成员函数:
size();//返回列表中的节点数
push_back();//将数据添加到列表末尾
operator]];//返回指定下标的数据
traverse();//遍历,需要一个访问函数作为参数pop_back()//用来删除列表的最后一个节点,其原型为:
voidpop_back();
(5)重温过程实际上就是遍历List类对象的过程。
2)选作内容
List类实际上是一种称为“容器”的类。
除了容纳形体指针,其实它还可以容纳任何类型的对象。
在本选作内容中,
(1)请将List类改为模板类,使其能容纳任何类型的对象;
(2)请为List类编写迭代器。
要求如下:
该迭代器的类名为Iterator;
该迭代器必须重载如下运算符:
++:
迭代器后移
!
=:
两个迭代器比较
*:
返回迭代器指向节点的数据域中的值,即quad指针。
=:
两个迭代器的复制
+。
该运算符函数的原型为:
Iteratoroperator+(inti);
其功能为:
假设当前迭代器(的内部指针)指向了第k个节点(从0开始计数),那么+运算符返回一个迭代器,该迭代器是在当前迭代器的基础上向后移动i个位置得到的,即该迭代器指向了第k+i个节点。
例如:
Iteratoritr=list.begin()+5;
那么迭代器itr就指向了从列表的头节点往后数第5个结点。
为Iterator类编写begin()和end()成员。
七、实验器材(设备、元器件):
PC计算机、Windows系列操作系统、VisualStudio2013软件
八、实验步骤:
1)完成类的设计;2)根据设计结果编写各种形体类的代码;完成学习模式的编程与测试
3)完成List类的编码与测试;
4)完善程序流程,实现复习模式;
5)对前面完成的所有文件进行整合,生成一个解决方案,并进行调试;
6)程序优化。
九、实验程序及结果分析:
Canvas.h:
#pragmaonce
#include"quad.h"
classQuadrangle;
//Canvas视图
classCanvas:
publicCScrollView
{
DECLARE_DYNCREATE(Canvas)
//protected:
public:
Canvas();//动态创建所使用的受保护的构造函数
virtual~Canvas();
public:
#ifdef_DEBUG
virtualvoidAssertValid()const;
#ifndef_WIN32_WCE
virtual
#endif
voidDump(CDumpContext&dc)const;
#endif
protected:
virtual
void
OnDraw(CDC*pDC);
//
重写以绘制该视图
virtual
void
OnlnitialUpdate();
//
构造后的第一次
DECLARE_MESSAGE_MAP()
public:
static
static
Canvas*pCanvas;
voiddrawQuad(constQuadrangle*quad);
static
boolisLearning;
booltoggleMode(void);
doublearea;
private:
enum_QUAD_{para=0,rect,sqr,diam,trap};typedefpair
mapvstring,_QUAD_>quadMap;
};
Diam:
#pragmaonce
#include
#include
#include"Canvas.h"
#include"para.h"
usingnamespacestd;
classDiamond:
publicPara
{
public:
Diamond(intd1=4,intd2=8,stringnm="Diamond"):
Para(d1,d2,nn){};
~Diamond(){};
voiddraw()const{Para:
:
draw();};
doublearea()const{return(double)width*height/2;};
stringwhat()const{returnname;};
int&Width1(){returnd1;};
int&Width2(){returnd2;};
friendostream&operator<<(ostream&os,constDiamond&c2);
Diamond&operator=(constDiamond&di)
{
name=di.name;
d1=di.d2;
d2=di.d2;
return*this;
}
protected:
intd1,d2;
};
Experiment:
//experiment.h:
PROJECT_NAME应用程序的主头文件
//
#pragmaonce
#ifndef__AFXWIN_H__
#error"在包含此文件之前包含“stdafx.h”以生成PCH文件"
#endif
#include"resource.h"//主符号
//CexperimentApp:
//有关此类的实现,请参阅experiment.cpp
//
classCexperimentApp:
publicCWinApp
{
public:
CexperimentApp();
//重写
public:
virtualBOOLnitlnstance();
//实现
DECLARE_MESSAGE_)MAP
};
externCexperimentApptheApp;
Experimentdlg.h:
//experimentDlg.h:
头文件
//
#pragmaonce
#include"canvas.h"
//CexperimentDlg对话框
classCexperimentDlg:
publicCDialogEx
{
//构造
public:
CexperimentDlg(CWndpParent=NULL;//标准构造函数
//对话框数据
enum{IDD=IDD_EXPERIMENT_DIALQG
protected:
virtualvoidDoDataExchange(CDataExchang@pDX);//DDX/DDV支持
//实现
protected:
HICONm_hlcon;
//生成的消息映射函数
virtualBOOLOnlnitDialog();
afx_msgvoidOnSysCommandUINTnID,LPARAMParam);
afx_msgvoidOnPaint();
afx_msgHCURSOOnQueryDraglcon();
DECLARE_MESSAGE_)MAP
public:
Canvas*pCanvas;
afx_msgvoidOnBnClickedOk();
doubleanswer;
CStringresult;
afx_msgvoidOnClickedButtonNext();
afx_msgvoidOnClickedButtonStop();
afx_msgvoidOnClickedButtonSubmit();
public:
QUADPTReateAquad(void);
private:
boollastDone;
virtualBOOLOnCommandW/PARAMParam,LPARAMParam);
};
List.h:
#pragmaonce#include"quad.h"
#inelude
#inelude
//typedefvoid(*ACCESSFUN)(QUADPTR);//定义遍历时节点处理函数类型
classList
{
protected:
structNode
{
QUADPTRata;
Node*next;
Node(QUADPTR):
data(d){}
}*head,*tail;//链表的头尾指针
//typedefNode*_range;
size_tlen;//链表中节点的数目即链表的长度
public:
List():
head(NULL,tail(NULI){len=0;}//平凡构造函数
List(Listconst&l)
{
head=tail=NULL
Node*p=l.head;
while(p!
=NULL
{
this->push_back(p->data);
p=p_>next;
}
len=0;|
}//复制构造函数
~List()
{
Node*p=head,*q;
while(p!
=NULL
{
q=p;
p=p_>next;
deleteq;
}
};
Node*Tail(){returntail;}
//size_tsize(){returnlen;};//获取链表的长度
size_tList:
:
size()
Node*p=head;size_ti=0;
while(p!
=NULL{
p=p_>next;
++i;
}
returni;
}
voidpush_back(constQUADPTRuad)//尾部添加
{
Node*p=newNode(quad);
p->next=NULL
if(tail==NULLhead=tail=p;
else{tail->next=p;tail=p;}
len++;
}
intpop_back()
{
if(len==0)
returnlen;
Node*c=head;
if(c==tail){deletec;
head=tail=NULL
}
else{
while(c->next!
=tail)c++;
deletetail;
tail=c;
tail->next=NULL|
}
len--;
returnlen;
}
voidtraverse(void(*f)(constQUADPT&R)
{
Node*p=head;
inti=1;
while(p!
=NULL
cout<<"第"<
f(p->data);
p=p_>next;
//请自行添加指针移动部分
}
}//遍历
List&operator=(constList&l)
{
head=tail=NULL
Node*p=l.head;
while(p!
=NULL
{
this->push_back(p->data);
p=p_>next;
}
len=0;
return*this;
}
List&operato叶=(constQUADPTSRdata)
{
Node*p=newNode(data);
p->next=NULL
if(tail==NULL
head=tail=p;
else{
tail->next=p;
tail=p;
}
len++;
return*this;
}
QUADPTSRoperator[](size_tn)
{
Node*p=head;
for(size_ti=1;i<=n;i++){
p=p_>next;
}
returnp->data;
}
};
Para.h:
#pragmaonce
#ineludevstring>
#inelude
#inelude"quad.h"
#include"Canvas.h"
usingnamespacestd;
classPara:
publicQuadrangle
{
public:
Para(intw=5,inth=7,stringnm="Parallelogram"):
width(w),height(h),
Quadrangle(nn){};
~Para(){};
voiddraw()const{Canvas:
:
drawQuad(this);};
doublearea()const{returnwidth*height;};
stringwhat()const{returnQuadrangle:
:
what();};
int&Width(){returnwidth;};//获取矩形的宽。
如果是梯形,还需要一个成员int&Width2()
来获取另一条平行边的长度
int&Height(){returnheight;};//获取矩形的高
friendostream&operator<<(ostream&os,constPara&c3);
Para&operator=(constPara&pa)
{
name=pa.name;
width=pa.width;
height=pa.height;
return*this;
}
protected:
intwidth;
intheight;
};
Quad.h:
#pragmaonce
#include
#include"Canvas.h"
usingnamespacestd;
classQuadrangle
{
protected:
public:
stringname;//形体的标识
Quadrangle(stringnm="Quadrangle"):
name(nn){}
virtual
string
doublearea()
const=0;returnname;};
what()
const{
virtual
void
draw()
const=0;
};
typedefQuadrangle*QUADPTjR
Rect.h:
#pragmaonce
#include
#include
#include"para.h"
#include"Canvas.h"
usingnamespacestd;
classRect:
publicPara
{
public:
Rect(intw=4,inth=8,stringnm="Rectangle"):
Para(w,h,nn){};
~Rect(){};
stringwhat()const{returnPara:
:
what();};
doublearea()const{returnPara:
:
area();}
voiddraw()const{Canvas:
:
drawQuad(this);}
intWidth()const{returnwidth;}
intHeight()const{returnheight;}
friendostream&operator<<(ostream&os,constRect&c1);
Rect&operator=(constRect&re)
{
name=re.name;
width=re.width;
height=re.height;
return*this;
};
Resource*:
〃{{NO_DEPENDENCIES}}
//MicrosoftVisualC++generatedineludefile.
//Usedbyexperiment.rc
//
#define
IDM_ABOUTBOX
0x0010
#define
IDD_ABOUTBOX
100
#define
IDS_ABOUTBOX
101
#define
IDDEXPERIMENTDIALOG102
#define
IDR_MAINFRAME
128
#define
IDC_EDIT_ANSWER
1000
#define
IDC_BUTTON_SUBMIT
1001
#define
IDC_BUTTON_NEXT
1002
#define
IDCBUTTONSTOP
1003
#define
IDC_EDIT_RESULT
1004
#define
IDC_STATIC_GROUP
1005
//Nextdefaultvaluesfornewobjects
//
#ifdefAPSTUDIO_INVOKED
#ifndefAPSTUDIO_READONLY_SYMBOLS
#define_APS_NEXT_RESOURCE_VALUE129
#define_APS_NEXT_COMMAND_VALUE32771
#define_APS_NEXT_CONTROL_VALUE1006
#define_APS_NEXT_SYMED_VALUE101
#endif
#endif
Squa.h:
#pragmaonce
#include
#include
#include"rect.h"
#include"Canvas.h"usingnamespacestd;
classSquare:
publicRect
{
public:
~Square(){};
voiddraw()
const{Rect:
:
draw();};
doublearea()
const{returnwidth*width;};
stringwhat()
const{returnRect:
:
what();};
int&Width(){
returnwidth;};
friendostream&operator<<(ostream&os,constSquare&c4);
Square(intw=6,stringnm="Square"):
Rect(w,w,nn){};
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 C+ 实验 报告