2023年面向对象程序设计(C++) 实验指导书_第1页
2023年面向对象程序设计(C++) 实验指导书_第2页
2023年面向对象程序设计(C++) 实验指导书_第3页
2023年面向对象程序设计(C++) 实验指导书_第4页
2023年面向对象程序设计(C++) 实验指导书_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

实验1类和对象

1.1实验目的和规定

(1)理解类和对象的概念,掌握声明类和定义对象的方法。

(2)掌握构造函数和析构函数的实现方法。

(3)初步掌握使用类和对象编制C++程序。

(4)掌握对象数组、对象指针和string类的使用方法。

(5)掌握使用对象、对象指针和对象引用作为函数参数的方法。

(6)掌握类对象作为成员的使用方法。

(7)掌握静态数据成员和静态成员函数的使用方法。

(8)理解友元的概念和掌握友元的使用方法。

1.2实验内容和环节

1.输入下列程序

//1est4—1.cpp

#include<iostream>

usingnamespacestd;

classCoordinate

{public:

Coordinate(intx1,inty1)

{x=x1;

y=yi;

}

Coordinate(Coordinate&p);

-Coordinate()

{cout«”Destructorisca1Ieded\n”;}

intgetx()

{returnx;}

intgety()

{returny;}

private:

intx,y;

);

Coordinate::Coordinate(Coordinate&p)

{x=p.x;

y=P.y;

cout«,,copy-initializationConstructouisca11ed\n,,;

)

intmain()

{Coordinatep1(3,4);

Coordinatep2(pl);

Coordinatep3=p2;

cout<<,,p3=C«p3.getx()«V«p3.gety()<<")\n";

return(0);

)

(1)写出程序的运营结果。

(2)将Coordinate类中带有两个参数的构造函数进行修改,在函数体内增添下述语句:

cout<<,,Constructorisca11ed.\n";

写出程序的运营结果,并解释输出结果。

(3)按下列规定进行调试:

在主函数体内,添加下列语句:

Coordinatep4;

Coordinatap5(2);

调试程序时会出现什么错误?为什么?如何对己有的构造函数进行适当修改?

(4)通过以上第(2)步和第(3)步的修改后,结合运营结果分析:创建不同的对象时会调用

不同的构造函数。

2.设计一个4*4魔方程序,让魔方的各行值的和等于各列值的和,并且等于两对角线值

的和。例如一下魔方:

313525

9211915

17131123

727291

各行、各列以及对角线值的和都是64.

【提醒】

求4*4魔方的一般环节如下:

(1)设立初始魔方的起始值和相邻元素之间的差值。例如上述魔方的初始魔方的起始值

(first)和相邻元素之间的差值(step)分别为:

first=l

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,yl),B(x2,y2)

Distancel=dl

Distancel=d2

其中:xl、x2、yl、y2为指定的坐标值,d1和d2为两个坐标点之间的距离。

【提醒】

类Location的参考框架如下:

classLocation{

public:

Location(double,double);

doubleGetx()

doubleGety()

doub1edistance(Location&);

frienddoubledistance(Location&,Location&);

private:

doublex,y;

};

4.声明一个Student类,在该类中涉及一个数据成员score(分数)、两个静态数据成员total_sc

ore(总分)和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

#includeViostream>

usingnamespacestd;

classBase{

public:

voidsetx(inti)

{x=i;}

Intgetx()

{returnx;}

public:

intx;

};

