《面向对象程序设计》C++实验指导书.docx
- 文档编号:10786162
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:23
- 大小:27.68KB
《面向对象程序设计》C++实验指导书.docx
《《面向对象程序设计》C++实验指导书.docx》由会员分享,可在线阅读,更多相关《《面向对象程序设计》C++实验指导书.docx(23页珍藏版)》请在冰豆网上搜索。
《面向对象程序设计》C++实验指导书
实验1类和对象
1.1实验目的和要求
(1)理解类和对象的概念,掌握声明类和定义对象的方法。
(2)掌握构造函数和析构函数的实现方法。
(3)初步掌握使用类和对象编制C++程序。
(4)掌握对象数组、对象指针和string类的使用方法。
(5)掌握使用对象、对象指针和对象引用作为函数参数的方法。
(6)掌握类对象作为成员的使用方法。
(7)掌握静态数据成员和静态成员函数的使用方法。
(8)理解友元的概念和掌握友元的使用方法。
1.2实验内容和步骤
1.输入下列程序
//test4-1.cpp
#include
usingnamespacestd;
classCoordinate
{public:
Coordinate(intx1,inty1)
{x=x1;
y=y1;
}
Coordinate(Coordinate&p);
~Coordinate()
{cout<<”Destructoriscalleded\n”;}
intgetx()
{returnx;}
intgety()
{returny;}
private:
intx,y;
};
Coordinate:
:
Coordinate(Coordinate&p)
{x=p.x;
y=p.y;
cout<<”copy-initializationConstructouiscalled\n”;
}
intmain()
{Coordinatep1(3,4);
Coordinatep2(p1);
Coordinatep3=p2;
cout<<”p3=(“< return(0); } (1)写出程序的运行结果。 (2)将Coordinate类中带有两个参数的构造函数进行修改,在函数体内增添下述语句: cout<<”Constructoriscalled.\n”; 写出程序的运行结果,并解释输出结果。 (3)按下列要求进行调试: 在主函数体内,添加下列语句: Coordinatep4; Coordinatap5 (2); 调试程序时会出现什么错误? 为什么? 如何对已有的构造函数进行适当修改? (4)经过以上第 (2)步和第(3)步的修改后,结合运行结果分析: 创建不同的对象时会调用不同的构造函数。 2.设计一个4*4魔方程序,让魔方的各行值的和等于各列值的和,并且等于两对角线值的和。 例如一下魔方: 313525 9211915 17131123 727291 各行、各列以及对角线值的和都是64. 【提示】 求4*4魔方的一般步骤如下: (1)设置初始魔方的起始值和相邻元素之间的差值。 例如上述魔方的初始魔方的起始值(first)和相邻元素之间的差值(step)分别为: first=1 step=2 (2)设置初始魔方元素的值。 例如上述魔方的初始魔方为: 1357 9111315 17192123 25272931 (3)生成最终魔方。 方法如下: 求最大元素值与最小元素值的和sum,该实例的sum是: 1+31=32 用32减去初始魔方所有对角线上元素的值,然后将结果放在原来的位置,这样就可求得最终魔方。 本例最终魔方如下: 313525 9211915 17131123 727291 本题的魔方类magic的参考框架如下: classmagic {public: voidgetdata(); voidsetfirstmagic(); voidgeneratemagic(); voidprintmagic(); private: intm[4][4]; intstep; intfirst; intsum; }; 3.设计一个用来表示直角坐标系的Location类,在主程序中创建类Location的两个对象A和B,要求A的坐标点在第3象限,B的坐标在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离,要求按如下格式输出结果: A(x1,y1),B(x2,y2) Distance1=d1 Distance1=d2 其中: x1、x2、y1、y2为指定的坐标值,d1和d2为两个坐标点之间的距离。 【提示】 类Location的参考框架如下: classLocation{ public: Location(double,double); doubleGetx() doubleGety() doubledistance(Location&); frienddoubledistance(Location&,Location&); private: doublex,y; }; 【【【#include"iostream.h" #include"math.h" classLocation{ private: intx,y; public: Location(inti,intj): x(i),y(j){} intGetx(){returnx;} intGety(){returny;} doubledistance(Locationb); frienddoubledistance(Location&a,Location&b); }; doubledistance(Location&a,Location&b)//友元函数 {intdx=a.x-b.x; intdy=a.y-b.y; returnsqrt(dx*dx+dy*dy);} doubleLocation: : distance(Locationb)//成员函数 {intdx=x-b.x; intdy=y-b.y; returnsqrt(dx*dx+dy*dy);} voidmain() { LocationA(-10,-20),B(-40,60); cout<<"A("< doubled=A.distance(B);//调用成员函数 cout<<"Distance1="< cout<<"Distance2="< 】】】 4.声明一个Student类,在该类中包括一个数据成员score(分数)、两个静态数据成员total_score(总分)和count(学生人数);还包括一个成员函数account()用于设置分数、累计学生成绩之和、累计学生人数,一个静态成员函数sum()用于返回学生的成绩之和,另一个静态成员函数average()用于求全班成绩的平均值。 在main函数中,输入某班同学的成绩,并调用上述函数求出全班学生的成绩之和和平均分。 5.使用C++的string类,将5个字符串按逆转后的顺序显示出来。 例如,逆转前的5个字符串是: GermanyJapanAmericaBritainFrance 按逆转后的顺序输出字符串是: FranceBritainAmericaJapanGermany 实验2派生类与继承 2.1实验目的和要求 (1)掌握派生类的声明方法和派生类构造函数的定义方法。 (2)掌握不同继承方式下,基类成员在派生类中的访问属性。 (3)掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。 (4)学习虚基类在解决二义性问题中的作用。 2.2实验内容与步骤· 1.输入下列程序。 //test4_1.cpp #include usingnamespacestd; classBase{ public: voidsetx(inti) {x=i;} Intgetx() {returnx;} public: intx; }; classDerived: publicBase{ public: voidsety(inti) {y=i;} intgety() {returny;} voidshow() {cout<<”Base: : x=”< } public: inty; }; intmain() {Derivedbb; bb,setx(16); bb.sety(25); bb.show(); cout<<”Base: : x=”< cout<<”Derived: : y=”< cout<<”Base: : x=”< cout<<”Derived: : y=”< return0; } (1)写出程序的运行结果。 (2)按以下要求,对程序进行修改后再调试,指出调试中出错的原因。 将基类Base中数据成员x的访问权限改为private时,会出现哪些错误? 为什么? 将基类Base中数据成员x的访问权限改为protected时,会出现哪些错误? 为什么? 在源程序的基础上,将派生类Derived的继承方式改为private时,会出现哪些错误? 为什么? 在源程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错误? 为什么? 2.编写一个学生和教师的数据输入和显示程序。 学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。 要求将编号、姓名、性别、年龄的输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的基类。 供参考的类结构如下: classPerson{ ... }; classStudent: publicPerson{ ... }; classTeacher: publicPerson{ ... }; 3.按要求阅读、编辑、编译、调试和运行以下程序。 (1)阅读、编辑、编译、调试和运行以下程序,并写出程序的运行结果。 //test4_3_1.cpp #include #include usingnamespacestd; classMyArray{ public: MyArray(intleng); ~MyArray{}; voidInput(); voidDisplay(string); protected: int*alist; intlength; }; MyArray: : MyArray(intleng) {if(leng<=0) {cout<<”errorlength”; exit (1); } alist=newint[leng]; length=leng; if(alist==NULL) {cout<<”assignfailure”; exit (1); } cout<<”MyArray类对象已创建。 ”< } MyArray: : ~MyArray() {delete[]alist; cout<<”MyArray类对象被撤销。 ”< } voidMyArray: : Display(stringstr) {inti; int*p=alist; cout< “; for(i=0;i cout<<*p<<””; cout< } voidMyArray: : Input{} {cout<<”请键盘输入”< ”; inti; int*p=alist; for(i=0;i cin>>*p; } intmain() {MyArraya(5); a.Input(); a.Display(“显示已输入的”); return0; } (2)声明一个类SortArray继承类MyArray,在该类中定义一个函数,具有将输入的整数从小到大进行排序的功能。 【提示】 在第 (1)步的基础上可增加下面的参考框架: classSortArray: publicMyArray{ public: voidSort(); SortArray(intleng): MyArray(leng) {cout<<”SortArray类对象已创建。 ”< } virtual~SortArray(); }; SortArray: : ~SortArray() {cout<<”SortArray类对象被撤销。 ”< } voidSortArray: : Sort() { //请自行编写Sort函数的代码,将输入的整数从小到大排序。 } //并将主函数修改为: intmain() {SortArraya(5); s.Input(); s.Display(“显示排序以前的”); s.Sort(); s.Display(“显示排序以后的”); return0; } 声明一个类ReArray继承类MyArray,在该类中定义一个函数,具有将输入的整数进行倒置的功能。 【提示】 在第 (1)步的基础上可增加下面的参考框架: ClassReArray: publicMyArray{ Public: Voidreverse(); ReArray(intleng); Virtual~ReArray(); }; 请读者自行编写构造函数、析构函数和倒置函数ReArray,以及修改主函数。 (3)声明一个类AverArray继承类MyArray,在该类中定义一个函数,具有求输入的整数平均值的功能。 【提示】 在第 (1)步的基础上增加下面的参考框架: classAverArray: publicMyArray{ Public: AverArray(intleng); ~AverArray(); DoubleAver(); }; 请读者自行编写构造函数、析构函数和求平均值函数Aver(求解整数的平均值),以及修改主函数。 (2)声明一个NewArray类,同时继承了类SortArray,ReArray和AverArray,使得类NewArray的对象同时具有排序、倒置和求平均值的功能。 在继承的过程中声明MyArray为虚基类,体会虚基类在解决二义性问题中的作用。 实验3多态性 3.1实验目的和要求 (1)了解多态性的概念。 (2)掌握运算符重载的基本方法。 (3)掌握虚函数的定义和使用方法。 (4)掌握纯虚函数和抽象类的概念和用法。 3.2实验内容与步骤 1.分析并调试下列程序,写出程序的输出结果,并解释输出结果。 //test5_1.cpp #include usingnamespacestd; classB{ public: virtualvoidf1(doublex) {cout<<”B: : f1(double)”< } voidf2(doublex) {cout<<”B: : f2(double)”<<2*x< } voidf3(doublex) {cout<<”B: : f3(double)”<<3*x< } } classD: publicB{ public: virtualvoidf1(doublex) {cout<<”D: : f1(double)”< } voidf2(doublex) {cout<<”D: : f2(double)”<<2*x< } voidf3(doublex) {cout<<”D: : f3(double)”<<3*x< } }; intmain() {Dd; B*pb=&d; D*pd=&d; pb->f1(1.23); pb->f1(1.23); pb->f2(1.23); pb->f3(1.23); pb->f3(3.14); return0; } 2.编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现两个时间的相加。 要求将小时范围限制在大于等于0,分钟范围限制在0~59,秒钟范围限制在0~59秒。 【提示】 时间类Time{ public: Time(inth=0,intm=0,ints=0); Timeoperator+(Time&); voiddisptime(string); private: inthourse; intminutes; intseconds; }; 3.给出下面的抽象基类container; classcontainer { protected: doubleradius; public: container(doubleradius1); virtualdoublesurface_area()=0; virtualdoublevolume()=0; }; 要求建立3个继承container的派生类cube、sphere与cylinder,让每一个派生类都包含虚函数surface_area()和volume(),分别用来计算正方体、球体和圆柱体的表面积及体积。 要求写出主程序,应用C++的多态性,分别计算边长为6.0的正方体、半径为5.0的球体,以及半径为5.0和高为6.0的圆柱体的表面积和体积。 4.编写一个程序,用于进行集合的并、差和交运算。 例如输入整数集合{954367}和{2469},计算出它们进行集合的并、差和交运算后的结果。 【提示】 i.可用以下表达式实现整数集合的基本运算: s1+s2两个整数集合的并运算 s1-s2两个整数集合的差运算 s1*s2两个整数集合的交运算 ii.参考以下Set类的框架,用于完成集合基本运算所需的各项功能。 classset{ public: set: : set(); voidset: : input(intd); intset: : length(); intset: : getd(inti); voidset: : disp(); setset: : operator+(sets1); setset: : operator-(sets1); setset: : operator*(sets1); setset: : operator=(sets1); protected: intlen; ints[MAX]; }; 实验4模板与异常处理 4.1实验目的和要求 (1)正确理解模板的概念。 (2)掌握函数模板和类模板的声明和使用方法。 (3)学习简单的异常处理方法。 4.2实验内容和步骤 1.分析并调试下列程序,写出运行结果并分析原因。 (1) //test6_1_1.cpp #include usingnamespacestd; template Tmax(Tx,Ty) {returnx>y? x: y; } intmax(inta,intb) {returna>b? a: b; } doublemax(doublea,doubleb) {returna>b? a: b; } intmain() {cout<<”max(‘3’,’7’)is“< return0; } (2) //test6_1_2.cpp #include usingnamespacestd; intmax(inta,intb) {returna>b? a: b; } doublemax(doublea,doubleb) {returna>b? a: b; } intmain() {cout<<”max(‘3’,’7’)is“< return0; } 2.编写一个求任意类型数组中最大元素和最小元素的程序,要求将求最大元素和最小元素的函数设计成函数模板。 3.编写一个程序,使用类模板对数组元素进行排序、倒置、查找和求和。 【提示】 设计一个类模板 template classArray{ ... }; 具有对数组元素进行排序、倒置、查找和求和功能,然后产生类型实参分别为int型和double型的两个模板类,分别对整型数组与双精度数组完成所要求的操作。 4.编写一个程序,求输入数的平方根。 设置异常处理,对输入负数的情况给出提示。 实验5C++的流类库与输入输出 5.1实验目的和要求 (1)掌握C++格式化的输入输出方法。 (2)掌握重载运算符“<<”和“>>”的方法。 (3)掌握磁盘文件的输入输出方法。 5.2实验内容和步骤 1.下面给出的test7_1_1.cpp程序用于打印九九乘法表,但程序中存在错误。 请上机调试,使得此程序运行后,能够输出如下所示的九九乘法表。 *123456789 11 224 3369 4481216 5510152025 661218243036 77142128354249 8816243240485664 991827364554637281 //test7_1_1.cpp #include #include usingnamespacestd; intmain() { inti,j; cout<<”*”; for(i=1;i<=9;i++) cout< cout< for(i=1;i<=9;i++) {cout< for(j=1;j<=i;j++) Cout< } return0; } 2.下面的程序用于统计文件xyz.txt中的字符个数,请填空完成程序。 //test7_2_1.cpp #include #include us
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计 面向 对象 程序设计 C+ 实验 指导书