座位号匚口
中央广播电视大学2000-2001学年度第一学期“开放教育(本褂)”期末考试(开)
2001年1月
题号 | 1~ | 三 | 四 | 总分 | ■ | |
分数 |
得分 | 评卷入 |
— |
一、对错题〃判断以下说法的正确性,在下面表格中对应的编号下面
题号 | 1 | 2
LL |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
对/错 | 1 |
写上“对”或“错七(%分•每个题目2分)
变量必须先定义或说明,后使用.
2.
常量不能作为左值使用。
3.
头文件中一般存放着变量和常量的定义、函数的原型以及类的定义。
4・
类的友元函数可以直接访问该类的所有成员。 派生类的成员函数可以直接访问塞类的所有成员o
IW
6-
7・
一个类可以作为另一个类的友元类,
函数的参数和返回值类型可以是简单数据类型•也可以是指钟、引用’薮组和类。
&在基类中被说明为虚函数的类的成员函薮必须在每个派生类中说明为虚函数,才能具
有多态的特征白
9・下面两个语句是等价的;
char str [ ] —11 hello , world
char str [11]=“成州时。湖七
10-用动态申请的内存是在堆中分配的、而不是在栈中分配的.
(1008号)面向对象程序设计试题第1页
得分 | 评卷人 |
---|---|
int data:
〃存放数据
二、简单编程题。根据程序要求,写出函数的完整定义。(共40分)
1.(本每小题15分)写一个函数,完成在链表末尾增加一个节点的操作。函数的原型为:
Node * AddNode (Node * head, int newData);
其中,链表节点的定义如下:
struct Node {
Node * next: 〃指向链表中的下一个节点
};
函数参数:函数的第一个参数head指向链表的第一个节点,如果链表为空,则head的值
为NULL。第二个参数newData为要插入的新节点中存放的数据。
函数返回值:当成功地插入新的节点时,函数返回指向新节点的指针,否则,如果不能申请
到内存空间,则返回NULLO
Node 次 AddNode (Node *&head, mt newData)
〃在下面写岀函数稱实现
(1008号)面向对象程序设计试题第3页
2.(本每小题15分)写一个函数,找出给定字符串中具有最大ASCII码的字符。如字符串 “world”中字符具有最大的ASCH码。函数的原型为:
char MaxCharacter (char * str);
函数参数:str指向所要处理的字符串;
函数返回值:如果 沧不空,则返回具有最大ASCII码的字符,否则返回空字符0x0或
‘If
7
?\0\
char MaxCharacter (char * str)
3.(本每小题10分)用递归函数完成以下运算:
sum(n) = 1 + 2+3 +…+^
函数的原型如下:
int sum (int n);
该函数完成l + 2 + 3 + ・・・+n的运算,并返回运算结果,其中n>0o
提示:你可以使用递归表达式:sum(n) = n+sum(n—1)
ini sum(int n)
评卷人
三、(本小题共30分)
valarray是C+ +的标准模板库中的一个类模板,类模板的每个实例类实现了某个具体
的数据类型的数组,如valarray<mt>是一个整型的数组类。该类的使用和一般的数组非常类 似,可以通过任 了运算符来访问数组中的每个元素。
C+ +的标准模板库中还有一个模板函数abs(),其函数原型为: template<class T> valarray<T>abs (const valarray VT> & x);
该函数的作用是将作为参数的数组x的每个元素的值取绝对值,并返回得到的新的数组。
如原来的数组为:
4 —1 一3 0 —34 •
将这个数组作为参数传递给函数abs后,函数返回的数组就变成:
4 1 3 0 34
要求:阅读下列程序,回答后面的问题。
•x**”******x«** 将**关***%******** ***********************x****x*********
# include Viostream. h>
#include <valarray. h> 〃该头文件中定义了模板类valarray和模板函数abs()
# define ARRAY SIZE 10 typedef valarray<mt> INTVALARRAY ;
INTVALARRAY val array (ARRAY SIZE);
〃定义一长度为ARRAY SIZE的数组对象
〃赋初始值
for (ml 1 =0; 1 <ARRAY SIZE; i + + )
val array [i] = 一 i;
cout〈〈”Size of val _ array=<<val _ array. size()«”\n”;
cout VVThe values of val array before calling abs () ;\n/z;
for (i = 0; i<ARRAY_SIZE; i+ + )
cout V Vval airay[i] V V” ” ;
cout W”\n”;
INTVALARRAY abs array =abs (val array);
cout «Z/The result of val array after calling abs () :\nw ;
.
for (i = 0; i<ARRAY_SIZE; i+ + )
cout VVabs array [i]VV” ”;
cout « “\n”;
J
}
*********************兴*****************火*****水 *****************兴***** / 问题1:(本小题5分)写出程序的输岀结果
答:程序的输出为:
问题2:(每答对一个,得2分,共10分)
关于程序中的语句:
INTVALARRAY val_ array(ARRAY SIZE);
下列说法哪些是正确的,哪些是错误的?在下表相应的位置写上“对”或“错”
题号 | A | B | C | D | E |
对’错 |
扮返回值类型为INTVALARRAY
- 模板类valarray —定有一个只带一个参数的构造函数
- 模板类valarray 一定有一个只带两个参数的构造函数
- ARRAY SIZE将作为参数传递给val array的构造函数,初始化val array对象 问题3:(本小题共12分)下面是模板函数abs()的实现。这个实现中有错误,指出错误并
弓出正确的实现。注意:函数头是正确的,不要改变,所有的错误出现在函数体中。
template<class T> valarray<T>abs(const valarray<T>& x) {
for (int 1 = 0; iVx. sizeO; 1 + + ) if (x[i]V0) * = — 1;
return x;
}
这个函数实现中有以下错误:
(1)
(2)
正确的函数实现应为:
I
template<class T>
valarray<T>abs (const valarray<T>& x)
}■
问题4:(本小题3分)从上面的程序中,你可以推断出;valarray模板类中至少重载了哪个 或哪些C++的运算符?
答:重载了 运算符。
(1008号)面向对象程序设计试题第.9页
四、(本题共10分)下面的程序定义了三个类,Base是图形对象基
得分 | 评卷人 |
---|---|
类,Pomt表示屏幕上的一个点,ColorPoint表示带颜色的点。基类中
利用posx和posy记录图形对象的位置。先阅读三个类的定义,然后回答后面的问题(假定程 序中调用的SetPixel()和SetColorO是系统函数库中预定义的函数,可以直接使用)。
/ *K**X*X*X *****************】****¥ X******* X***********X******H*XX XX* /
class Base ( public:
BaseO : posx(0), posy(0) {};
Base(int px, mt py) : posx(px), posy(py) {};
virtual void draw() = 0;
protected:
mt posx, posy; 〃图形对象的位置
};
class Point: public Base {
public:
Point(int px» int py) : Base(px, py) (} void drawO { SetPixel(posx. posy); };
class ColorPomt: public Point {
public:
ColorPoint(int px, int py) : Point (px, py) ( color =0; }
ColorPointCint px. mt py 5 int c) : Point (px, py),color (c) () void draw ()
4_
SetColor(color);
Point: : draw();
}
protected:
int color ;
A
};
/ ************************************************x***************** /
问题1:(共6分,每答对1个得1分)下面的主程序使用了上面定义的三个类,程序中定 义对象的语句哪些是正确的,哪些是错误的?
void mam ()
{
Base b ; //1
Point pl ; //2
Point p2(3, 4) ; //3
ColorPomt cpl ; // 4
ColorPoint cp2(5,6); //5
l
ColorPoint cp3(7, 8, 1); //6
答
行号 | 1 | 2 | 3 | 4 | 5 | 6 |
对/错 |
问题2:(2分)将类ColorPoint的两个构造函数合并为一个构造函数,写出该函数的实现 (提示:使用函数的默认参数)。
答:合*后的构造函数定义为:
(1008号)面向对象程序设计试题第11页
/
问题3:(2分)下面的程序段
Base * p;
.
p = new ColorPomt (5,6);
p —>draw()
运行后将调用:
答:运行后将调
(供参考)
2001年1月
2) 语法错误不影响语义分的取得,但语义的完全错误可能导致整个程序的不正确,因此当
语义完全错误时,语法分也得不到O
3)语法错误指的是一些不影响程序结构和程序意义的小的错误,如:
•标识符的误写,如:将void写成vrod, float写成flaot等
•括号的不匹配•如忘了写或者’)’等 •将::写成:,或者将:写成::等
4)语法错误一般每个错误扣0.5分,总共扣的分数不超过整个题目所规定的语法分。
•数据类型选择的错误,如变量或函数的参数或函数的返回值 •标识符不合乎要求,如题中要求是member,,而学生写了 num等
一、对错题•共20分,每答对一个,给2分
题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
对/错 | 对 | 对 | 错 | 对 | 错 | 对 | 错 | 错 | 错 | 对 |
二、简单编程题(共40分)
L答案为:
Node -X- AddNodeCNode * &-head, mt newData)
〃申请新的节点空间
Node ¥ newNode= new Node;
if (newNode— =NULL)
return NULL;
〃填充新节点的内容
newNode—>data = newData ; newNode一>next = NULL ;
〃插入到链表的结尾
if (head = — NULL)
head = newNode;
else
〃寻找链表的最后一个节点
Node * tail = head; while (tail — >next ! =NULL)
tail = tail — >next ;
〃将新节点插入到最后
tail 一 >next=newN ode ;
return newNode;
评分标准:本小题共15分,其中:
断是否为NULL,扣2分.申请空间忘记填充内容扣2分,忘记其中一个内容的填充扣1分;
序有错误,扣1分
2.程序可以有多种写法,下面是其中的四种 char MaxCharacter(char * str)
{
if (str == NULL)
return 0x0;
char maxChar — 0x0;
for(int i=0; str[i] ! =0x0; i+ + )
■
(
if (str[订>maxChar)
maxChar = str[i];
}
return maxChar;
}
char MaxCharacter (char * str)
{
if (str= =NULL)
return 0x0;
char maxChar=0x0;
for (int i = 0; i<strlen(str) ; i + + )
{
if (str[订 > maxChar)
maxChar=str El];
}
return maxChar ;
} char MaxCharacter (char * str)
if (str ===== NULL || str[Q]= =0x0)
return 0x0;
char maxChar = str[0];
for (int i=l; str[订 I =0x0; i+ + )
{
if (str[i]>maxChar)
, maxChar = str[i];
}
return maxChar ;
}
char MaxCharacter (char 泱 str)
{
if (str == NULL || str HO] —= 0x0)
return 0x0;
char maxChar == str [0];
int i—1;
while (strp] ! =0x0)
{
if (str >maxChar )
maxChar — strQ];
i+ + ;
—r 4 —i— T— —r I—
}
return maxChar;
}
评分标准:本小题共15分。评分时,只要程序正确就可以,不需要严格和标准答案一样。
具体评分规则:
(1008号)面向对象程序设计答案第4页(共8页)
(1)未判断str是否为NULL,扣3分 (2)未给maxChar赋初值,扣2分
(3)循环的起始条件可以有多种。如果maxChar(考生可以取其他的名字)的初始值设的
是str[Oj,那么循环的开始值为0或者1都可以,如果maxChar的初始值设的是0x0,那么循 环的起始值为0。如果起始值不正确,扣2分
(4)循环的结束条件也可以有多种。可以通过取字符串的长度来决定循环次数,也可以通
过判断字符是否为0x0来判断是否到了字符串的结尾。如果结束条件不正确,扣2分
(5)循环变量必须每次循环增1,如果忘记,扣2分 (6)循环体中应比较所记录的maxChar与当前要判断的字符的大小,根据结果做相应的
操作。如果循环体逻辑不正确,扣3分
(7)程序应返回所得到的maxChar,如果忘记,扣1分 3.递归函数的实现为: mt sum(int n)
if (n= = l)
return 1;
else
return n + sum(n一1);
评分标准:本小题10分,具体评分方式为:
(1)判断递归结束条件的语句占5分,如果没有写或者根本不正确,扣5分,如果写了,但
有错误,贝。视情节轻重扣分:如果,n= = F写成?n = l?或,n = 或3 = 2,等,扣2分,但写成 ?n<2?或,= 是正确的。如果没有写return语句或者返回值不是1,扣2分。
(2)递归调用语句占5分,如果没有return语句,扣2分,如果递归语句逻辑不正确,扣4
分,如果有语法错误,则适当扣分 三、综合题(本小题共30分)
问题L程序的输出结果为:
Size of val array=10
The values of val array before calling abs();
0 —1 -2 —3 _4 —5 —6 —7 —8 —9
The result of val array after calling abs ():
0123456789 评分标准:本小题5分,每正确写出一行,给1分
问题2.
题号 | A | B | C | D | E |
对/错 | 对 | 错 | 对 | 错 | 对 |
评分标准:本小题10分,每答对一个,给2分
问题3.答案:该函数实现有以下错误:
(1)答出参数x为const参数的,给2分 (2)答出应该创建临时对象的,给2分
正确的函数实现为:
template<class T>
valarray<T>abs (const valarrayVT>& x)
INTVALARRAY ret array(x); 〃利用拷贝构造函数构造临时对象
for (mt i = 0; iVx.size。; i+ + )
if (ret array[订〈0)
ret array|2i] ~ —1; 〃取绝对值
return ret array ; 〃返回临时对象
或者
template <class T> valarry<T>absl (const valarray<T>& x)
INTVALARRAY ret array(x. size。); 〃构造一个与x长度相同的对象 for (int 1 = 0; i<x. size() ; i + 十)
if (x[订V0)
ret array[订=x[订烬(一1); 〃取绝对值
else
return ret array ; 〃返回临时对象
} 评分标准:本部分共8分,具体评分方式为:
(1)构造临时对象的语句占3分。没有写扣3分,有错误,视情节轻重扣1—3分。
(2)循环语句占4分。有逻辑或语法错误,视情节轻重扣1一4分:如果改变的是参薮x的 值,扣2分,如果忘记求绝对值,扣2分。有小的语法错误,扣1—2分。
(3)返回临时对象的语句占1分,没有写或有错误,扣1分。 问题4.答案:重载了取数组下标的运算符,□七
评分标准:本小题3分,多答了其他运算符,扣2分,未答运算符,[丁,不绐分。
IF
四、(本题共10分)
U!
问题L每答对一个给分,共6分
行号 | 1 | 2 | 3 | 4 | ■
5 |
6 |
对/错 | 对 | 错 | 对 | 错 | 对 | 对 |
问题2:合并后的构造函数为:
ColorPoint(mt px, int py, int c = 0): Point(px, py), color(c) () 或:
ColorPoint(mt px, int py, int c=0): Pomt(px, py)
{
color=c ;
}
评分标准:完全正确给2分,小的语法错误扣1分,没有写默认参数不给分 问题 3:将调用(C),即 ColorPoint:: draw()
评分标准:答对给2分,不对不给分 ,
评论0