2024年1月14日发(作者:)

面向对象程序设计试卷及答案

开发环境为,运行结果有截图,若发现错误欢迎指正

实验一、程序开发环境及简单程序设计。

题目、简单程序

任务:

按提示的操作步骤输入下面的代码,编译连接并执行。

源程序代码:

""

()

{ <<"!";

<<"!"<<;

<<"

}

运行结果:

Hollo*

We 1c o me to C + +?

This i含

mg f irst c ++ gram

Press dny key to continu.e

"<<;

题目、

编写程序,从标准输入读入一个数,把它转化为英文单词输出,如输入,这是输 出“ ”。

源程序代码:

<>

J

()

{;

<<"请输入数字用来转化为英文单词:

()

{ >>('');

()

{

<<"";;

; ;

<<"";;

<<"";;

<<"";

<<"";;

<<"";;

<<"";;

<<"";

<<"";

<<"";;

}

}

}

运行结果:

卜青输入数字用来转化为英文里词±

12 34冲78 9 .

1 / 29

one tuo three four f iue six seuen eight nine

题目、循环结构程序设计

任务

把一张一元纸币换成一分、二分和五分的硬币,假如每一种至少一枚,文友 多少种换法,编程将各种换法显小出来。

源程序代码:

<>

J

() {

J

<<"一角"<<"两角"<<"三角"<<;

(<)

(<)

(<)

(**)

{<<<<" "<<<<" ”<<<<

<<"换法的总数为:"<<<<;

}

运行结果:

87 1 4

88 2 1

89 1 3

91 1 2

93 1 1

"<<;}

换法的总数为;

Press any key to continue

(由于种数太多截图不方便所以只截了最后的部分!

实验二、函数

题目、内联函数

任务

(1)定义内敛函数(),求两个整数中的最大值,然后在()函数中惊醒调用

(2)定义内联函数()和一般函数(),使整型参数值加,然后在()函数中 惊醒调用;

源程序代码: <>

J

();

();

();

()

{

<<<<","<<<<"中最大的是:"<<()<<;

<<<<"加后为:"<<()<<;

<<<<"加后为:"<<()<<;

}

()

{(>);

;

}

()

2 / 29

{ ;}

()

{ ;}

运行结果:

题目、函数参数的传递机制、重载函数

(1)编写重载函数()可分别求个整数、个整数、个双精度和双精度数的最 大值。

()定义两个名称都为()的函数,第一个函数支持整型数组,第二个函数支 持浮点型数组,求数组元素的和。

源程序代码:

<>

;

()

{ (>) ;}

()

{

(>())();

}

()

{ (>) ;}

()

{ (>() ) ();}

(* )

{;

(<)

口;

;

}

(* )

(

;;

(<)

[];

;

)

()

(

,,,

[]{}; []{ };

<<<<","<<<<"的最大值为:"<<()<<;

<<<<","<<<<","<<<<"的最大值为:"<<()<<;

<<<<","<<<<"的最大值为:"<<()<<;

<<<<","<<<<","<<"的最大值为:"<<()<<;

3 / 29

<<"型数组元素的和为:"<<()<<;

<<"型数组的元素和为:"<<()<<;

}

运行结果:

题目、带默认参数的函数

任务

定义函数(),计算立体的体积,要求在主函数中以中不同的形式调用此函数。<>

;

();

()

{

;

<<()<<;

<<()<<;

<<()<<;

<<()<<;

<<()<<;

}

()注意这里不可以再带默认的参数!!!

{

<<"以"<<<<","<<<<","<<<<"为棱的长方体的体积为:";

4 / 29

源程序代码:

**・

}

运行结果:

为为为为”长棱棱琰棱k

:6

:24

:60

:90

:120

s

实验三、类于对象

题目、私有成员的访问

任务

下面的程序中用标明的语句有错误, 在不删除和增加代码行的情况下,改正 错误的语句,使其正确运行。

错误代码及改正方法:

<>

{

(){ ;<<""<<<<;}

(){ <<""<<<<;}

(){<<<<;}

};

()

{

()();

();

<<<<将该行代码中访问了的私有属性,改为();

}

改正后的运行结果:

Constructor1

Constructors

Desti'uctorS

Destructoi*!

Press any key to continue

题目、构造函数、拷贝构造函数 任务

(1)调试下列程序

源程序代码:

<>

3 6a

5 / 29

;

(){ ;}

();

(){ <<"

(){ ;}

(){ ;}

";}

J

};

()

{

;;

<<"

}

()

{

();

();

;

<<"("<<()<<","<<()<<")";

J

";

}

运行结果:

Co pi/ -in it ialization Cnstruc tor is called Cops -initidlisation Cnstructor is called p3=<4,9> destructor is

called ructor is called destructor is ca1led Press an9 key

to continue

问题:

(1)在该程序中将类的带有两个参数的构造函数进行修改,在函数体内添加下 述语句:<<"."。

对程序的输出结果进行分析和说明。

运行结果:

Construstoi* is Called.

Copy -initialization Cnstructor i零

called Copy -InItialiaation Cnstructioi' Is Called

p3=<4,9> destructor is called destructor is called destructor is called Press dny key to

continue

第一个 是构造时产生的,两个

三个。

分别构造 和 时产生的。析构、、,是产生了

* ;

(){ >; 口; <<"构造函数被调用!"<<<<;}

(){ <<"请输入"<<<<"字符用来构造字符串。"<<;

(<)>>[];

}

(){ <<"字符串的储存的内容如下:"<<( <)<<[];<<;}

(){ <<"析构函数被调用!"<<<<; [];}

6 / 29

(2)对上述程序在主函数中添加下列说明语句: ,()调试程序会出现什么现

象,为什么?如何解决?结合运行结果分析如何使用不同的构造函数创建把不同 的对象?对程序的输出结果进行分析和说明。

会出现对象,无法构造。在类中将构造函数(,);改成带有默认参数的 构造函数,例如:(,);

运行结果:

Iconstrustop is Called.

ICop^F -in it ial izat io n Cnstructor

fcopy -initialization Cnstvuctor

Constvustnr is Called.

Constructor is Called.

p3=<4,9>

dest ri*ct or is

destructor is

destructor is

Idest riictor is

destructor is

(Press aiiy kgy

is celled

is called

called

called

called

called

called

to continue

分析同上。

题目、析构函数、和运算符

任务

定义字符串类,包括私有数据成员(*),构造函数中用为申请空间,析构 函数用释放空间,并验证构造函数和析构函数的调用书顺序。

源程序代码:

<>

};

()

{

; <<"请分别输入你所要建立的两个字符串的含有字符的个数

"<<; >>>>;

()();

()();

()();

}

运行结果:

请分别输入你所要建立的两个字符串的含有字符的个数I 5 6

胞造函数被调用,5

储输入5学符用来构造字符串

12345

请输入6字符用来构造字符串.

qv?e rty

序符串的储存的内容如下;

12345

字符串的储存的内容如下:

法为函数被调用” 精相函数被调用作

Ppess dny key to continue

可以看出构造函数和析构函数的调用的顺序相反!

7 / 29

注意:特别重视构造函数、拷贝构造函数和析构函数的使用以及调用顺序, 这在整个面向对象程序设计中一直是重点同时也一直是难点。

实验四、静态成员与友元

题目、静态成员的特性

任务

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

程序代码:

<>

(){;} ();

J

;

};

()这里的静态函数在类外实现时就无需在家关键字。

<<""<<<<;

<<""<<<<;

}

