C++面向对象程序设计 - 实验指导书

更新时间:2024-04-08 05:03:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《C++面向对象程序设计教程》

实 验 指 导 书

吴芸、施华 编 写

适用专业: 计算机类相关专业

厦门理工学院计算机科学与技术系2013 年 02月

1

部)

前 言

C++语言是在C语言基础上扩充了面向对象机制而形成的一种面向对象的程序设计语言,它除了继承C语言的全部优点和功能外,还支持面向对象程序设计。

本课程共分7个章节。第1章概述了面向对象程序设计的基本概念。第2章介绍了C++对C语言在非面向对象方面的扩充。第3章至第7章详述了C++支持面向对象程序设计的基本方法,包括类和对象、派生类和继承、多态性、模板、流类库等。通过本课程的学习,学生需要掌握这些基本知识。

为了使学生更好地理解和深刻地把握这些知识,并在此基础上,掌握C++程序设计的基本技能和面向对象的概念与方法,并能编写出具有良好风格的程序,共设置了7个实验项目,与课程的7个章节分别对应。其中实验5为综合性、设计性实验,其余为验证性实验。

本指导书主要针对选用的教材《C++面向对象程序设计(第3版),陈维兴,林小茶 编著,清华大学出版社,2009.06》,也可以作为其它C++教材的实验指导书的参考。该指导书适应于计算机相关专业。

2

实验绪:对C语言编程的简单回顾

实验学时:2 实验类型:验证

实验要求:选修

一、实验目的

通过本实验的学习,使学生熟悉Visual C++ 6.0集成开发环境的使用,通过C语言的回顾,了解C++对C语言语法的继承与发展。

掌握C基本数据类型的基本概念、基本属性。 学会如何书写一个整型、字符型、实型常量。

掌握C算术运算符的基本概念、基本属性、运算规则。 二、实验内容

1.输入下列源程序,进行修改、编译、连接和运行。

程序:main ( )

