面向对象程序设计C 实验指导书.docx
- 文档编号:11323609
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:22
- 大小:27.61KB
面向对象程序设计C 实验指导书.docx
《面向对象程序设计C 实验指导书.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计C 实验指导书.docx(22页珍藏版)》请在冰豆网上搜索。
面向对象程序设计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。 }。 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 i++,p++) cout<<*p<<””。 cout< } voidMyArray: : Input{} {cout<<”请键盘输入”< ”。 inti。 int*p=alist。 for(i=0。 i i++,p++) 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 usingnamespacestd。 intmain() {charch。 inti=0。 ifstreamfile。 file.open(“xyz.txt”,ios: : in)。 if( ) { cout<<”xyz.txtcannotopen”< abort()。 } While(! file.eof()) { i++。 } cout<<”文件字符个数: ”< return0。 } 3.重载运算符“<<”和“>>”,使其能够输入一件商品的信息和输出这件商品的信息。 商品的信息由编号、商品名和价格。 假如商品类Merchandise的框架如下: classmerchandise{ public: Merchandiss()。 ~Merchandiss()。 friendistream&operator>>(istream&in,Merchandiss&s)。 friendostream&operator<<(ostream&out,Merchandiss&s)。 private: intno。 char*name。 doubleprice。 }。 要求实现该类,并编写以下的main函数对该类进行操作。 intmain() {Merchandisemer。 cin>>mer。 cout< return0。 } 4.编写一个程序,将两个文本文件连接成一个文件,然后将此文件中所有小写字母转换成大写字母,并打印出来。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计C 实验指导书 面向 对象 程序设计 实验 指导书