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
Derived::f
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


发布评论