c1assDerived:pub1icBase{

public:

voidsety(inti)

{y=i;}

intgety()

{returny;}

voidshow()

{cout«,,Base::x=,,<<x<<endl;

public:

inty;

);

intmain()

{Derivedbb;

bb,setx(16);

bb.sety(25);

bb.show();

coutBase::x="<<bb.x<<endl;

cout«^,Derived::y=,,«bb.y<<endl;

cout<<,,Base::x="<<bb.getx()«endl;

cout<<^Derived::y=,,<<bb.gety()<<endl;

return0;

)

(1)写出程序的运营结果。

(2)按以下规定,对程序进行修改后再调试,指出调试中犯错的因素。

①将基类Base中数据成员x的访问权限改为Private^,会出现哪些错误?为什么?

②将基类Base中数据成员x的访问权限改为protected时,会出现哪些错误?为什

么?

③在源程序的基础上,将派生类Derived的继承方式改为private时,会出现哪些错

误?为什么?

④在源程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错

误?为什么?

2.编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、

系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。规定将编号、姓名、性别、

年龄的输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher

的基类。

供参考的类结构如下:

classPerson{

);

c1assStudent:publicPerson{

);

classTeacher:pub1icPerson(

};

3.按规定阅读、编辑、编译、调试和运营以下程序。

(1)阅读、编辑、编译、调试和运营以下程序,并写出程序的运营结果。

//test4_3_1.cpp

#include<iostream>

#inc1ude<string>

usingnamespacestd;

classMyArray{

public:

MyArray(intleng);

-MyArray{};

voidInput();

voidDisplay(string);

protected:

int*alist;

intlength;

);

MyArray::MyArray(int1eng)

{if(leng<=0)

{cout<<,,errorlength^;

exit(1);

)

alist=newint[1eng];

length=1eng;

if(alist==NULL)

{coutVv”assignfai1ure

exit(1);

)

cout<v"MyArray类对象已创建。"<<end1;

MyArray::〜MyArray()

{de1ete[]alist;

coutV<"MyArray类对象被撤消。ndl;

)

voidMyArray::Display(stringstr)

{inti;

int*p=a1ist;

cout«str<<lengthv<"个整数:";

for(i=0;i<length;i++,p++)

cout«*p«,,n;

cout<<end1;

voidMyArray::Input{}

{cout<V”请键盘输入"<<length<V"个整数:";

inti;

int*p=alist;

for(i=0;i<1ength;i++,p++)

cin»*p;

}

intmain()

{MyArraya(5);

a.Input();

a.Display("显示已输入的”);

return0;

)

(2)声明一个类SortArray继承类MyArray,在该类中定义一个函数,具有将输入的整

数从小到大进行排序的功能。

【提醒】

在第(1)步的基础上可增长下面的参考框架:

c1assSortArray:publicMyArray{

public:

voidSort();

SortArray(int1eng):MyArray(leng)

{cout<<,,SortArray类对象已创建。”<Vendl;

virtual〜SortArray();

);

SortArray:SortArray()

{cout«9,SortArray类对象被撤消。"<endl;

}

voidSortArray::Sort()

(

//请自行编写Sort函数的代码,将输入的整数从小到大排序。

)

//并将主函数修改为:

intmain()

{SortArraya(5);

s.Input();

s.Display("显示排序以前的”);

s.Sort();

s.Display(“显示排序以后的");

return0;

)

声明一个类ReArray继承类MyArray,在该类中定义一个函数,具有将输入的整数进

行倒置的功能。

【提醒】

在第(1)步的基础上可增长下面的参考框架:

ClassReArray:pub1icMyArray{

Public:

Voidreverse();

ReArray(int1eng);

Virtual-ReArray();

);

请读者自行编写构造函数、析构函数和倒置函数ReArray,以及修改主函数。

(3)声明一个类AverArray继承类MyArray,在该类中定义一个函数,具有求输入

的整数平均值的功能。

【提醒】

在第(1)步的基础上增长下面的参考框架:

classAverArrayipublicMyArray{

Public:

AverArray(int1eng);

~AverArray();

DoubleAver();

);

请读者自行编写构造函数、析构函数和求平均值函数Aver(求解整数的平均值),以及

修改主函数。

(2)声明一个NewArray类,同时继承了类SortArray,ReArray和AverArray,使得类

NewArray的对象同时具有排序、倒置和求平均值的功能。在继承的过程中声明MyArr

ay为虚基类,体会虚基类在解决二义性问题中的作用。

实验3多态性

3.1实验目的和规定

(1)了解多态性的概念。

(2)掌握运算符重载的基本方法。

(3)掌握虚函数的定义和使用方法。

(4)掌握纯虚函数和抽象类的概念和用法。

3.2实验内容与环节

1.分析并调试下列程序,写出程序的输出结果,并解释输出结果。

//test5_l.cpp

#inc1ude<iostream>

usingnamespacestd;

classB{

public:

virtua1voidfl(doublex)

{cout<v"B::f1(double),,«x<<end1;

)

voidf2(doub1ex)

{coutvv"B::f2(double)”<<2*x«end1;

)

voidf3(doublex)

{cou:f3(double)''<<3*x<<endl;

)

)

classD:publicB{

public:

virtualvoidf1(doublex)

{cout«MD::fl(double),,<<x«endl;

)

voidf2(doublex)

{cout«,5D::f2(double)”<<2*x<<end1;

)

voidf3(doublex)

{cout«,D::f3(double),,«3*x«end1;

);

intmain()

{Dd;

B*pb=&d;

D*pd=&d;

pb->fl(l.23);

pb->fl(1.23);

pb->f2(1.23);

Pb->f3(1.23);

pb->f3(3.14);

return0;

)

2.编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,

通过重载操作符实现两个时间的相加。规定将小时范围限制在大于等于0,分钟范围

限制在0〜59,秒钟范围限制在0〜59秒。

【提醒】

时间类Time{

publie:

Time(inth=0,intm=0,ints=0);

Timeoperator+(Time&);

voiddisptime(string);

private:

inthourse;

intminutes;

intseconds;

);

3.给出下面的抽象基类container;

classcontainer

(

protected:

doubleradius;

pub1ic:

container(doubleradiusl);

virtualdoub1esurface_area()=0;

virtualdoub1evo1ume()=0;

);

规定建立3个继承container的派生类cube、sphere与cylinder,让每一个派生

类都包含虚函数surface_area()和volume。,分别用来计算正方体、球体和圆柱体的

表面积及体积。规定写出主程序,应用C++的多态性,分别计算边长为6.0的正方体、

半径为5.0的球体,以及半径为5.0和高为6.0的圆柱体的表面积和体积。

4.编写一个程序,用于进行集合的并、差和交运算。例如输入整数集合{954367}

和{2469},计算出它们进行集合的并、差和交运算后的结果。

【提醒】

i.可用以下表达式实现整数集合的基本运算:

sl+s2两个整数集合的并运算

sl-s2两个整数集合的差运算

sl*s2两个整数集合的交运算

ii.参考以下Set类的框架,用于完毕集合基本运算所需的各项功能。

c1assset{

publie:

set::set();

voidset::input(intd);

intset::length();

intset::getd(inti);

voidset::disp();

setset::operator+(setsi);

setset::operator-(setsi);

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<iostream>

usingnamespacestd;

template<typenameT>

Tmax(Tx,Ty)

{returnx>y?x:y;

)

intmax(inta,intb)

{returna>b?a:b;

)

doub1emax(doublea,doubleb)

{returna>b?a:b;

intmain()

{cout<<"max('3','7')is“<Vmax('3',7)V<endl;

return0;

)

(2)

//test6_1_2.cpp

#include<iostream>

usingnamespacestd;

intmax(inta,intb)

{returna>b?a:b;

)

doub1emax(doub1ea,doub1eb)

{returna>b?a:b;

)

intmain()

{cout〈v”maxC3isu«maxC3,,,7,)«end1;

return0;

}

2.编写一个求任意类型数组中最大元素和最小元素的程序,规定将求最大元素和最小元素

的函数设计成函数模板。

3.编写一个程序,使用类模板对数组元素进行排序、倒置、查找和求和。

【提醒】

设计一个类模板

temp1ate<classType>

c1assArray(

};

具有对数组元素进行排序、倒置、查找和求和功能,然后产生类型实参分别为int型和double

型的两个模板类,分别对整型数组与双精度数组完毕所规定的操作。

4,编写一个程序,求输入数的平方根。设立异常解决,对输入负数的情况给出提醒。

实验5C++的流类库与输入输出

5.1实验目的和规定

(1)掌握C++格式化的输入输出方法。

(2)掌握重载运算符和“>>”的方法。

(3)掌握磁盘文献的输入输出方法。

5.2实验内容和环节

1.下面给出的test711.cpp程序用于打印九九乘法表,但程序中存在错误。请上机调

试,使得此程序运营后,可以输出如下所示的九九乘法表。

*123456789

11

224

3369

4481216

5510152025

661218243036

77142128354249

8816243240485664

991827364554637281

//test7.1—1.cpp

#inc1ude<iostream>

#inc1ude<iomanip>

usingnamespacestd;

intmain()

(

inti,j;

cout«,,*";

for(i=l;i<=9;

温馨提示

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

评论

0/150

提交评论