{ char c1,c2; c1=97; c2=98;

printf(\printf(\}

【运行结果是】:

【两行结果的不同是由什么引起的】:

2.输入下列源程序,进行修改、编译、连接和运行。分析++运算符。 程序:main ( )

{ int i,j,m,n; i=8;

3

j=10; m=++i; n=j++;

printf(\}

【运行结果是】:

【分析前++和后++的不同】:

3.输入下列源程序,进行修改、编译、连接和运行。分析++和--运算符。 程序:main ( )

{ int i,j; i=8; j=10;

printf(\printf(\printf(\printf(\}

【运行结果是】:

【分析运行结果】:

4.输入并运行下面的程序: #include void main() {

char c1,c2,c3; c1=getchar(); c2=getchar(); c3=getchar(); putchar(c1); putchar(c2);

4

}

putchar(c3);

观察以下不同输入时的输出,分析不同输出的原因。(↙ 表示回车) (1)123↙ (2)12↙ (3)1↙ 2↙

【运行结果是】: 【分析运行结果】:

5.把以上程序改写如下,用于上面相同的输入运行,分析不同输出的原因。 #include void main() { }

【运行结果是】: 【分析运行结果】:

6.输入并运行下面的程序,分析格式控制对输出的影响。 #include void main() {

char c1,c2,c3; c1=getchar(); putchar(c1); c2=getchar(); putchar(c2); c3=getchar(); putchar(c3);

int a=-1,b=98; double x=152.6752445;

printf(\

5

}

printf(\printf(\

printf(\【运行结果截图】: 【分析运行结果】:

7.输入并运行下面的程序: #include void main() { }

观察以下不同输入时的输出,分析间隔符号对输入的影响。(↙ 表示回车) (1)1,2↙

1,2↙ int a,b; double x; float y;

scanf(\printf(\scanf(\printf(\

(2)1 2↙

1 2↙

(3)1↙ 1↙ 2↙

【运行结果截图】: 【分析运行结果】:

6

8.转义字符的使用。 main() { int a,b,c; a=5; b=6; c=7;

printf(“ ab c\\tde\\rf\\n”); printf(“hijk\\tL\\bM\\n”); }

【运行结果截图】:

9.大小写转换 main() {

char a,b; a='a'; b='b'; a=a-32; b=b-32;

printf(\}

【运行结果截图】:

10.参考例题2-2完成题目:

设圆半径r=1.5 圆柱高h=3求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积,输出结果要有文字说明,如The area is 7.06. (其中π=3.1415926,采用第二章例题2-2的#define来定义;圆周长2πr、圆面积πr2、圆球表面积4πr2、圆球体积4/3πr3、圆柱体积πr2h) 【测试结果】: r h circle area surface globe column 7

1.5 3.45

3 2.56 三、实验原理、方法和手段

总体思想:通过几个简单程序的设计,熟悉Microsoft Visual Studio 6.0集成开发环境;通过对C程序的回顾,了解C++对C程序语法的继承与发展。 四、实验组织运行要求

本实验采用“以集中授课,学生自主训练为主的开放模式组织教学”。 五、实验条件

微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境;Microsoft Visual Studio 6.0集成开发环境的MSDN。 六、实验步骤

1、进入和退出Visual C++ 6.0集成开发环境。

启动并进入Visual C++ 6.0集成开发环境有三种方法:

(1)在开始菜单上,选择程序,然后Microsoft Visual Studio 6.0组,再选择Microsoft Visual Studio 6.0。

(2)在桌面上创建VC的某种工程的快捷方式,直接双击该图标;

(3)如果已经创建了VC的某种工程,双击该工程的dsw(Develop Studio Workshop)文件图标,也可以进入集成开发环境,并打开该工程。

(4)选择File¦Exit菜单,退出集成开发环境。

2、菜单、工具栏和集成开发环境的使用方法,在附录的菜单介绍中有,可以查阅MSDN具体使用方法。

3、参见《C++面向对象程序设计教程(第3版)》(陈维兴 林小茶 编著,清华大学出版社,2009.06)的第10.1.2的实验步骤。

8

七、思考题

1、思考问题:数据类型、运算符、表达式等在C语句中充当什么成分?什么是标识符?整型、实型、字符型常量的书写法是怎样的?整型、实型、字符型变量怎样创建?字符串怎样表示?如何求表达式的值?混合表达式的求值规则是怎样的? 八、实验报告

1.完成实验指导书《C++面向对象程序设计教程(第3版)——习题解答与上机指导》的实验1;

2.做好实验记录;

3.按照实验报告格式(附件1)要求填写实验内容,并提交实验报告。 九、其它说明

每次实验前,实验指导书都会预先发放,请提前预习实验,特别是实验涉及的原理。实验要求及时完成并上交实验报告,鼓励提前完成必做实验,并尽量多做实验题目。

遵守学生实验室管理的相关规定及安全事项。

9

实验01:C++简单程序设计

实验学时:6 实验类型:验证 实验要求:必修 一、实验目的

函数是C++程序的基本组成模块。通过本实验的学习,使学生:

1、进一步熟悉Visual C++ 6.0的集成开发环境,为今后程序编程和调试奠定基础;

2、了解C++在非面向对象方面对C功能的扩充与增强。 二、实验内容

1、输入以下程序,进行编译,如果有错误、请修改程序,直到没有错误,然后进行链接和运行,并分析运行结果。

#include using namespace std; int main() {

int a, b, c;

cout << << \ cin >> a >> b; c = sum(a, b); cout << \ return 0; }

sum(int a, int b) {

return a+b;

10

}

【提示】本题重点在于实验结果的分析。

【运行结果截图】:

【运行结果分析】:程序在调用函数的时候,要先对函数进行声明,再进行调用。本程序调用了一个sum函数用来计算两个数的和。当输入5和6时,程序会自动得出答案为11,。

2、编写一个程序,用来分别求2个整数、3个整数、2个双精度数和3个双精度数的最大值。

【要求】:使用重载函数来完成。采用C++输入输出流对象完成数据的输出。

【运行结果截图】:

3、编写一个程序,任意从键盘输入两个字符,能将它们按由大到小的顺序输出。

【要求】:程序中有一个交换两个字符的函数,其形参是变量的引用。 【运行结果截图】:

11

4、编写一个程序,对一个整型数组的元素求和,结果使用全局变量sum存储,另外对数组元素中的奇数求和,结果使用局部变量sum存储,在主程序将两个结果输出。

【要求】:体会和理解作用域运算符的概念与使用方法。

【运行结果截图】:

5、编写一个程序,声明一个双精度型指针变量,使用运算符new动态分配一个double型存储区,将首地址赋给该指针变量,并输入一个数到该存储区中。计算该数为半径的圆的面积,并在屏幕上显示,最后使用运算符delete释放该空间。 【要求】:体会和理解动态内存分配的作用和意义。

【运行结果截图】:

12

6、编写一个程序,完成二分法求解f(x)=0的根。

【提示】:(1)请上网查找有关二分法用于查找“已排序数列”的代码或程序,理解二分法的主要涉及思想,并运用于本题的设计与编码。(2)为简化问题,假设 a*x*x + b*x +c; a, b, c是输入的任意实数。 【要求】:采用C++编程风格。

【运行结果截图】:

三、实验原理、方法和手段

1.重载函数:a) 函数名称相同;b) 函数的形参个数不同;函数的形参类型不同;或两者兼有;c) 函数的返回值不构成判别标准。

2.了解“传址调用”与“传值调用”的区别; 3.“引用”不额外申请内存。 四、实验组织运行要求

本实验采用“以集中授课,学生自主训练为主的开放模式组织教学”。 五、实验条件

微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境;Microsoft Visual Studio 6.0集成开发环境的MSDN。 六、实验步骤

使用重载函数求最大值:

2个整数:int max(int a, int b); 3个整数:int max(int a, int b, int c);

13

2个双精度数:double max(double a, double b); 3个双精度数:double max(double a, double b, double c); 七、思考题

m 1、求组合数cn?n!(m!(n?m)!)

【提示】:求组合数要用到求阶乘,将求阶乘定义为一个函数,在求组合数的函数中嵌套调用阶乘函数。由于n!?n*(n?1)!,求阶乘是一个典型的递归算法,在此递归方法实现。

#include

long com(int, int), fac(int); //原型声明 void main() { int m,n;

cout<<”Please input two numbers m, n(m

cin>>m>>n;

if(m<=n) cout<<”C(m,n)=”<

long com(int i, int j) { long cmb; //att: A

cmb=fac(j)/fac(i)*fac(j-i); //在com函数内嵌套调用fac函数 return cmb; }

long fac(int i) { long fcl;

if(i==0||i==1) fcl=1; else fac=i*fac(i-1); return fcl; }

14

mm?1m* 这里因阶乘极易溢出,请考虑修改。可用:Cn?Cn?1?Cn?1。

2、编写几个计算面积的函数,分别计算圆、矩形、梯形和三角形的面积,计算边长为1的正方形及其内切圆、内接等腰三角形和等腰梯形面积。

【要求】:采用重载函数实现。 【提示】:函数原型如下: double area(double radius=0);

// 圆面积,参数为半径,缺省参数0,表示点面积

double area(double a, double b); // 计算矩形面积,参数为长和宽 double area(double a, double b, double h); // 计算梯形面积,参数为两底和高 double area(double a, double b, double c, int);

// 三角形,参数为三边长,int型参数起表示作用,以区别于梯形,不参

加计算。

3、建立一个头文件area.h,在其中定义两个面积函数area(),分别用来计算半径为r的圆的面积和边长为a和b的矩形面积。另外建立一个实现文件area.cpp,在其中定义主函数。通过包含area.h,输入数据并输出圆和矩形的面积。 八、实验报告

1.复习教材《C++面向对象程序设计教程(第3版)》(陈维兴 林小茶 编著,清华大学出版社,2009.06)

2.完成实验指导书《C++面向对象程序设计教程(第3版)——习题解答与上机指导》的实验2;

3.做好实验记录;

4.按照实验报告格式(附件1)要求填写实验内容,并提交实验报告。 九、其它说明

每次实验前,实验指导书都会预先发放,请提前预习实验,特别是实验涉及的原理。实验要求及时完成并上交实验报告,鼓励提前完成必做实验,并尽量多

15

做实验题目。

遵守学生实验室管理的相关规定及安全事项。

16

实验02:类与对象

实验学时:6+(6) 实验类型:验证 实验要求:必修 一、实验目的

类是C++扩展数据类型,可以封装不同类型的数据成员和函数成员,类是面向对象程序设计的基础。本次实验内容包括面向对象的基本概念、构造函数与析构函数,从实际问题抽象出类等,通过实验要求:

1、理解类和对象的概念;

2、了解C++在非面向对象方面对C功能的扩充与增强。 3、初步掌握使用类和对象编制C++程序。

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

5、掌握使用对象、对象指针和对象引用作为函数参数的方法。 6、掌握类对象作为成员的使用方法。

7、掌握静态数据成员和静态成员函数的使用方法。 8、理解友元的概念和掌握友元的使用方法。 二、实验内容

1、输入下列程序。 #include using namespace std; class Coordinate { public:

Coordinate(int x1,int y1)

{ x=x1; y=y1; }

17

Coordinate(Coordinate &p); ~Coordinate()

{ cout<<\int getx() { return x;} int gety() { return y;}

private: };

Coordinate::Coordinate(Coordinate &p) { } int main() {

Coordinate p1(3,4); Coordinate p2(p1); Coordinate p3=p2;

cout<<\ return 0; }

x=p.x; y=p.y;

cout<<\int x,y;

【运行结果截图】:

18

将Coordinator类中带有两个参数的构造函数进行修改,在函数体内增添下列语句: cout<<”constructor is called.\\n”; 【

【运行结果分析】:

按下列要求进行调试:在主函数体内,添加下列语句: Coordinator p4; Coordinator p5(2);

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

【运行结果截图】:【解释】:

经过以上第(2)步和第(3)步的修改后,结合运行结果分析:创建不同的对象时会调用不同的构造函数。

【运行结果分析】:p1是调用有两个参数的构造函数,p2和p3都是p1的拷贝,但他们调用的是使用对象引用作为函数参数的构造函数,p4和p5都是调用两个参数的构造函数,p4由于没有给出实参,所以使用默认参数。

2、设计一个4*4魔方程序,让魔方的各行值的和等于各列值的和,并且等于

19

两对角线的和,例如以下魔方,各行各列及两对角线值的和都是64. 31 3 5 25 9 21 19 15 17 13 11 23 7 27 29 1

【提示】:求4*4的魔方的一般步骤如下:

设置初始魔方的起始值和相邻元素之间的差值。例如上述魔方的初始魔方的起始值(first)和相邻元素之间的差值(step)分别为:first=1; step=2; 设置初始魔方元素的值,例如上述魔方的初始魔方为: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31

生成最终魔方。方法如下:

求最大元素值与最小元素值的和sum,该实例的sum是:1+31=32

用32减去初始魔方所有对角线上元素的值,然后将结果放在原来的位置,这样就可以求得最终魔方。

本题的魔法类magic的参考框架如下: class magic {public:

void getdata(); void getfirstmagic();

void generatemagic(); void printmagic(); private: }

20

int m[4][4]; int step; int first; int sum;

实验03:派生类和继承

实验学时:6+(6) 实验类型:验证 实验要求:必修 一、实验目的

1、掌握派生类的声明方法和派生类构造函数的定义方法; 2、掌握不同继承方式下,基类成员在派生类中的访问属性;

3、掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则; 4、学习虚函数在解决二义性问题中的作用。 二、实验内容

1、输入下列程序。 #include using namespace std; class Base{ public:

void setx(int i) { x=i;}

int getx()

{ return x;}

public: };

class Derived:public Base{ public:

int x;

void sety(int i) {y=i;}

26

int gety() { return y;} void show()

{cout<<\

//语句1

public: }; int main() { }

Derived bb; bb.setx(16); bb.sety(25); bb.show();

//语句2 //语句3 //语句4 //语句5 //语句6

int y;

cout<<\

cout<<\//语句7 cout<<\//语句8 cout<<\//语句9 return 0;

【运行结果截图】:

按以下要求,对程序进行修改后再调试,指出调试中出错的原因。

将基类Base中的数据成员x的访问权限改为private时,会出现哪些错误,为什么? 【运行结果分析】:x将不允许派生类继承,即在派生类中是不可直接访问的。

27

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

【运行结果分析】:基类Base中的所有公有成员在派生类中都以保护成员的身份出现。

在原程序的基础上,将派生类Derived的继承方式改为private时,会出现哪些错误?为什么?

【运行结果分析】:公有继承时不能访问基类的私有成员的内部和对象,不能访问基类的保护成员的对象。

在原程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错误?为什么?

【运行结果分析】:保护继承时不能访问基类的私有成员的内部和对象,不能访问基类公有成员和保护成员的对象。

2、编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。要求将编号、姓名、性别、年龄的输入和显示设计成一个类Persona,并作为学生类Student和教师类Teacher的基类。 【person类结构】: class Persona{ public:

Persona(int numberl,string namel,string sexl,int agel) {number=numberl; name=namel; sex=sexl; age=agel; } void print()

{cout<<\ cout<<\ cout<<\ cout<<\ } protected:

28

int number; string name; string sex; int age; };

【Student类结构】: class Student:private Persona{ public:

Student(int numberl,string namel,string sexl,int agel,string gradel,float scorel) :Persona(numberl,namel,sexl,agel) {

grade=gradel; score=scorel; }

void print() {Persona::print();

cout<<\ cout<<\ } private: string grade; float score; };

【Teacher类结构】: class Teacher:private Persona{ public:

Teacher(int numberl,string namel,string sexl,int agel,string positionl,string departmentl) :Persona(numberl,namel,sexl,agel) {

position=positionl;

29

department=departmentl; }

void print() {Persona::print();

cout<<\ cout<<\ } private: string position; string department; };

【运行结果截图】:

3、按要求阅读、编辑、编译、调试和运行以下程序。

(1)阅读、编辑、编译、调试和运行以下程序,并写出程序运行结果。 #include #include using namespace std; class MyArray{ public:

30

MyArray(int leng); ~MyArray(); void Input(); void Display(string);

protected: };

MyArray::MyArray(int leng) { if(leng<=0)

{

cout<<\int *alist; int length;

exit(1);}

alist=new int [leng]; length=leng; if(alist==NULL) }

MyArray::~MyArray() { }

void MyArray::Display(string str) {

{

cout<<\exit(1);}

cout<<\类对象已创建。\

delete[] alist;

cout<<\类对象被撤销。\

int i; int *p=alist;

cout<

31

}

cout<<*p<<\

cout<

void MyArray::Input() { } int main() { }

MyArray a(5); a.Input();

a.Display(\显示已输入的\return 0;

cout<<\请从键盘输入\个整数:\int i; int *p=alist;

for(i=0;i

cin>>*p;

(2)声明一个类SortArray继承类MyArray,在该类中定义一个函数,具有将输入的整数从小到大进行排序的功能。

【提示】:请注意编写继承类的构造函数、析构函数,以及修改主函数。 【SortArray类框架】:

class SortArray:public MyArray {public: void Sort();

32

SortArray(int leng):MyArray(leng)

{cout<<\类对象已创建。\ } virtual~SortArray(); };

SortArray::~SortArray()

{cout<<\类对象被撤销。\ }

【运行结果截图】:

(3)声明一个类ReArray继承类MyArray,在该类中定义一个函数,即有将输入的整数进行倒置的功能。

【提示】:请注意编写继承类的构造函数、析构函数,以及修改主函数。 【ReArray类框架】:class ReArray:public MyArray{ public: void reverse(); ~ReArray()

{cout<<\类对象被撤销。\ ReArray(int leng):MyArray(leng)

{cout<<\类对象已创建。\

33

【运行结果截图】:

(4)声明一个类Average继承类MyArray,在该类中定义一个函数,即有将输入的整数进行倒置的功能。

【提示】:请注意编写基继承类的构造函数、析构函数,以及修改主函数。 【Average类框架】:

class AverArray:public MyArray{ public:

AverArray(int leng): MyArray(leng)

{cout<<\类对象已创建。\ ~AverArray()

{cout<<\类对象被撤销。\ double Aver(); };

double AverArray:: Aver() {double sum=0,average; int i;

for( i=0;i

cout<<\平均数是:\ return 0; }

34

【运行结果截图】:

(5)声明一个NewArray类,同时继承了类SortArray,ReArray和Average,使得类NewArray的对象同时具有排序、倒置和求平均值的功能。在继承的过程中声明MyArray为虚基类,体会虚基类在解决二义性问题中的作用。 【NewArray类框架】:

class NewArray:public SortArray ,public ReArray,public AverArray ,virtual public MyArray {public:

NewArray(int leng):SortArray(leng),ReArray(leng),AverArray(leng),MyArray(leng) {

cout<<\类对象已创建。\ }

~NewArray()

{cout<<\类对象被撤销。\

35

【运行结果截图】:

三、实验原理、方法和手段

1.派生类的定义:

class 派生类名:访问限定符 基类名1《,访问限定符 基类名2,……,访问限定符 基类名n》{ 《 《private: 》

成员表1;》 //派生类增加或替代的私有成员

《public:

成员表2;》 //派生类增加或替代的公有成员

《protected:

成员表3;》 //派生类增加或替代的保护成员

};//分号不可少 2.虚函数的定义

虚函数是一个类的成员函数,定义格式如下: virtual 返回类型 函数名(参数表){…};

关键字virtual指明该成员函数为虚函数。virtual仅用于类定义中,如虚函数在类外定义,不可再加virtual。

36

四、实验组织运行要求

本实验采用“以集中上机,学生自主训练,教师指导答疑“的方式进行。 五、实验条件

微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境;Microsoft Visual Studio 6.0集成开发环境的MSDN。 六、实验步骤 1.派生的四个步骤:

吸收基类的成员 不论是数据成员,还是函数成员,

除构造函数与析构函数外全盘接收

编制派生类时可分四步

改造基类成员 声明一个和某基类成员同名的新成员,派

生类中的新成员就屏蔽了基类同名成员

称为同名覆盖(override)

发展新成员 派生类新成员必须与基类成员不同名,

它的

加入保证派生类在功能上有所发展。

重写构造函数与析构函数

2.派生类的定义

class 派生类名:访问限定符 基类名1《,访问限定符 基类名2,……,访问限定符 基类名n》{ 《 《private: 》

成员表1;》 //派生类增加或替代的私有成员

《public:

成员表2;》 //派生类增加或替代的公有成员

《protected:

成员表3;》 //派生类增加或替代的保护成员

37

};//分号不可少 派生类构造函数的定义:

派生类名::派生类名(参数总表):基类名1(参数名表1)《,基类名2(参数名表2),……,基类名n(参数名表n)》,《成员对象名1(成员对象参数名表1),……,成员对象名m(成员对象参数名表m)》{ ……//派生类新增成员的初始化;

} //所列出的成员对象名全部为新增成员对象的名字 七、思考题

1. 试比较派生与模板的优点。 八、实验报告

1.复习教材《C++面向对象程序设计教程(第3版)》(陈维兴 林小茶 编著,清华大学出版社,2009.06)

2.完成实验指导书《C++面向对象程序设计教程(第3版)——习题解答与上机指导》的实验4;

3. 做好实验记录;

4. 按照实验报告格式(附件1)要求填写实验内容,并提交实验报告。 九、其它说明

每次实验前,实验指导书都会预先发放,请提前预习实验,特别是实验涉及的原理。实验要求及时完成并上交实验报告,鼓励提前完成必做实验,并尽量多做实验题目。

遵守学生实验室管理的相关规定及安全事项。

38

实验04:多态性

实验学时:6 实验类型:验证 实验要求:必修 一、实验目的

1、了解多态性的概念; 2、掌握运算符重载的基本方法; 3、掌握虚函数的定义和使用方法; 4、掌握纯虚函数和抽象类的概念和用法 二、实验内容

1、分析并调试下列程序,写出程序的输出结果,并解释输出结果。 #include using namespace std; class B{ public:

virtual void f1(double x)

{ cout<<\void f2(double x)

{ cout<<\

void f3(double x)

{ cout<<\ };

class D:public B{ public:

virtual void f1(double x)

{ cout<<\

39

void f2(int x) }; int main() { } 【

D d; B *pb=&d; D *pd=&d; pb->f1(1.23); pd->f1(1.23); pb->f2(1.23); pb->f3(1.23); pd->f3(3.14); return 0;

{ cout<<\void f3(double x)

{ cout<<\

【运行结果分析】:函数f1()被定义为虚函数,所以执行pb->f1(1.23)语句时,程序根据指针pb所指向的的实际对象,调用该对象的成员函数。而f2() 和f3()只是普通的成员函数,不管pb指向哪个对象,程序pb->f2(1.23)和pb->f3(1.23) 调用的都是基类中定义的的函数。

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

40

据成员,通过重载操作符“+”实现两个时间的相加。

【要求】:将小时范围限制在大于等于0,分钟范围限制在0~59分,秒钟范围限制在0~59秒。

【提示】:时间类Time的参考框架如下: class Time{ public: Time(int h=0,int m=0,int s=0); Time operator +(Time &);

void disptime(string);

private:

int hourse; int minuters; int seconds;

}; 【

截图

3、给出下面的抽象基类container。 class container{ protected:

double radius;

public: container(double radius); virtual double surface_area()=0;

virtual double volume()=0;

41

】};

建立3个继承container的派生类cube、sphere与cylinder,让每一个派生类都包含虚函数surface_area()和volume(),分别用来计算正方体、球体和圆柱体的表面积及体积。

【要求】:写出主程序,用于C++的多态性,分别计算边长为6.0的正方体、半径为5.0的球体,以及半径为5.0和高为6.0的圆柱体的表面积和体积。 【

4、编写程序,用于进行集合的并、差和交运算。例如输入整数集合{9 5 4 3 6 7}和{2 4 6 9},计算出它们进行集合的并、差和交运算后的结果。 1)可以用以下表达式实现整数集合的运算: s1+s2 两个整数集合的并运算 s1-s2 两个整数集合的差运算 s1*s2 两个整数集合的交运算 【Set类的框架】:#include \

//15计算机2班03-陈铭燕-实验04-C++简单程序设计 #include using namespace std; const int MAX=100; class Set { public: void input(int);

42

int length(); void disp();

Set operator+(Set s1); Set operator-(Set s1); Set operator*(Set s1); private:

int len; int s[MAX]; int m[MAX];

};

void Set::input(int d) { }

int Set::length() { }

void Set::disp() {

int i; len=d;

cout<<\输入集合元素\个: \ for(i=0;i

cin>>s[i];

s[i]='\\0';

int i=0; while(m[i]!='\\0')

i++;

return i;

int i; int k=length();

43

for(i=0;i

cout<

cout<

}

Set Set::operator +(Set s1) { int i,j; int t=s1.len; int k=len; for(i=0;i

m[i]=s[i];

for(i=0;i

s1.m[i]=s1.s[i];

for(i=0;i

}

for(j=0;j

}

Set Set::operator -(Set s1)

44

{ int i,j; int k=len; int t=s1.len; for(i=0;i

m[i]=s[i];

for(i=0;i

s1.m[i]=s1.s[i];

for(i=0;i

} m[k]='\\0'; return *this;

}

Set Set::operator *(Set s1) { int i,j;

int a[MAX],k=0; for(i=0;i

m[i]=s[i];

for(i=0;i

s1.m[i]=s1.s[i];

for(i=0;i

if(m[i]==s1.m[j])

45

}

{ }

for(i=0;i

m[i]=a[i]; a[k]=m[i]; k++;

m[k]='\\0'; return *this;

int main() { }

46

int n; Set A,B,C;

cout<<\建立含有几个元素的A集合: \ cin>>n; A.input(n);

cout<<\建立含有几个元素的B集合: \ cin>>n; B.input(n); C=A+B;

cout<<\为: \ C.disp(); C=A-B;

cout<<\为: \ C.disp(); C=A*B;

cout<<\为: \ C.disp(); return 0;

【运行结果截图】:

三、实验原理、方法和手段 1.虚函数的定义:

virtual 返回类型 函数名(参数表){…};

关键字virtual指明该成员函数为虚函数。virtual仅用于类定义中,如虚函数在类外定义,不可再加virtual。 四、实验组织运行要求

本实验采用“以集中上机,学生自主训练,教师指导答疑“的方式进行。 五、实验条件

微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境;Microsoft Visual Studio 6.0集成开发环境的MSDN。 六、实验步骤

参见《C++面向对象程序设计教程(第3版)——习题解答与上机指导》的实验5的实验步骤。 七、思考题

1.是否使用了虚函数就能实现运行时的多态性?这么样才能实现运行时的多

47

态性? 八、实验报告

1.复习教材《C++面向对象程序设计教程(第3版)》(陈维兴 林小茶 编著,清华大学出版社,2009.06)

2.完成实验指导书《C++面向对象程序设计教程(第3版)——习题解答与上机指导》的实验5;

3. 做好实验记录;

4. 按照实验报告格式(附件1)要求填写实验内容,并提交实验报告。 九、其它说明

每次实验前,实验指导书都会预先发放,请提前预习实验,特别是实验涉及的原理。实验要求及时完成并上交实验报告,鼓励提前完成必做实验,并尽量多做实验题目。

遵守学生实验室管理的相关规定及安全事项。

48

实验05:模板与异常处理

实验学时:4+(8) 实验类型:验证、设计 实验要求:必修 一、实验目的

算法,尤其是通用的算法是程序设计的重点,模板是建立通用的与数据类型无关的算法的重要手段。通过实验要求:

1、正确理解模板的概念;

2、掌握函数模板和类模板的声明和使用方法; 3、学习简单的异常处理方法;(选修) 二、实验内容

1、调试下列程序,写出程序的输出结果并分析原因。 (1)

#include using namespace std; template T max(T x,T y) { return x>y?x:y;} int max(int a,int b) { return a>b?a:b;}

double max(double a,double b) { return a>b?a:b;} int main() { }

49

cout<<\return 0;

【运行结果截图】:

【运行结果分析】定义了一个求最大值的函数模板定义了一个求整型最大值的函数以及一个求双精度型最大值的函数这两个同名非模板函数与函数模板重载’3’和’7’均是字符型,找不到与之匹配的函数,所以调用了函数模板,使其实例化,由’T’型转变为’char’型 (2)

#include using namespace std; int max(int a,int b) { return a>b?a:b;}

double max(double a,double b) { return a>b?a:b;} int main() { }

cout<<\return 0;

【运行结果截图】:

【运行结果分析】:定义了一个求整型最大值的函数以及一个求双精度型最大值的函数,这两个同名函数重载‘3’和‘7’均是字符型,找不到可以匹配的函数,所以不能得出正确的结果。

50

本文来源:https://www.bwwdw.com/article/rbrr.html

Top