资源描述
面向对象程序设计网上教学活动文本( .10.20)
唐龙: 同学们现在开始答疑, 请大家提问。
问: 怎样学好这门课程?
唐龙: 最简单一句话说是: 在初步理解主要基本概念的基础上多上机实践。
问: 在C++进行程序开发时, 遇到大批量的数据需要处理时, 是用函数还是结构链, 是不是还有其它的办法?
唐龙: 这不能一概而论, 要看所处理的是什么数据, 有什么处理要求, 先要选择采用合理的数据结构和算法, 才可能开发出适用的程序。
问: 我们怎样才能考好这门课程? 它的考试题型有哪些?
徐孝凯:
1.认真听好老师的面授辅导课;
2.认真按照实验教材的要求做好每个实验;
3.认真做好形成性作业;
4.到期末复习阶段, 按照实验教材的附录中所给的综合练习题重复做好练习。
5.参考以前考过的试卷, 题型基本不变。
问: 面向对象程序设计的重点内容?
唐龙: 本课程着重对C++语言的基本概念和语法规则理解, 掌握其使用方法, 进而初步学会运用于实际编程。最重要的基本概念, 例如, 类与对象, 继承, 重载等一定要清楚理解, 并学会在简单的编程应用。
徐孝凯: 往届试卷, 供同学们复习时参考
中央广播电视大学
计算机科学与技术专业面向对象程序设计试题( 3)
8月
题 号
一
二
三
四
五
六
七
总 分
得 分
一、 单项选择( 每小题1分, 共12分)
1.设x和y均为bool量, 则x || y为假的条件是( )。
A. 它们均为真 B. 其中一个为真
C. 它们均为假 D. 其中一个为假
2. 假定一个二维数组的定义语句为”int a[3][4]={{3,4},{2,8,6}};”, 则元素a[1][2]的值为( ) 。
A. 2 B. 4 C. 6 D. 8
3. 以下错误的描述是( ) 。
函数调用能够
A. 出现在一个表示式中 B. 出现在执行语句中
C. 作为一个函数的实参 D. 作为一个函数的形参
4. 关于局部变量, 下面说法正确的是( )。
A. 定义该变量的程序文件中的函数都能够访问
B. 定义该变量的函数中的定义处以下的任何语句都能够访问
C. 定义该变量的复合语句中的定义处以下的任何语句都能够访问
D. 定义该变量的函数中的定义处以上的任何语句都能够访问
5. 假定p是具有int**类型的指针变量, 则给p赋值的正确语句为( ) 。
A. p=new int; B. p=new int*; C. p=new int**; D. p=new int[10];
6. 软件产品在需求发生变化、 运行环境发生变化或发现软件产品本身的错误或不足时进行相应的软件更新的难易程度叫做软件的( ) 。
A. 可维护性 B. 可复用性 C. 兼容性 D. 正确性
7. 若需要把一个类外定义的成员函数指明为内联函数, 则必须把关键字( ) 放在函数原型或函数头的前面。
A. in B. inline C. inLine D. InLiner
8. 在一个用数组实现的队列类中, 假定数组长度为MS, 队首元素位置为first, 队列长度为length, 则队尾的后一个位置为( )。
A. length+1 B. first+length
C. (first+length-1)%MS D. (first+length)%MS
9. 假定一个类的构造函数为 ”A(int aa, int bb) {a=aa; b=aa*bb;}”, 则执行 ”A x(4,5);”语句后, x.a和x.b的值分别为( )。
A. 4和5 B. 5和4 C. 4和20 D. 20和5
10. 假定AB为一个类, 则执行”AB *p=new AB(1,2);”语句时共调用该类构造函数的次数为( )。
A. 0 B. 1 C. 2 D. 3
11. 一个类的成员函数也能够成为另一个类的友元函数, 这时的友元说明( ) 。
A. 需加上类域的限定 B. 不需加上类域的限定
C. 类域的限定可加可不加 D. 不需要任何限定
12. 关于插入运算符<<的重载, 下列说法不正确的是( ) 。
A. 运算符函数的返回值类型是ostream & 。
B. 重载的运算符必须定义为类的成员函数。
C. 运算符函数的第一个参数的类型是ostream & 。
D. 运算符函数有两个参数。
二、 填空( 每空1分, 共14分)
1. 当执行cout语句输出endl数据项时, 将使C++显示输出屏幕上的光标从当前位置移动到________的开始位置。
2. 假定x和y为整型, 其值分别为16和5, 则x/y和double(x)/y的值分别为__________和__________。
3. 执行switch语句时, 在进行作为条件的表示式求值后, 将从某个匹配的标号位置起向下执行, 当碰到下一个标号位置时________执行。
4. strlen(”apple”)的值为________, strcmp(”a”,”A”)的值为________。
5. C++程序运行时的内存空间能够分成全局数据区, 堆区, 栈区和__________区。
6.假定a是一个一维指针数组, 则a+i所指对象的地址比a大________字节。
7. 已知语句”cout<<p;”的输出是”Hello!”, 则语句”cout<<*p;”输出的是__________。
8. 如果一个派生类只有一个唯一的基类, 则这样的继承关系称为__________。
9.假定AA是一个类, ”AA* abc()const;”是该类中一个成员函数的原型, 在该函数体中__________向*this或其成员赋值。
10.假定用户没有给一个名为AB的类定义构造函数, 则系统为其定义的构造函数为__________。
11.假定用户为类AB定义了一个构造函数"AB(int aa) {a=aa;}", 该构造函数实现对数据成员_________的初始化。
12. 作为类的成员函数重载一个运算符时, 参数表中只有一个参数, 说明该运算符有________个操作数。
三、 程序填充, 对程序、 函数或类中划有横线的位置, 根据题意按标号把合适的内容填写到程序下面相应标号的后面( 每小题6分, 共24分)
1. 下面程序计算出的值。
#include<iostream.h>
void main()
{
double x,p1=1,p2=1,s=0;
int i,j=1;
cout<<"输入x的值:";
cin>>x;
for(i=1;i<=10;i++) {
p1*=___(1)_____;
p2*=____(2)____;
s+=j*p1/p2; //j的值为(-1)i+1
j=____(3)____;
}
cout<<s<<endl;
}
(1) (2) (3)
2. 假定有定义为”struct NODE{int data; NODE* next;};”, 下面算法是依次显示输出以L为表头指针的链表中各结点的值。
void ff(NODE* L)
{
for(___(1)___; p!=NULL; ___(2)___)
cout<<___(3)___ <<' ';
cout<<endl;
}
(1) (2) (3)
3. 假定有定义为”struct NODE{int data; NODE* next;};”, 下面算法是把以L为表头指针的链表中各结点依次按相反次序链接并返回新链表的表头指针。
NODE* f8(NODE* L)
{
if(L==NULL) return NULL;
NODE *p=NULL, *q=L, *t;
while(q!=NULL) {
t=q;
q=___(1)___;
t->next=___(2)___;
p=t;
}
___(3)___;
}
(1) (2) (3)
4. 已知一个利用数组实现栈的类定义如下:
const int ARRAY_SIZE=10;
class Stack {
public:
void Init() {top=-1;} //初始化栈为空
void Push(int newElem); //向栈中压入一个元素
int Pop(); //从栈顶弹出一个元素
bool Empty() { //判栈空
if(top==-1) return true;else return false;}
int Depth() {return top+1;} //返回栈的深度
void Print();
//按照后进先出原则依次输出栈中每个元素, 直到栈空为止
private:
int elem[ARRAY_SIZE]; //用于保存堆栈元素的数组
int top; //指明栈顶元素位置的指针
};
该类的Pop和Print函数的实现分别如下:
___(1)___ {
if(top==-1) {
cout<<"栈空!"<<endl;
exit(1); //中止运行
}
return ___(2)___;
}
void Stack::Print() {
while(!Empty())
cout<<___(3)___ <<' ';
cout<<endl;
}
(1) (2) (3)
四、 写出程序运行结果( 每小题8分, 共16分)
1. #include<iostream.h>
int a[8]={36,25,20,43,12,70,66,35};
void main()
{
int s0,s1,s2;
s0=s1=s2=0;
for(int i=0; i<8; i++) {
switch(a[i]%3) {
case 0: s0+=a[i];break;
case 1: s1+=a[i];break;
case 2: s2+=a[i];break;
}
}
cout<<s0<<’ ’<<s1<<’ ’<<s2<<endl;
}
2.#include<iostream.h>
#include<string.h>
class CD {
char* a;
int b;
public:
void Init(char* aa, int bb)
{
a=new char[strlen(aa)+1];
strcpy(a,aa);
b=bb;
}
char* Geta() {return a;}
int Getb() {return b;}
void Output() {cout<<a<<' '<<b<<endl;}
};
void main()
{
CD dx,dy;
char a[20];
dx.Init("abcdef",30);
strcpy(a,dx.Geta());
strcat(a,"xyz");
dy.Init(a,dx.Getb()+20);
dx.Output();
dy.Output();
}
五、 指出程序或函数的功能( 每小题6分, 共12分)
1. #include<iostream.h>
#include<stdlib.h>
#include<math.h>
void main()
{
int i=10,a;
while(i>0) {
a=rand()%90+10;
int j, k=int(sqrt(a)+1e-5); //sqrt(x)为求x的平方根函数
for(j=2; j<=k; j++)
if(a%j==0) break;
if(j>k) {cout<<a<<' '; i--;}
}
}
2. void Input(IntNode*& f)
{
int n;
cout<<”从键盘给n输入一个整数:”;
do cin>>n; while(n<0);
if(n==0) {f=NULL; return;}
f=new IntNode;
IntNode* p=f;
cout<<”从键盘输入”<<n<<”个整数:”;
while(n--) {
p=p->next=new IntNode;
cin>>p->data;
}
p->next =NULL;
p=f; f=f->next; delete p;
}
假定IntNode的类型定义为:
struct IntNode {
int data; //结点值域
IntNode* next; //结点指针域
};
六、 程序改错, 请根据程序段或函数模块的功能改写个别地方的错误( 6分) 。
假定要求下面程序的输出结果为”11/15”,其主函数中存在着三行语句错误, 请指出错误语句行的行号并改正错误行。
#include<iostream.h>
class Franction { //定义分数类
int nume; //定义分子
int deno; //定义分母
public:
//把*this化简为最简分数, 具体定义在另外文件中实现
void FranSimp();
//返回两个分数*this和x之和, 具体定义在另外文件中实现
Franction FranAdd(const Franction& x);
//置分数的分子和分母分别0和1
void InitFranction() {nume=0; deno=1;}
//置分数的分子和分母分别n和d
void InitFranction(int n, int d) {nume=n; deno=d;}
//输出一个分数
void FranOutput() {cout<<nume<<'/'<<deno<<endl;}
};
void main() //1行
{ //2行
Franction a,b,c; //3行
a.InitFranction(6,15); //4行
b.InitFranction(1); //5行
c.InitFranction(); //6行
c=FranAdd(a,b); //7行
cout<<c.nume<<’/’<<c.deno<<endl; //8行
} //9行
错误行的行号为______、 ________和________。
分别改正为____________________、 ________________和___________________。
七、 编程( 每小题8分, 共16分)
1. 计算1+3+32+...+310的值并输出, 假定分别用i,p,s作为循环变量、 累乘变量和累加变量的标识符。
2. 根据下面类中Uion 函数的原型和注释写出它的类外定义。
class Array {
int *a; //指向动态分配的整型数组空间
int n; //记录数组长度
public:
Array(int aa[], int nn); //构造函数, 利用aa数组长度nn初始化n,
//利用aa数组初始化a所指向的数组空间
Array(Array& aa); //拷贝构造函数
Array& Give(Array& aa); //实现aa赋值给*this的功能并返回*this
Array Uion(Array& aa); //实现*this和aa中的数组合并的功能, 把合并
//结果(其长度为两数组长度之和)存入临时对象并返回
int Lenth() {return n;} //返回数组长度
void Print() { //输出数组
for(int i=0; i<n; i++)
cout<<a[i]<<' ';
cout<<endl;
}
};
中央广播电视大学
计算机科学与技术专业面向对象程序设计试题
答案及评分标准
( 供参考)
一、 单项选择( 每小题1分, 共12分)
1. C 2. C 3. D 4. C 5. B 6. A
7. B 8. D 9. C 10. B 11. A 12. B
二、 填空( 每空1分, 共14分)
1. 下一行 2. 3 3.2 3. 不停止 4. 5 1 5. 代码 6.4*i
7.H 8. 单继承 9. 不能够 10. AB() {} 11. a 12. 2
三、 程序填充, 对程序、 函数或类中划有横线的位置, 根据题意按标号把合适的内容填写到程序下面相应标号的后面( 每小题6分, 共24分)
1.
(1) x //2分
(2) i //2分
(3) –j //2分
2.
(1) NODE* p=L //2分
(2) p=p->next //2分
(3) p->data //2分
3.
(1) q->next //2分
(2) p //2分
(3) return p //2分
4.
(a) int Stack::Pop() //2分
(b) elem[top--] //2分
(c) Pop() //2分
四、 写出程序运行结果( 每小题8分, 共16分)
1. 114 138 55 //每个数据占3分, 全对给8分
2.
abcdef 30 //4分, 每个数据2分
abcdefxyz 50 //4分, 每个数据2分
五、 指出程序或函数的功能( 每小题6分, 共12分)
1.随机产生出10个10至100( 或99) 之间的素数并显示出来。
2.首先从键盘上输入一个整数给n, 然后依次输入n个整数建立以表头指针为f的链表。
评分标准: 根据叙述情况酌情给分。
六、 程序改错, 请根据程序段或函数模块的功能改写个别地方的错误( 6分) 。
错误行的行号为5 7 8
分别改正为b.InitFranction(1,3); c=a.FranAdd(b); c.FranOutput()
评分标准: 共6个数据, 每个数据1分。
七、 编程( 每小题8分, 共16分)
评分标准: 根据编程情况酌情给分。
1.
#include<iostream.h>
void main()
{
int i; //用i作为循环变量
int p=1; //用p作为累乘变量
int s=1; //用s作为累加循环变量
for(i=1;i<=10;i++) {p*=3; s+=p;}
cout<<s<<endl;
}
2.
Array Array::Uion(Array& aa) {
int k=n+aa.n;
int* w=new int[k];
int i;
for(i=0; i<n; i++) w[i]=a[i];
for(i=0; i<aa.n; i++) w[i+n]=aa.a[i];
Array r(w,k);
return r;
}
中央广播电视大学
计算机科学与技术专业面向对象程序设计试题( 4)
8月
题 号
一
二
三
四
五
六
七
总 分
得 分
一、 单项选择( 每小题1分, 共13分)
1. 字符串”a+b=12\n”的长度为( ) 。
A. 6 B. 7 C. 8 D. 9
2. 假定一个二维数组的定义语句为”int a[3][4]={{3,4},{2,8,6}};”, 则元素a[2][1]的值为( ) 。
A. 0 B. 4 C. 8 D. 6
3. 以下正确的描述是( ) 。
A. 函数的定义能够嵌套, 函数的调用不能够嵌套
B. 函数的定义不能够嵌套, 函数的调用能够嵌套
C. 函数的定义和函数的调用均能够嵌套
D. 函数的定义和函数的调用均不能够嵌套
4. 设有定义”double array[10];”, 则表示式sizeof(array)/sizeof(array[0])的结果为( )。
A. array数组首地址 B. array数组中元素个数
C. array数组中每个元素所占的字节数 D. array数组占的总字节数
5. 要使p指向动态空间中的包含30个整数单元的数组使用的定义语句为( ) 。
A. int *p=new int[30]; B. int *p=new int(30);
C. int *p=new [30]; D. *p=new int[30];
6. 软件产品与其它软件产品组合成一个整体的难易程度叫做软件的( ) 。
A. 可维护性 B. 可复用性 C. 兼容性 D. 正确性
7. 在多文件结构的程序中, 一般把类的定义单独存放于( ) 中。
A. 主文件 B. 实现文件 C. 库文件 D. 头文件
8. 在一个用数组实现的队列类中, 假定数组长度为MS, 队首元素位置为first, 队列长度为length, 则队首的后一个位置为( )。
A. first+1 B. (first+1)%MS
C. (first-1)%MS D. (first+length)%MS
9. 假定一个类的构造函数为”A(int aa=1, int bb=0) {a=aa; b=bb;}”, 则执行”A x(4);”语句后, x.a和x.b的值分别为( )。
A. 1和0 B. 1和4 C. 4和1 D. 4和0
10. 假定AB为一个类, 则执行”AB a(2), b[3], *p[4];”语句时共调用该类构造函数的次数为( )。
A. 3 B. 4 C. 5 D. 9
11. 在成员函数中进行双目运算符重载时, 其参数表中应带有( ) 个参数。
A. 0 B. 1 C. 2 D. 3
12. 在重载一运算符时, 若运算符函数的形参表中没有参数, 则不可能的情况是( ) 。
A. 该运算符是一个单目运算符。
B. 该运算符函数有一个隐含的参数this。
C. 该运算符函数是类的成员函数。
D. 该运算符函数是类的友元函数。
13. 派生类的对象对其基类中( ) 可直接访问。
A. 公有继承的公有成员
B. 公有继承的私有成员
C. 公有继承的保护成员
D. 私有继承的公有成员
二、 填空( 每空1分, 共17分)
1. 多行注释的开始标记符和结束标记符分别为__________和__________。
2. 假定x=5, y=6, 则表示式x++*++y的值为__________。
3. 假定x是一个逻辑量, 则x && true的值为__________。
4. 含随机函数的表示式rand()%20的值在_____至______区间内。
5. 若需要把一个字符串”aaa”赋值到字符数组a中, 则需要执行________字符串函数的调用来实现。
6. 程序的编译是以__________为单位进行的。
7. 一个数组的数组名实际上是指向该数组的________元素的指针, 而且在任何时候都不允许________它。
8. 指针变量pv和pc定义为”void *pv =”Hello, word!”; char *pc;”, 要将pv值赋给pc, 则正确的赋值语句是_______________。
9. C++支持两种多态性: _________时的多态性和__________时的多态性。
10.在一个用数组实现的队列类中, 除了保存队列元素的叔祖成员外, 还包含有两个数据成员, 一个指明队首元素位置, 另一个指明队列____________。
11.一个类的__________函数一般见于实现释放该类对象中指针成员所指向的动态存储空间的任务。
12. 假定用户为类AB定义了一个构造函数”AB(int aa, char *bb=NULL):a(aa),b(bb){}”, 则该类中至少包含有__________个数据成员。
13. 重载插入运算符<<时, 其运算符函数的返回值类型应当是____________。
三、 程序填充, 对程序、 函数或类中划有横线的位置, 根据题意按标号把合适的内容填写到程序下面相应标号的后面( 每小题6分, 共18分)
1. 打印出2至99之间的所有素数(即不能被任何数整除的数)。
#include<iostream.h>
#include<math.h>
void main()
{
int i,n;
for(n=2; ___(1)___; n++) {
int temp=int(sqrt(n)); //求出n的平方根并取整
for(i=2; ___(2)___; i++)
if(n%i==0) ___(3)___;
if(i>temp) cout<<n<<' ';
}
cout<<'\n';
}
(1) (2) (3)
2. 下面是对按从小到大排列的有序数组a[n]中进行二分查找x的算法, 若查找成功返回该元素下标, 否则返回-1。
int BinarySearch(int a[],int n,int x)
{
int low=0, high=n-1; //定义并初始化区间下界和上界变量
int mid; //定义保存中点元素下标的变量
while(low<=high) {
mid=___(1)___;
if(x==a[mid]) ___(2)___;
else if(x<a[mid]) high=mid-1;
else ___(3)___;
}
return -1;
}
(1) (2) (3)
3.
class A {
int a,b;
public:
A(int aa=0, int bb=0) ___(1)___ {} //分别用aa和bb对应初始化a和b
};
main() {
___(2)___ ; //定义类A的对象x并用5初始化, 同时定义y并用x初始化
___(3)___ ; //定义p指针, 使之指向对象x
}
(1) (2) (3)
四、 写出程序运行结果( 每小题6分, 共18分)
1. #include<iomanip.h>
const int N=5;
void main()
{
int i,p=1,s=0;
for(i=1;i<N; i++) {
p=p*i;
s=s+p;
cout<<setw(5)<<i<<setw(5)<<p;
cout<<setw(5)<<s<<endl;
}
}
2. #include<iostream.h>
void main()
{
char s[3][5]={"123
展开阅读全文