一、选择题 19. 有如下程序:
#include<iostream>
using namespace std;
int main(){
int f, f1=0, f2=1;
for(int i=3; i<=6; i++) {
f=f1+f2;
f1=f2; f2=f;
}
cout<<f<<end1;
return 0;
}
运行时的输出结果是
。
A B C D
C
[解析] 在主函数中for循环语句执行4次,第一次循环结束时,变量f的值等于1,f1的值等于1,f2的值等于1;第二次循环结束时,变量f的值等于2,f1的值等于1,f2的值等于2;第三次循环结束时,变量f的值等于3,f1的值等于2,f2的值等于3;第四次循环结束时,变量f的值等于5,f1的值等于3,f2的值等于5;结束循环。
20. 有如下程序:
#include<iostream>
using namespace std;
int main(){
int a[6]={23, 15, 64, 33, 40, 58};
int s1, s2;
s1, s2=a[0];
for(int*p=a+1; p<a+6; p++) {
if(s1>*p)s1=*p;
if(s2<*p)s2=*p;
}
cout<<s1+s2<<end1;
return 0;
}
运行时的输出结果是
。
A B C D
D
[解析] 变量s1和s2的初值都等于23,那么在执行第一次for循环时,*p的值等于15,它小于23,所以把15赋给变量s1;执行第二次for循环时,*p的值等于64,它大于23,所以把64赋给变量s2;而数组a中a[2]后面的元素的值都大于15,小于64,因而变量s1,s2的值不会再发生变化,最终值为15+6=79,所以程序输出79。
21. 有如下程序:
#include<iostream>
using namespace std;
void f1(int& x, int& y){int z=x; x=y; y=z;)
void f2(int x, int y){int z=x; x=y; y=z;}
intmain(){
int x=10, y=26;
f1(x, y);
f2(x, y);
cout<<y<<end1;
return 0;
}
运行时的输出结果是
。
A B C D
A
[解析] 子函数f1中的形参是引用变量,所以执行子函数实现了变量x,y值的交换,变量x的值等于26,而变量y的值等于10。而子函数f2中的形参是普通变量,因为C++的函数之间的参数传递是传值,所以执行函数f2不能实现变最x,y值的交换。
22. 有如下程序:
#include<iostream>
using namespace std;
class XA{
int a;
public:
static int b;
XA(int aA) : a(aA) {b++;}
~XA(){}
int get(){return a;}
};
int XA::b=0;
int main(){
XA d1(2), d2(3);
cout<<d1. get()+d2. get()+XA::b<<end1;
return 0;
}
运行时的输出结果是
。
A B C D
C
[解析] 执行XA类的实例变量d1(2)时,成员函数d1.get()的返回值等于2,XA.b的值等于1,执行XA类的实例变量d2(3)时,成员函数d1.get()的返同值等于3,XA.b的值等于2,所以输出结果为2+3+2=7。
23. 有如下程序:
#include<iostream>
using namespace std;
class Point{
int x, y;
public:
Point(int x1=0, int y1=0):x(x1), y(y1){}
int get(){return x+y;)
};
class Circle{
Point center;
int radius;
public:
Circle(int CX, int cy, int r):center(cx, cy), radius(r){}
int get(){return center. get()+radius;}
};
int main(){
circle c(3, 4, 5);
cout<<c. get()<<end1;
return ():
}
运行时的输出结果是
。
A B C D
D
[解析] 根据类Point和类Circle的定义可知,类Circle的实例c(3, 4, 5)的成员函数c.get()返回值为3+4+5=12。
33. 有如下类模板定义:
template<typename T>
class BigNumber{
long n;
public:
BigNumber(T i):n(i){}
BigNumber operator+(BigNumber B) {
return BigNumber(n+b.n);
}
}
已知b1、b2是BigNumber的两个对象,则下列表达式中错误的是
。
A B C D
C
[解析] C++运算符的重载有两个方式,一种是做为成员函数,另种是做为友无函数。前种C++默认省略第一个参数(事实上是对象本身),而后一种是所有的参数都要写全。比如对加法的重载:成员方式为COperator operaior+(Coperator &op);,在调用的过程中我们可以理解为result=operator+(op);友元方式为friend COperator operator-(COperator &op1, COperator &op2);,在调用的过程中我们可以理解为result=operator-(op1, op2);。 对于本题来说,整数3与b1相加时,3是int型,b1是BigNumber<T>型,int型不能和别的型做运算。
35. 有如下程序:
#include<iostream>
using namespace std;
class Pair{
int m, n;
public:
Pair(int j, int k):m(j), n(k){}
int get(){return m;}
int get()const{return m+n;)
};
int main() {
Pair a(3, 5);
const Pair b(3, 5);
cout<<a. get()<<b. get();
return 0;
}
运行时的输出结果是
。
A B C D
B
[解析] 在主函数中定义了类Pair的一个实例变量a,并分别对实例变量a的数据成员m,n赋初值3,5。所以调用a.get()成员函数时,输出3。又定义类Pair的一个常实例变量b,并分别对实例变量b的数据成员m,n赋初值3,5。所以调用成员函数b.get()时,输出8。
二、填空题 1. 有序线性表能进行二分查找的前提是该线性表必须是______存储的。
顺序
[解析] 二分法查找则适用于顺序存储的有序表。这里的有序是指线性表中的元素按值非递减排列(即从小到大,但允许相邻元素值相等)。
2. 一棵二叉树的中序遍历结果为DBEAFC,前序遍历结果为ABDECF,则后序遍历结果为______。
DEBFCA
[解析] 根据二叉树的中序遍历原则可知D为二叉树的最左边的叶子结点,根据二叉树的前序遍历原则可知A是二叉树的根结点,就可以确定二叉树的结构,所以二叉树的后序遍历结果为:DEBFCA。
3. 对软件设计的最小单位(模块或程序单元)进行的测试通常称为______测试。
单元
[解析] 对软件的模板进行的测试通常称为单元测试。
4. 实体完整性约束要求关系数据库中元组的______属性值不能为空。
主键
[解析] 实体完整性约束要求关系数据库中元组的主键属性值为不能为空。
5. 在关系A(S,SN,D) 和关系B(D,CN,NM)中,A的主关键字是S,B的主关键字是D,则称______是关系A的外码。
D
[解析] 属性D在关系A中为一般属性,在关系B中为主关键字,所以称D为关系A的外码。
6. 若有定义语句“int x=10, y=20 z=20;”,则表达式x>z&&y=z的值为______。
0
[解析] 因为变量x的值等于10,变量z的值等于20,所以关系表达式x>z的值为假,即0,又因为关系表达式x>z与关系表达式y=z之间是逻辑与运算,所以整个表达式的值为假,即等于0。
7. 有如下语句序列:
int x=-10;while(++x){}
运行时while循环体的执行次数为______。
9
[解析] ++x运算顺序为先加1后取值。所以循环开始时:第一次x=-9!=0,执行循环体,同时,x=x+1=-8;第二次x=-8!=0,执行循环体,同时x=x+1=-7…后一次x=-1!=0,执行循环体,同时x=x+1=0。当x=0时,while循环条件不成立,退出循环。故循环体一共执行了9次。
8. 有如下语句序列
int arr[2][2]={{9, 8), {7, 6}};
int*p=arr[0]+1; cout<<*p<<end1;
运行时的输出结果是______。
8
[解析] 题目定义了一个一维数组arr[2][2],并对它的每个元素赋初值,表达式arr[0]+1的结果为一维数组arr[1],所以输出*p的值为数组元素arr[1][0]=8。
9. 函数fun的功能是将一个数字字符串转换为一个整数,请将函数补充完整。
int fun(char*str){
int hum=0;
while(*str){
num*=10;
num+=______
str++;
}
return num;
}
(*str-'0')
[解析] 在每次while的循环中,使num大扩10倍,然后从数字字符串str中取得一个数字字符添加到num的个位,数字字符串指针变量指向下一个字符。另外,*str得到的是字符串中字符的ASCⅡ值,必颁转化成其对应的数值,依次执行,直到数字字符串结束,退出循环。
10. 若要将函数“void FriFun{};”声明为类MyClass的友元函数,则应在类MyClass的定义中加入语句______。
friend void FriFun();
[解析] 友元函数要在类定义时声明,声明时要在其函数名前加上关键字friend。
11. 下列程序的输出结果为012,请根据注释将横线处的缺失部分补充完整。
#include<iostream>
using namespace std;
class Test{
public:
Test(int A) {data=a;}
~Test(){}
void print(){cout<<data;)
private:
int data;
};
int main(){
Test t[3]={______};//对有3个元素的Test类对象数组t初始化
for(int i=0; i<3; i++) t[i]. print();
return 0;
}
0,1,2
[解析] 因为Test类的对象数组t包含3个元素,所以对其初始化的形式为{0,1,2 }。
12. 请在横线处填写派生类Derived的继承方式,使得程序的输出结果为Base。
#include<iostream>
using namespace std;
class Base{
public:
void print(){cout<<"Base";)
};
class Derived:______Base{};
int main(){
Derived d;
d.print();
return 0;
}
public
[解析] 派生类Derived{}公有继承基类Base{}时,派生类Derived的实例对象d的成员函数print()会调用基类的公有函数print(),输出Base。
13. 下列程序的输出结果为1 2.3 2 4.6,请将横线处的缺失部分补充完整。
#include<iostream>
using namespace std;
class Base{
public:
Base(int A) :idata(A) {}
void print(){cout<<idata<<' ';}
private:
int idata;
};
class Derived: public Base{
public:
Derived(int a, double B) :______, ddata(B) {}
void priat(){Base::print(); cout<<ddata<<' ';}
private:
double ddata;
};
int main(){
Derived d1(1, 2.3), d2(2, 4.6);
d1. print();
d2. print();
return 0;
}
Base(A)
[解析] 这道题目考察了派生类构造函数的参数形式。派生类构造函数的一般格式是:<派生类名>::<派生类名>(总参数表):<基类名1>(<参数表1>),…<基类名n>(<参数表n>), <成员对象名1>(<参数表n+1>)…成员对象名m>(<参数表n+m>)<派生类构造函数体>。
14. 下列程序的输出结果为-5/8-3/4,请将横线处的缺失部分补充完整。
#include<iostream>
using namespace std;
class Fraction{//"分数"类
public:
Fraction(double a, double B) : num(A) , den(B) {}
~Fraction(){}
Fraction operator -(){
______;
f. num=-f. num;;
return f;
}
void print(){cout<<num<<'/'<<den<<' '}
private:
double num;
double den; //分母
};
int main(){
Fraction f1(5,8), f2(3, 4);
(-f1) print(); (-f2). print();
return 0:
}
Fraction f(-num, den);
[解析] 在重载取负运算符“-”中,定义一个分数对象f,其参数为-num, den。
15. 函数Min的功能是返回具有n个元素的数组array中的最小值。请将横线处的缺失部分补充完整,使得程序的输出结果为1.24。
#include<iostream>
using namespace std;
template<typename T>
T Min(T*array, int n){
T min=array[0];
for(int i=1; i<n; i++)
if(array[i]<min)min=array[i];
return min;
}
int main(){
double art[8]={5.2, 48.45, 41.01, 42, 51.2, 1.24, 14.12, 42};
cout<<______;
return 0:
}
Min(arr, 8)
[解析] 根据函数Min的定义可知其第一个参数为数组名,第二参数为数组的长度,所以在主函数中把数组arr[8]以实参的形式赋给函数Min的形参,就会返回数组arr[8]中的最小元素。