面向对象程序设计实验任务和指导(1).doc_第1页
面向对象程序设计实验任务和指导(1).doc_第2页
面向对象程序设计实验任务和指导(1).doc_第3页
面向对象程序设计实验任务和指导(1).doc_第4页
面向对象程序设计实验任务和指导(1).doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

分类:本科教学/课程/面向对象/2014/实验任务及指导文档发表日期:2012-04-14最近修改日期:2014-09-01面向对象程序设计实验任务及指导目录一、实验1:熟悉实验环境二、实验2:数据抽象三、实验3:继承与多态性三、实验4:重载和I/O流及面向对象程序设计一、实验1:熟悉实验环境【实验目的】l 熟悉Visual C+6.0开发环境。l 掌握多文件结构程序项目的建立过程。l 初步掌握面向对象程序的多文件结构项目的开发运行步骤。【实验内容】1、学习多文件结构程序项目的建立过程,观看、体会演示。2、下面的程序在编译时会出错,请修改程序,使之能正确运行。#include /#include iostream 或 #include iostream.h/#include文件名:使用表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;使用双引号”则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。一般使用双引号”. .h是引用C语言库.using namespace std; class MyClass public: MyClass() x=0;y=0; MyClass(int a = 0, b = 0); Print(); private: int x, y; ; MyClass:MyClass(int a = 0, int b =0) x = a; y = b; void MyClass:Print() cout x = x endl; cout y = y endl; int main() MyClass obj1,obj2(5,8);obj1.x =1;obj1.y =3;obj1.Print();obj2.Print();return 0;3、将任务2得到的正确程序分成3个文件。文件MyClass.h包括类的定义,文件MyClass.cpp包括类成员函数的实现,文件App.cpp包括类的使用。调试、运行该程序,使之获得正确结果。4已知两个矩形的长和宽,用面向对象的概念编程求它们的面积和周长。假设矩形 1 的长和宽分别为 20 和 50;矩形 2 的长和宽分别为 3.6 和 4.5。(先定义矩形类再实例化两个对象)5. 将教材7.1.3例题改造成面向对象的C+程序。使用单链表来存储集合元素。定义node类和Set类。【实验指导】1、头文件中通常包含常量、类型、函数原型的定义。类是用户定义的类型,故将类的定义放在头文件中。函数的定义即函数的实现应放在实现文件.cpp文件中。这样的安排体现了信息隐藏和模块化。将类成员函数的实现和类的使用放在不同的cpp文件中,可将类的实现与类的使用分离,体现了对接口编程的思想。2、文件MyClass.h中的结构#include using namespace std; / MyClass的定义 文件MyClass.cpp中的结构#include “MyClass.h” / MyClass成员函数的定义 文件App.cpp中的结构#include “MyClass.h” / main函数的定义 3、避免头文件内容被重复引入。头文件内容被重复引入会导致标识符重复定义的错误。用预编译条件指令来限制头文件内容的引入。例如:#ifndef MYCLASS#define MYCLASS/ MyClass.h头文件的内容#endif说明: #ifndef /如果没有定义#define /定义. . #endif 在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,这样如果有两个地方都包含这个头文件,就不会出现两次包含的情况 。因为在第二次包含时标识已经有定义了,所以就不再 include了.二、实验2:数据抽象【实验目的】l 掌握类的定义和使用以及类对象的声明和使用方法,理解具有不同访问属性的成员的访问方式。l 掌握构造函数和析构函数的作用和编写方法。l 了解并掌握静态成员、常成员的使用。【实验内容】1、下面程序中定义了一个整型动态数组,编写了3个构造函数。#include using namespace std; class IntArray public:IntArray(int sz); / 数组初始化为sz个元素,初值全为0 IntArray( int *array, int sz ) ; / 用静态数组array的前sz个元素初始化新数组 IntArray( const IntArray &rhs ) ; / 拷贝构造函数 void printAll();private:int *ia;int size;IntArray:IntArray( int sz ) size = sz; / 设置数据成员 ia = new int size ; for ( int ix=0; ix size; +ix ) iaix = 0; / 初始化数组元素IntArray: IntArray( int *array, int sz ) size = sz; / 设置数据成员 ia = new int size ; for ( int ix=0; ix size; +ix ) iaix = array ix ; / 拷贝数据成员IntArray: IntArray( const IntArray &rhs ) size = rhs.size; ia = new int size ; for (int ix = 0; ix size; ix+ ) ia ix = rhs.ia ix ; void IntArray:printAll() for ( int ix=0; ix size; +ix ) coutiaix ; coutendl;int main()int a10=1,2,3,4,5,6,7,8,9,10;IntArray arr1(10), arr2(a,5),arr3(arr2);arr1.printAll();arr2.printAll();arr3.printAll();return 0;(1)为IntArray加上析构函数并编译运行程序,体会类的构造函数和析构函数的作用。(2)程序中,类IntArray的三个构造函数都是以相似的方式来实现的。一般来说,当两个或多个函数重复相同的代码时,可将这部分代码抽取出来,形成独立的函数,以便共享。以后如果需要改变这些实现,则只需改变一次,而且这种实现的共享本质更容易为大家所理解。怎样把构造函数中的代码抽取出来形成独立的共享函数呢?请给出一种可能的实现。按你给出的实现方法修改程序并重新编译运行。2、设有一个点myPoint类的定义如下:class myPoint public: myPoint(double x0=0.0,double y0=0.0):x(x0),y(y0) myPoint(myPoint &np):x(np.x),y(np.y) double GetX() return x; double GetY() return y; void SetX(double x0) x=x0; void SetY(double y0) x=y0; void SetPoint(double x0,double y0) x=x0;y=y0; void SetPoint(myPoint &np) x=np.x; y=np.y; double GetLength(myPoint p) return sqrt(x-p.x)*(x-p.x) +(y-p.y)*(y-p.y); void Printit() cout (x,y) ;private: double x ,y;试定义一个三角形Triangle类,在Triangle类中以点myPoint类的3个对象p1、p2、p3作为数据成员,表示三角形的三个顶点。Triangle类具有计算三角形的周长和面积的功能。请编写程序上机调试并运行。3. 编写栈类stack,要求栈类可以进行入栈和出栈操作,还可以查看栈顶元素的值。栈类中的每个节点为一个类node对象。 Node类含有两个成员:int data,node *prev。【实验指导】1、(1)可参考教材第192页关于“浅复制”和“深复制”的示例来实现析构函数的定义。(2)在类中将构造函数的代码抽取出来形成独立的函数,然后在构造函数中调用执行,注意函数参数的设置和定义。2、 由于在Triangle类中需要定义myPoint类的对象,因此需要在Triangle类的构造方法的成员初始化列表中实现对成员对象的初始化。三、实验3:继承与多态性【实验目的】l 掌握继承的概念,能够定义和使用类的继承关系。l 了解在派生类中如何使用基类的成员以及基类成员在派生类中的访问控制特性。l 理解虚基类在解决二义性问题中的作用。l 理解静态多态性和动态动态性的含义。掌握使用虚函数和继承实现动态多态性的方法。【实验内容】1、有如下的程序:#include using namespace std;class Basepublic : Base(int p1, int p2) data1 = p1; data2 = p2; int Inc1( ) return +data1; int Inc2( ) return +data2; void Display() coutdata1 = data1 data2 = data2 endl; protected:int data1, data2;class D1 : public Base public : D1(int p1, int p2, int p3) : Base(p1, p2) data3 = p3; int Inc1( ) return Base:Inc1( ); int Inc3( ) return +data3; void Display( ) coutdata1 = data1 data2 = data2 data3 = data3 endl; coutBase:Display() -;Base:Display( ); protected: int data3;class D2 : public Base public : D2(int p1, int p2, int p4) : Base(p1, p2) data4 = p4; int Inc1() Base:Inc1( ); Base:Inc2( ); return Base:Inc1( ); int Inc4( ) return +data4; void Display( ) coutdata1 = data1 data2 = data2 data4 = data4 endl; coutBase:Display() -;Base:Display( ); protected: int data4;class D12 : public D1, public D2 public : D12(int p11,int p12,int p13,int p21,int p22,int p23,int p) : D1(p11, p12, p13), D2(p21, p22, p23) data5 = p; int Inc1( ) D1:Inc1(); D2:Inc1( ); return D1:Inc1( ); int Inc5( ) return +data5; void Display( ) coutdata1 = data1 data2 = data2 endl; / cout data3 = data3 data4 = data4 data5 = data5 endl; cout D1:Display( )-; D1:Display( ); cout D2:Display( )-; D2:Display( );private: int data5;int main() D12 d(1, 2, 3, 4, 5, 6, 7); d. Display( ); cout endl; d.Inc1();d.Inc2(); / d.Inc3(); d.Inc4(); d.Inc5(); d.D12:Inc1(); d.Display(); return 0;(1)这个程序在编译时会出现错误,请根据出错提示信息找出出错的原因。(2)修改程序中的错误,使之能正确运行。2、设有一个点类Point的定义如下:Point public:Point() x = 0; y = 0; Point(double xv,double yv) x = xv;y = yv;Point(Point& pt) x = pt.x; y = pt.y; double getx() return x; double gety() return y; double Area() return 0; void Show() coutx=x y=yendl; private:double x,y;编写程序,以点point类为基类,派生出矩形类Rectangle和圆类Circle。矩形由左上角的顶点和长、宽定义。圆由圆心和半径定义。派生类中新增的成员函数position(Point &pt)用于判断任一坐标点是在图形内、还是在图形的边缘上,还是在图形外。 3、设有几何图形的派生关系如下图14-2所示。图14-2 几何图形中类的继承关系对平面图形可求周长和面积,对立体图形可以求体积以及底面图形的周长和底面积。设有主函数如下:int main()Geometric_shape * gs=newCircle(10),new Rectangle(6,8),newTriangle(3,4,5),new Box(6,8,3),newCylinder(10,3),new Cone(10,3),new T_pyramid(3,4,5,3),new T_prism(3,4,5,3); for (int i=0;iShow(); coutendl; for (i=0;iShow(); coutendl;cout平面图形:endl; for (i=0;i3;i+) cout图形周长:perimeter()t; cout图形面积:area()t; cout图形体积:volume()endl; cout立体图形:endl; for (i=3;i8;i+) cout图形底周长:perimeter()t; cout图形底面积:area()t; cout图形体积 :volume()endl; return 0;请编写各类的定义和实现代码,使给定的主函数main可以正确运行。【实验指导】1、在派生类中对基类成员的访问应该是唯一的。但是,在有多重继承的情况下,可能会造成派生类对基类中某个成员的访问出现不唯一的情况,这时就称对基类成员的访问产生了二义性。C+为此提供了虚基类,以解决这种二义性问题。2、由于基类的构造函数不能够被派生类继承。因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类数据成员。所以在定义矩形类Rectangle和圆类Circle的构造函数时,除了对新增数据成员进行初始化,还必须负责调用基类的构造函数使基类数据成员得以初始化。同时,在矩形类Rectangle和圆类Circle还需分别提供计算面积、周长等函数,以满足实际应用的需求。3、用虚函数来实现主程序中的动态联编。即在Geometric_shape类中分别将计算面积、周长、体积等函数声明为虚函数后,就可以在该类的(直接或间接)派生类中定义与其基类虚函数原型相同的函数。这时,当用基类指针指向这些派生类的对象时,系统会自动用派生类中的同名函数来代替基类中的虚函数,从而实现运行时的多态。四、实验4:重载和I/O流及面向对象程序设计【实验目的】l 掌握运算符重载的基本方法。l 掌握标准输入输出的使用及格式控制方法。l 掌握磁盘文件(如二进制文件、文本文件)的输入输出的方法。【实验内容】1、编写程序,重载运算符“”,使用户能直接输入和输出固定电话的号码。电话号码以如下形式输入和输出: (027)xxxxxxxx2、编写一个程序,实现以下功能:(1)输入一系列的学生成绩(包括学号、姓名、成绩等数据)存放在文件stud.dat中。(2)从stud.dat文件中读出这些数据并显示出来。(3)在stud.dat文件中按姓名进行查询,如输入“李”,则将所有姓李的学生的数据都显示出来。所编写的程序运行结果示例如下:选择(1:输入数据 2:输出数据 3:按姓名查找数据 其他退出):1输入数据学生人数:5第1个学生(学号 姓名 成绩):1001 张三 89第2个学生(学号 姓名 成绩):1002 李四 78第3个学生(学号 姓名 成绩):1003 王五 92第4个学生(学号 姓名 成绩):1004 李沅芷 88第5个学生(学号 姓名 成绩):1005 赵六 56选择(1:输入数据 2:输出数据 3:按姓名查找数据 其他退出):2输出数据学号 姓名 成绩 1001 张三 89 1002 李四 78 1003 王五 92 1004 李沅芷 88 1005 赵六 56选择(1:输入数据 2:输出数据 3:

温馨提示

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

评论

0/150

提交评论