C++实验指导书.docx
- 文档编号:28790422
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:32
- 大小:80.66KB
C++实验指导书.docx
《C++实验指导书.docx》由会员分享,可在线阅读,更多相关《C++实验指导书.docx(32页珍藏版)》请在冰豆网上搜索。
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); 调试程序时会出现什么错误? 为什么? 如何对已有的构造函数进行适当修改? #include usingnamespacestd; classCoordinate {public: Coordinate(intx1,inty1) {x=x1; y=y1; cout<<"Constructoriscalled.\n"; } Coordinate() {x=0; y=0; cout<<"Constructoriscalled.\n"; } Coordinate(intx1) {x=x1; y=0; } 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; Coordinatep4; Coordinatep5 (2); cout<<"p3=("< return(0); } (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; }; 源程序: #include classmagic {public: voidgetdata() {first=1,step=2,sum=32; } voidsetfirstmagic() { for(inti=0;i<=3;i++) { for(intj=0;j<=3;j++) {m[i][j]=first+(i*4+j)*step; } } } voidgeneratemagic() { for(inti=0,j=3;(i<4)&&(j>=0);++i,--j) { m[i][i]=sum-m[i][i]; m[i][j]=sum-m[i][j]; } } voidprintmagic() {for(inti=0;i<=3;i++) { for(intj=0;j<=3;j++) { cout< } cout< } } private: intm[4][4]; intstep; intfirst; intsum; } main() {magica; a.getdata(); a.setfirstmagic(); a.generatemagic(); a.printmagic(); } 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 #include classLocation { public: Location(doublea,doubleb) {x=a;y=b; } doubleGetx() {returnx; } doubleGety() {returny; } doubledistance(Location&B) {doubledx=x-B.x; doubledy=y-B.y; returnsqrt(dx*dx+dy*dy); } frienddoubledistance(Location&A,Location&B) {doubledx=A.x-B.x; doubledy=A.y-B.y; returnsqrt(dx*dx+dy*dy); } private: doublex,y; }; voidmain() {LocationA(-1,-1),B(-4,3); cout<<"A("< doubled=A.distance(B); cout<<"Distance1="< cout<<"Distance1="< } 4.声明一个Student类,在该类中包括一个数据成员score(分数)、两个静态数据成员total_score(总分)和count(学生人数);还包括一个成员函数account()用于设置分数、累计学生成绩之和、累计学生人数,一个静态成员函数sum()用于返回学生的成绩之和,另一个静态成员函数average()用于求全班成绩的平均值。 在main函数中,输入某班同学的成绩,并调用上述函数求出全班学生的成绩之和和平均分。 源程序: #include classStudent { public: voidaccount(floatscore1) {score=score1; ++count; totalscore=totalscore+score; } staticfloatsum() {return(totalscore); } staticfloataverage() {return(totalscore/count); } private: floatscore; staticfloattotalscore; staticfloatcount; }; floatStudent: : totalscore=0.0; floatStudent: : count=0.0; voidmain() {StudentA,B,C; A.account(98); B.account(94); C.account(93); cout<<"全班成绩之和: "< "< } 5.使用C++的string类,将5个字符串按逆转后的顺序显示出来。 例如,逆转前的5个字符串是: GermanyJapanAmericaBritainFrance 按逆转后的顺序输出字符串是: FranceBritainAmericaJapanGermany 源程序: #include #include usingnamespacestd; voidmain() { stringstr[5]; cout<<"请分别输入5个字符串: "< cin>>str[0]>>str[1]>>str[2]>>str[3]>>str[4]; cout<<"逆转后的顺序为: "< for(inti=4;i>=0;i--) { cout< } cout< } 实验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.编写一个程序,用于进行集
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实验 指导书