静态的数据成员要在类外进行初始化,并且初始化时无需加关键字限定。

()

{

()();

()静态函数的调用形式。

();

;

}

运行结果:

1-86

1=8

(—86

11*65s any kev to

可以看出,的数据成员是不属于任何的对象的而属于整个类。函同样是属于整个 类可以用类名加作用域标识符进行调用, 也可以用对象进行调用,两种形式的调 用效果等价。

题目、友元函数

任务 分析并调试程序,完成下列问题

程序代码:

<>

<>

8 / 29

{

(){;}

(){ ;}

(){ ;}

();

J

};

()

{

;

(**);

()

()();

();

<<":"<<()<<

<<":"<<()<<

<<":"<<()<< <<":"<<()<<

;

}

运行结果:

The distance 1

The distance2

The distances

IT he distance4

|Press any key

:19.799

:1.41421

:21.2132

to continue

思考:

(1)指出所有的构造函数,它们在本程序中分别起什么作用?

();();();第一个实现单参和带有一个默认参数构造,第二个实现双参构 造;第三个事拷贝构造函数。(实际上前两个可以合并为一个();).

()指出设置默认参数的构造函数。(前面已回答)

()指出友元函数。将友元函数放到私有部分,观察结果是否有变化。

友元函数为:();放到私有部分是没有变化的。

()写出结果并分析结果。(结果已给出)

题目、静态成员的应用

任务

定义一个类,在该类中定义包括一个数据成员()(分数)、两个静态数据成员(总 分)和学生人数;成员函数()用于设置分数、求总分和累加学生人数;静态 成员函数()用于计算总分;静态成员函数()用于计算平均值。在(函数中输 入学生成绩,并调用上述函数求出全班学生的总分和平均分。

源程序代码:

<>

9 / 29

J

;

;

(){;}

(){>>;}

(){ ;}

(){<<”这个班的学生该课程的总分为:"<<<<;}

(){<<"这个班的学生该课程的平均分为

:"<<<<;}

10 /

29

};

J

;

()

{

口;

<<"请输入个学生的成绩

(<)

[]();

<<”这个学生的成绩为

(<)

<<[]()<<;<<;

();

();

}

运行结果:

这输生「的这学绩生学这的的覆课请的生该课

10/es

he

Asi.

题目、友元函数的应用

10to

68 85 67 89 10U

85 &7 89 100

任务 声明和两个类,二者都有属性,定义二者的一个友元函数(),计算二者的 重量和0

源程序代码:

<>

;

;

{

;

()(){}

(){ <<"请输入你在类中所要设置的值:”;>>;}

(){ <<""<<<<;}

();

};

{

;

()(){}

(){ <<"请输入你在类所要设置的值:”;>>;}

(){ <<""<<<<;}

();

};

pl*

continue

11 /

29

()

{

<<"二者的重量之和为:"<<<<;

}

()

{

;

()();

()();

();

}这里子两个类中属性比较单一,主要是为使用友元函数,如果需要可以添加其 他属性。

运行结果:

请输入你在Bonk夷所要设置weight的值:45・78

iSight =45 -78

情输入你在Rui”类中所要设置邸曰均卜七的值:78-58

weight =78,98

二者的重量之和为:124.76

Press any key to continue

实验五、继承与派生

题目、单继承

任务调试下列程序,并对程序进行修改,指出程序中错误的原因

程序代码:

<>

; {

(){;}

(){ ;}

J

};

{

(){;}

(){ ;}

(){ <<""<<<<;}

};

() {

语句

()语句

()语句

();

<<""<<<<;

<<""<<<<;

<<""<<()<<;

<<""<<()<<;

;

12 /

29

}

运行结果:

fl::a=6

H::a=6

B::h=3

A: :a=6

B::a=3

Press any key to continue

问题

(1)、将派生类的继承方式改为,会出现那些错误和不正常的现象?为什么?

在()函数中直接使用用类的属性将是不可以的,

不可以直接被调用!

因为继承方式是所以其属性将

(2)将派生类的继承方式改为,会出现哪些错误和不正常的现象?为什么?同

()支部过集成的方式改为。

(3)将派生类的继承方式恢复为后,再将类的数据成员型的变量的访问权限改 为时,会出现哪些错误和不正常的现象?为什么?将会出现在类和函数中是用数 据是不可以的,一维在类中是属性为。

(4)派生类的继承方式仍为,再将类中的数据成员型的变量的访问权限该为

会出现哪些错误和不正常的现象?为什么?更改后数据在类中是可以使用,

假设要管理下述基类人员的如下的数据

(教师):姓名、性别、年龄、职称、教授课程;

(学生):姓名、性别、年龄、学号、专业;

():姓名、性别、年龄、学号、专业、导师;

源程序代码:

<>

<>

但在

函数仍是不可以被使用的,因为继承方式是! 题目、利用继承与派生类来管理学生和教师的档案 任()()()(){}

(){ <<"姓名:"<<<<"性别:"<<<<"年龄:"<<;} };

( )()()(){}

(){();<<"职称:"<<<<"教授课程:"<<<<;} };

{

()()()(){}

(){();<<"学号:"<<<<"专业:"<<;} };

13 /

29

{

J

( )()(){}

(){()<<"导师:"<<<<;}

};

()

{

("张三","男","教授","面向对象程序设计");

(“李四","男","",”计算机科学与技术");

("李红","女","",”计算机科学与技术”,”张三)

();

()<<;

();

}

运行结果:

题目、教师干部类

定义(人)类,由分别派生(教师)类和(干部)类,再有(教师)类和类采用 多重继承的方式派生出(教师兼干部)类。

源程序代码:

<>

<>

J

()()()(){}

(){ <<"姓名:"<<<<"性别:"<<<<"年龄:"<<;} };

{

J

()()(){}

(){(); <<"职称:"<<;}

(){<<"职称:"<<;}

};

{

J

14 /

29

()()(){}

(){(); <<"职务:"<<;}

(){ <<"职务:"<<;}

J

( )()()()(){}

(){();()(); <<"工资:"<<<<;}

};

{

15 /

29

);

()

(

("张三"「男","教授)

("李四"「男","校长)

("王五"「女"」教授","院长)

()<<;

()<<;

();

)

运行结果:

a»n

马二E17J

三a

四:1=45职称:教授

名:»y

名»三空一豌

实验六、虚函数与多态 题目、动态联编和静态联编 任务

分析并调试下列程序 程序代码:

<>

(

(){ <<"()"<<<<;}

(){<<"()"<<<<;}

(){<<"()"<<<<;}

};

{

(){<<"()"<<<<;}

(){<<"()"<<<<;} (){ <<"

()"<<<<;}

};

()

{

*;

*;

>();

>();

>();

>();

>();

16 /

29

职务:院长工资r的的

姓名

J

}

运行结果:

Derived::F 3.14

Derived::f 3 .14 Base::s3.14

D«rived ::h

any key to continue

问题:

(1)找出以上程序张是使用了重载和覆盖的函数。

覆盖的有();和();重载的有()和();

()写出程序的输出结果,并解释结果。结果已截图解释省去

题目、动态联编和静态联编

任务

分析并调试下列程序:

<>

; {

();

};

{

(){ ;}

(){ **;}

J

};

{

(){;}

(){ *;}

J

};

(){ ;}

(){ **;}

J

};

{

(){;}

(){ *;}

J

};

(*[])

{

17 /

29

;

(<)

[]>();

;

}

()

{

*[];

口 ();

口 ();

口 ();

口 ();

口 ();

();

<<""<<<<;

;

}

运行结果:

问题

(1)指出抽象类;

(2)指出纯虚函数,并说明它的作用。()是抽象类,作用是为同类的函数日工 同意的外部接口。

()每个类的作用是什么,正程序的作用是什么?读者可以通过读程序就会明 白该程序的作用和每个类的作用,所以就不在这里做过多的解释。

题目.图形类的设计

任务

定义抽象类;

{

()任意图形的面积

()任意图形的体积

};

要求

(1)定义派生类(圆)、(矩形),并实现相应的纯虚函数。

(2)定义,使得到通过一如下方式统一操作和图形。

()(){};

(){ ();}

(){ ();}

};

18 /

29

源程序代码:

<>

;

;

{

();

();

};

{

(){ ;}

(){ **;}

(){ ;}注意着里即使不用()属性也要对其进行一定函数实现

J

};

{

(){;}

(){ *;}

(){ ;}

J

};

{

(){ ;}

(){ **;}

(){ ;}

J

};

{

(){;}

(){ *;}

(){ ;}

J

};

{

(){ **;}

(){ ;}

(){ ;}

19 /

29

J

};

()(){};

(){ ();}

(){ ();} };

20 /

29

()

(

();()();

()()();

<<"圆的面积为:"<<()<<;

<<"球的体积为:"<<()<<;

<<"矩形的面积为:"<<()<<;

)

运行结果:

的面为的翡为加面积为78-5375

720

:50

to continue

题目、运算符重载

任务 定义一个用来保存时间(时、分、秒),通过重载操作符实现两个时间 的相加。

要求 定义一个类,包括个数据成员:(时)、(分)、(秒),另外两个构造函数, 时间相加运算符重载函数输出函数().

源程序代码:

<>

<>

:

(

J

(){>>>;}

(){ ;}

()

{ ;}

()

{ <<"现在时间为:"('');

<<()<<<<":"<<()<<<<":"<<()<<<<;

}

};

()

{

()();

()();

();

运行结果:

现在网间为二型二蹈二例 现在时间为=10=10:10

现在时间为:15:15:15

Press any key to continue

实验、模板与库

题目、函数模板

任务 编写一个函数模板实现个数据的最小值,具体要求为:能求不同的数据类 型的最小值,个数据由21 /

29

键盘输入。可以用、、等类型的参数,并在函数进行测试。 源程序代码:

<>

J

< >

(* )

(

[];

(<)

([]<)[];

;

)

()

(

;

<<"请输入的值:”;>>;

* [];

* [];

<<"请输入"<<<<"个整型的数:”;

(<)>>[];

<<"请输入"<<<<"个双精度的数:";

(<)>>[];

<

<<<<<"个整型数中最小的是 :"<<()<<;

<

<<<"个双精度数最小的是:"<<()<<;

[];

[];

)

运行结果:

题目、类模板22 /

29

任务编写一个使用类模板对数组经型排序、查找和求元素的和的程序,并才用 相关的数据进行测试。

源程序代码:

<>

<>

()(){}

(*){ ; VV”请输入“vvvv”个数据"(V) >>口VV”该数组的原始数据是:";(<)

«[]««;}

(){(<)(<) ([]<[]) {; [][][][];}}

(){ (<)([]); ;}

(){;(<) []; ;}

VV”请输入您想要建立的数组元素的个数

[];[];

< > 0 <> 0;

00;

VV”请分别输入您所要查找的整型和双精度数

«(()) «"

«(()) «"

:”>>>>;

您所要查找的整型数在"«()«"位" VV"查找失败";

您所要查找的双进度数在"«()«"位" VV"查找失败”VV;

:"(V) «[]««;

:”(v)vv 口 vvvv;

:"«()«; 运行结果:

()«"整型数排序后的顺序为

()«" 双精度数排序后的顺序为

«"整型数组的和为 :” VV()VV;VV”双精度数组的和为

23/29

题目、标准模板库的应用

任务

声明一个整型的数组,使用标准模板库()中查找算法()惊醒数据的查找,

升序和降序排序。

源程序代码:

<>

<>

<>

<>

;

()

(

[]{};

()();

< >();

<>(,"");

<<"数组的原始数据为 :";

(()());

<<"数组值相等的第一个元素为 :";

<<*(()())<<;

(()());

<<<<"升序排列后:";

(()());

(()()<>());

<<<<"降序排列后:”;

(()());

<<;

}

运行结果:

24 / 29

然后排序算法()对数据进行

实验八、的输入、输出流于文件操作

题目、格式化输入输出

任务

以左对齐的方式输出整数,域宽为;

打印有符号数和无符号数;

将十进制整数以开头的十六进制格式输出;

用前导*格式打印;域宽为;

源程序代码:

<>

<>

;

()

{;;;

<<()<<<<;

<<<<;

<<<<;

<<<<<<;

()('*'); <<<<;

)

运行结果:

100

200

200

c8 _ 911

Press any key to continue

题目、文本文件操作

任务 编写程序,打开文件,向其中写入行字符,关闭文件。然后以读写方式打 开,输出文件。

源程序代码:

<>

<>

<>

;

()

{

[];

< <"请输入行字符:"<<;

25 / 29

(<)

{<<"输入第"<<<<"行字符">>[]<<;}

("");

(<)<<[]<<;

();

< <"行字符以存入文件"<<;

< <"从文件中读取信息并显示如下:"<<;

[];

("");

(<)

{();

<<<<;

}

();

}

任务 编写程序,打开二进制文件,向其中写入个字符串,然后将文件值正定位读取文件并显示。

源程序代码:

<>

<>

<>

;

()

{

;

<<"请输入一个字符串:"<<;

>>;

* ;

>("");

>((*)());

>();

<<"字符串以存入文件中"<<<<;

26 / 29

到文件的开头,一次

<<"从文件中读取性信息并显示如下:"<<;

>((*)()); <<<<;

>();

)

运行结果:

请输入一个字符串I

字符串以存入文件中

从文件中读取性信息并显示如下:

qwertyu

Press anv key to continuie

实验九、异常

题目、异常的处理机制

任务写一个程序,球给定数的平方根,并用异常处理机制检测负数的情况。

源程序代码: <> <>

()

<<"请输给定一个数,求其平方根:">>;

{(<)

<<<<"的平方根为:"<<()<<;

)

()

{<<"负数开方!"<<;}

(...)

{ <<"程序出错!"<<;}

}

运行结果:

道班给定一个数,求其平方根:气 负数开方?

Press any key tn cant inue

题目、异常处理机制

任务 定义函数,使其能根据()函数中的调用方式及程序的结果抛出不同 的异常信息。

源程序代码:

<>

27 / 29

<>

J

;

();

()

{

()抛出型的异常

()抛出型的异常

()抛出字符数组的异常

}

()

{

{

();

();

();

}

()

{()

{

:<<""<<;

:<<""<<<<;

:<<" "<<;

}

}

(...)

{ <<"程序出错!"<<;}

}

运行结果:

catch a int白牙e於

99 catch a double 3.14159 catch a string I an « student Press any

key to continue

28 / 29