一、选择题(每小题1分,共40小题,共40分)
1.算法的空间复杂度是指( )。
A.算法程序的长度
B.算法程序中的指令条数
C.算法程序所占的存储空间
D.算法执行过程中所需要的存储空间
2.下列叙述中正确的是( )。
A.一个逻辑数据结构只能有一种存储结构
B.逻辑结构属于线性结构,存储结构属于非线性结构
C.一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率
D.一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率
3.下列叙述中正确的是( )。
A.一个算法的空间复杂度大,则其时间复杂度必定大
B.一个算法的空间复杂度大,则其时间复杂度必定小
C.一个算法的时间复杂度大,则其空间复杂度必定小
D.上述三种说法都不对
4.最简单的交换排序方法是( )。
A.快速排序
B.选择排序
C.堆排序
D.冒泡排序
5.有下列二叉树,对此二叉树前序遍历的结果是( )。
A.ACFXDBEYZ
B.ABEFXYZCD
C.ABCDEFXYZ
D.ABDYECFXZ
6.下列工具中为需求分析常用工具的是( )。
A.PAD
B.PFD
C.N-S
D.DFD
7.有下列二叉树,对此二叉树前序遍历的结果是( )。
A.ACBEDGFH
B.ABDGCEHE
C.HGFEDCBA
D.ABCDEFGH
8.使用白盒测试法时,确定测试数据应该根据( )和指定的覆盖标准。
A.程序的内部逻辑
B.程序的复杂结构
C.使用说明书
D.程序的功能
9.下列选项中不属于软件生命周期开发阶段任务的是( )。
A.软件测试
B.概要设计
C.软件维护
D.详细设计
10.数据库DB、数据库系统DBS、数据库管理系统DBMS之间的关系是( )。
A.DB包括DBS和DBMS
B.DBMS包括DB和DBS
C.DBS包括DB和DBMS
D.没有任何关系
11.实现运行时的多态性要使用( )。
A.重载函数
B.析构函数
C.构造函数
D.虚函数
12.已知chara;intb;floatC;doubled;则表达式a*b+c-d的结果为( )。
A.double
B.int
C.float
D.char
13.已知一函数的形参说明为intarr[5][6],则与此等效的形参说明为( )。
A.intarr[][]
B.int[5][]
C.int*a[6]
D.int(*a)[6]
14.下列关于虚函数的描述中,正确的是( )。
A.虚函数是一个static类型的成员函数
B.虚函数是一个非成员函数
C.基类中采用virtual说明一个虚函数后,派生类中定义相同原型的函数时可不必加virtual说明
D.派生类中的虚函数与基类中相同原型的虚函数具有不同的参数个数或类型
15.下列运算符中不能在C++中重载的是( )。
A.?:
B.+
C.-
D.<=
16.考虑函数原型voidtest(inta,intb=7,charz=’*’),下面的函数调用中,属于不合法调用的是( )。
A.test(5);
B.test(5,8);
C.test(6,’#’);
D.test(0,0,’*’);
17.下列是重载为非成员函数的运算符函数原型,其中错误的是( )。
A.Fractionoperator+(Fraction,Fraction);
B.Fractionoperator-(Fraction);
C.Fraction&operator=(Fraction&,Fraction);
D.Fraction&operator+=(Fraction&,Fraction):
18.下列说法正确的是( )。
A.内联函数在运行时将该函数的目标代码插入每个调用该函数的地方
B.内联函数在编译时将该函数的目标代码插入每个调用该函数的地方
C.类的内联函数必须在类体内定义
D.类的内联函数必须在类体外通过加关键字inline定义
19.下面有关重载函数的描述中正确的是( )。
A.重载函数必须具有不同的返回值类型
B.重载函数形参个数必须不同
C.重载函数必须具有不同的形参列表
D.重载函数名可以不同
20.下列字符串中,正确的C++标识符是( )。
A.foo-1B.2b
C.newD._256
21.设有定义:
classC
{public:
intvalue;
…
};
intX,*P;
则以下引用形式中,正确的是( )。
A.x=value;
B.x=C::value;
C.p=&value
D.p=C::value
22.有以下程序:
#include
usingnamespacestd;
classsample
{
private:
intX;
public:
sample(inta)
{
X=a:
}
frienddoublesquare(samples);
};
doublesquare(samples)
{
returnS.x*S.X:
}
intmain()
{
samples1(20),s2(30);
cout< return0;
}
执行结果是( )。
A.20
B.30
C.900
D.400
23.有以下程序:
#include
usingnamespaeestd;
classMyClass
{
public:
MyClass(intn){number=n;}
//拷贝构造函数
MyClass(MyClass&other){number=other.number;}
~MyClass(){}
private:
intnumber;
};
MyClassfun(MyClassp)
{
MyClasstemp(p);
returntemp;
}
intmain()
{
MyCIassobj1(10),obj2(O);
MyClassobj3(obj1);
obj2=fun(obj3);
return0;
程序执行时,MyClass类的拷贝构造函数被调用的次数是( )。
A.5
B.4
C.3
D.2
24.下列函数的运行结果是( )。
#include
intadd(inta,intb);
voidmain()
{
externintX,y;
cout< }
intx(20),y(5);
intadd(inta,intb)
{
ints=a+b:
returns;
}
A.25
B.30
C.20
D.15
25.执行语句:cout< A.123*******0K
B.123#######OK
C.123********0K********
D.123#######OK########
26.下面是关于派生类声明的开始部分,其中正确韵是( )。
A.classvirtualB:publicA
B.virtualclassB:publicA
C.classB:publicAvirtual
D.classB:virtualpublicA
27.下面程序的运行结果为( )。
#include
ClassA
{
public:A( ){cout<<"1";}
~A( ){cout<<"2";}
};
ClassB:public:A
{
public:
B( ){cout<<"3";}
~B( ){cout<<"4";}
};
Voidmain( )
{
Bb;
}
A.1234
B.1324
C.1342
D.3142
28.下列关于构造函数和析构函数的描述,错误的是( )。
A.析构函数中调用虚函数采用静态联编
B.对虚析构函数的调用可以采用动态联编
C.当基类的析构函数是虚函数时,其派生类的析构函数也一定是虚函数
D.构造函数可以声明为虚函数
29.若有如下程序:
#include
usingnamespaeestd;
classTestClass
{
public:
voidwho(){cout<<"TestClass"< };
classTestClassl:publicTestClass
{
public:
voidwho(){cout<<"TestClassl"< intmain()
{
TestClass*P;
TestClasslobj1;
p=&obj1;
p->who();
retum0;
}
则该程序运行后的输出结果是( )。
A.TestClassl
B.TestClass
C.0
D.无输出
30.有以下程序:
#include
usingnamespacestd;
#defineP13.14
classPoint
{private:
intX,y;
public:
Point(inta,intb)
{x=a:
y=b;}
intgetx()
{returnX;}
intgety()
{returny;}};
classCircle:publicPoint
{private:
intr;
public:
Circle(inta,intb,intc):Point(a,b)
{r=C;}
intgetr()
{returnr;}
doublearea()
{returnPI*r*r;}};
intmain()
(Circlec1(5,7,10);
cout< return0;}
程序执行后的输出结果是( )。
A.314
B.157
C.78.5
D.153.86
31.有如下程序:
#include
usingnamespacestd;
intmain()
{
int*P;
*P=9:
cout<<"ThevalueatP:"<<*P;
return0;
}
编译运行程序将出现的情况是( )。
A.编译时出现语法错误,不能生成可执行文件
B.运行时一定输出ThevalueatP:9
C.运行时一定输出ThevalueatP:*9
D.运行时有可能出错
32.有如下类定义:
classFoo
{
public:
Foo(intv):value(v){}//①
~Foo(){}//②
private:
Foo(){}//③
intvalue=0;//④
};
其中存在语法错误的行是( )。
A.①
B.②
C.③
D.④
33.下列程序的运行结果是( )。
#include
classA
{
inta;
public:
A(){a=0;}
A(){intaa}
{a=aa;
cout< }
};
voidmain()
{
Ax,y(2),z(3);
cout< }
A.OOB.23
C.34D.25
34.语句ofstreamf("DATA.DAT",ios_base::app|ios_base::binary);的功能是建立流对象f,试图打开文件DA-TA.DAT并与之连接,而且( )。
A.若文件存在,将文件指针定位于艾件首;若文件不存在,建立一个新文件
B.若文件存在,将其截为空文件;若文件不存在,打开失败
C.若文件存在,将文件指针定位于文件尾;若文件不存在,建立一个新文件
D.若文件存在,打开失败;若文件不杉在,建立一个新文件
35.下面程序的输出结果是( )。
#include
Usingnamespacestd;
ClassBase{
public:
Base(intx=O){count< }
};
ClassDerived:publicBase{
public:Derved(intx=0{count< }
private;
Baseval;
};
intmina(){
Derivedd(1);
retrun0;
}
A.0
B.1
C.01
D.001
36.计算斐波那契数列第n项的函数定义如下:
intfib(intn){
if.(n==0)return1;
elseif(n==1)return2:
elsereturnfib(n-1)+fib(n-2);
}
若执行函数调用表达式fib(2),函数fib被调用的次数是( )。
A.1
B.2
C.3
D.4
37.要定义一个引用变量P,使之引用类MyClass的一个对象,正确的定义语句是( )。
A.MyClassp=MyClass;
B.MyClassp=newMyClass;
C.MyClass&p=newMyClass
D.MyClassa,&p=a;
38.下列关于虚基类的描述中,错误的是( )。
A.使用虚基类可以消除由多继承产生的二义性
B.构造派生类对象时,虚基类的构造函数只被调用一次
C.声明“classB:virtualpublicA”说明类B为虚基类
D.建立派生类对象时,首先调用虚基类的构造函数
39.将运算符重载为类成员函数时,其参数表中没有参数,说明该运算符是( )。
A.不合法的运算符
B.一元运算符
C.无操作数的运算符
D.二元运算符
40.有如下模板声明:
templateclassA;
下列声明中,与上述声明不等价的是( )。
A.templateclassA;
B.templateclassAt
C.templateclassA;
D.templateclassA;
二、程序改错题(18分)
使用VC++6.0打开考生文件夹下的源程序文件1.cpp,该程序运行时有错,请改正其中的错误,使程序正常运行,并使程序输出的结果为:
sizeof(S1)=5
sizeof(s2)=10
sizeof(s3)=1
注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在//******error******的下面。
(1)不能删除assert()语句。
(2)只能修改后面的数字。
提示:assert函数如果为假,则会产生一个中断异常。
试题程序:
#include
#include
voidmain()
{
char*s1="abc":
//********error********
assert(sizeof(s1)==3):
cout<<"sizeof(s1)=5"< chars2[10]="ab":
//********error********
assert(sizeof(s2)==2);
cout<<"sizeof(s2)=10"< chars3=23:
//********error********
assert(sizeof(s3)==4);
cout<<"sizeof(s3)=1"< return;
}
三、简单应用题(24分)
使用VC++6.0打开考生文件夹下的源程序文件2.cpp。阅读下列函数说明和代码,完成空出部分程序。函数fun(intn)的功能是在n行n列的矩阵中,每行都有最大的数,本程序求这n个最大数中的最小一个,并作为参数返回。
注意:不能修改程序的其他部分,只能修改fun函数。
试题程序:
#include
#defineN100
inta[N][N];
intfun(intn)
{
}
voidmain()
{
intn;
cout<<"pleaseinputN:"< ein>>n;
for(inti=0;i for(intj=0;j {
cout<<"pleaseinputaNumber:"< cin>>a[i][j];
}
eout<<"Theminofmaxnumbersis"< }
四、综合应用题(18分)
使用VC++6.0打开考生文件夹下的源程序文件3.cpp。其中定义的类不完整,按要求完成下列操作,将类的定义补充完整。
(1)定义类的公有数据成员函数N0、Name[32],其中N0是int型的数据,Name[32]为字符型。请在注释1后添加适当的语句。
(2)完成函数Set的定义,分别设置N0和Name的值,请在注释2后添加适当的语句。
(3)完成函数print,请在注释3后添加适当的语句,输出结果如下:
N0=12345
Name=HelloWorld!
(4)添加默认构造函数,设置N0为0,Name为空,请在注释4后添加适当的语句。
注意:增加或者修改代码的位置已经用符号表示出来,请不要修改其他的程序代码。
试题程序:
#include
classTC
{
public:
//********1********
//********2********
{
No=no;
for(inti=0;strName[i]!=0;i++)
{
Name[i]=strName[i];
Name[i+1]=0;
}
}
voidprint()
{
//********3********
}
TC()
{
//********4********)
};
intmain()
{
TCstu:
stu.Set(12345,"HelloWorld!");stu.print();
return0;
}
一、选择题
1.D。【解析】一个算法的空间复杂度一般是指执行这个算法所需的存储空间。一个算法所占用的存储空闾包括算法程序所占用的空间、输入的初始数据所占用的存储空间及算法执行过程中所需要的额外空间。
2.D。【解析】数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式,一种数据结构可以根据需要采用不同的存储结构,常用的存储结构有顺序和链式结构。采用不同的存储结构,其处理的效率是不同的。
3.D。【解析】算法的时间复杂度和算法的空间复杂度是从不同的角度来衡量算法的执行情况的,它们之间没有内在联系。
4.D。【解析】交换排序方法是指借助数据元素之间的互相交换进行排序的一种方法,包括冒泡排序和快速排序。冒泡排序是一种最简单的交换排序方法,它通过相邻元素的交换,逐步将线性表变得有序。
5.D。【解析】对二叉树的前序遍历是指:先访问根结点,然后访问左子树,最后访问右子树,并且,在访问左、右子树时,先访问根结点,再依次访问其虚、右子树。记住三种遍历的顺序:①前序,访问根→按前序遍历左子树→按前序遍历右子树;②中序,按中序遍历左子树→访问根→按中序遍历右子树;③后序,按后序遍历左子树→按后序遍历右子树→访问根。
6.D。【解析】需求分析常用的工具有数据流图(DFD)、数据字典(DD)、判定树和判定表。PAD(问题分析图)、PFD(程序流程图)、N-S(盒式图)都是详细设计的常用工具,不是需求分析的工具。
7.B。【解析】对二叉树的前序遍历是指:先访问根结点,然后访问左子树,最后访问右子树。并且,在访问左、右子树时,先访问根结点,再依次访问其左、右子树。
8.A。【解析】白盒测试是把测试对象看成一个打开的盒子,允许测试人员利用程序内部的逻辑结构及相关信息来设计或选择测试用例,对程序所有的逻辑路径进行测试。所以,白盒测试的对象基本上是源程序,以程序的内部逻辑和指定的覆盖标准测试数据。
9.C。【解析】软件的生命周期可分为软件定义、软件开发及软件运行维护三个阶段。其中软件定义阶段的主要工作有可行性研究、计划制定和需求分析等;软件开发阶段的主要工作有概要设计、详细设计和测试等;软件运行维护阶段的主要工作是软件的运行及后期的维护等。
10.C。【解析】数据库系统(DBS)由数据库(DBS)、数据库管理系统(DBMS)、数据库管理员、硬件平台和软件平台五个部分组成,可见DB和DBMS都是DBS的组成部分。
11.D。【解析】C++中函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数。动态多态性是在程序运行过程中才动态确定操作所针对的对象。动态多态性是通过虚函数实现的。
12.A。【解析】本题考查混合运算表达式类型,由表达式中具有最高优先级的类型所确定,所以答案为A。
13.D。【解析】二维数组可以看做是一维数组的扩展。选项D表示的是一个一维数组,里面每个元素是一个指针,而指针肯定指向某个地址,从而完成二维数组的扩展。考生要了解*和[]的运算优先级。
14.C。【解析】在成员函数声明的前面加上virtual关键字即把该函数声明为虚函数。虚函数可以是另一个类的友元函数,但不是静态成员函数。在派生类中可以重新定义从基类继承下来的虚函数,在派生类中重新定义虚函数时,函数名、形参表和返回值类型必须保持不变。
15.A。【解析】本题考查运算符的重载。C++中,::、*…?:这4个运算符不能重载。
16.C。【解析】题中函数声明带有默认参数,那么在C选项的调用中,将会把字符型实参#赋值给整型形参b,这不符合参数传递规则。
17.C。【解析】由于取负运算符“-”是一元运算符,当作为成员函数重载时参数表中没有参数,那个唯一的操作数以this指针的形式隐藏在参数表中。
18.B。【解析】本题考查的是内联函数的定义,引入内联函数是为了解决程序中函数调用的效率问题,是以目标代码的增加为代价换取时间的节省;一般函数在运行时被调用,而调用的内联函数在编译时就被替代了,如果不加in-line关键字,则编译器会将在类说明部分定义的任何函数都被认定为内联函数。
19.C。【解析】所谓函数重载,是指同一个函数名可以对应多个函擞的实现,进行函数重载时,要求同名函数的参数个数不同,或者参数类型不同。
20.D。【解析】第一个字符必须是字母或下画线,中间不能有空格;在第一个字母后,可以是任意字母、下画线和数字组成的字符序列;标识符的长度是任意的,但特定的编译系统能够识别的标识符长度是有限的。一般不要超过31个字符;标识符中大小写字母是有区别的;用户定义标识符时,不要采用系统的保留字。
21.B。【解析】value作为类的数据成员在引用时可以通过对象来引用,也可以通过域操作符引入类名来限定。由于选项D中P是指针,它对指针变量的赋值方式是错误的。
22.C。【解析】本题考查友元函数的应用。程序中函数square是类sample的一个友元函数,它可以直接访问类sample的所有成员。它的功能是返回类sample的私有数据成员x的平方。所以程序的执行结果是900。
23.B。【解析】调用拷贝构造函数的情况为:一个新对象被另一个已存在的同类型对象初始化;当一个对象作为实参传递给函数时为初始化形参,要调用拷贝构造函数。在函数值返回时形参的生命期结束时它的析构函数被调用;在函数返回一个对象时调用拷贝构造函数。符合以上条件的有:用对象objl来初始化obj3;obj3作为实参被传入;函数fun返回一个对象时;系统用返回值初始化一个匿
名对象时调用了拷贝构造函数。总共调用4次。
24.A。【解析】由主函数main入手,定义外部变量x和y,调用函数add。因为x,y为外部变量,所以“intx(20),y(5);”的赋值在add也是有效的,即add函数的运算结果为25。
25.B。【解析】函数setfill(charc)用于设置填充字符,在输出数据时,如果数据宽度小于设置的宽度,则空闲位置要用填充字符填满,设置的填充符一直有效,直到再次填充字符为止,如题中调用函数setfill(’*’)将填充字符设置为’*’,后又调用函数setfill(’#’)将填充字符设置为’#’。函数setw(intn)用于设置输入/输出宽度.宽度设置的效果只对一次输入或输出有效,在完成一次数据的输出/输入后,宽度设置自动恢复为0,如题中语句以宽度10输出数据“123”后,字符串“OK”的输出宽度就自动恢复为0了。而且题中输出的对齐方式为在输出宽度内左对齐。本题结果为123######OK。
26.D。【解析】C++中,虚基类说明格式为class<类名>:virtual<继承方式><基类名>。其中,virtual是虚基类的关键词。在定义派生类时使用虚基类的说明,写在派生类名的后面。
27C。【解析】本题考查在继承中构造函数和析构函数的调用顺序,应该是先调用基类的构造函数,再调用派生类的构造函数,调用析构函数时的顺序是先调用派生类的析构函数,后调用基类的析构函数。
28.D。【解析】构造函数的主要作用是对数据成员初始化。构造函数不能声明为虚函数,这是因为在执行构造函数时类对象还未完成建立过程,当然谈不上函数与类对象的关联。
29.A。【解析】程序中的TestClassl为TestClass的派生类,主函数main中定义。TestClass对象*P,
TestClassl对象objl,然后P引用0bjl,执行p->who()则是调用基类中的who函数,输出TestClass。
30.A。【解析】本程序设计了一个点类Point,包含了横、纵两个坐标数据x和y,由它派生出了圆类Circle,并加入了新的数据成员,即一个半径r和一个求圆面积的函数成员area。在主函数main中,首先定义了一个圆Circle类的对象c1,并通过它的构造函数初始化其数据成员。由此可知,其半径r的值为10,所以其面积为PI*10*10=314,即对象c1的函数成员area的返回值为314。
31.D。【解析】本题考查指针的使用。在给*P赋值前,指针P并没有指向一个具体的对象。此时可以通过编译,但运行时由于P中为随机值,该赋值可能会破坏内存中某个重要的地址空间的内容,导致程序出错。
32.D。【解析】本题考查类的定义。C++语言规定,在类体内不允许对所定义的数据成员进行初始化。
33.B。【解析】本题考查的是对构造函数的掌握,另外++运算符是右结合的,所以在进行输出的时候都是先把原来的输出后再自加1。
34.C。【解析】C++中可以在定义文件流对象的同时打开文件,也可以在定义文件流对象以后用open函数打开文件。可以通过构造函数或open函数的第二个参数,确定文件的打开模式。
35.C。【解析】++是右结合的,所以先赋值为3,最后输出3+1;常成员函数只有常对象才能调用,所以输出2。
36.C。【解析】根据递归调用的含义,当n为2时有fib(o),fib(1),fib(2)被调用,且fib(0),fib(1)时调用结束,共3次。
37.D。【解析】选项A错误,不存在这样的定义方式;选项B定义了一个MyClass类的对象P;选项C是Java的定义方式。
38.C。【解析】本题针对虚基类的定义及特点考查。虚基类的声明为“class<类名>:virtual<继承方式><基类名>”,即本题的A为虚基类。
39.B。【解析】一元或二元运算符函数作为成员函数时,第一操作数就是对象本身,并不出现在参数表中,即第一操作数仅以this指针的形式隐含于参数表中,因此对于一元运算符参数表是空的;而对于二元运算符参数表中只有一个参数,它代表第二操作数。
40.D。【解析】模板形参有typename<参数名>、class<参数名>、<类型修饰><参数名>3种形式,即typename与class通用。
二、程序改错题
(1)应改为“assert(sizeof(s1)==4);”。
(2)应改为“assert(sizeof(s2)==1O);”。
(3)应改为“assert(sizeof(s3)==1);”。
【解析】assert函数如果为假,则会产生一个中断异常。所以要让它正常执行输出结果,那么assert函数只有为真,才不会产生中断异常。“assert(sizeof(s1)==3);”语句中“sizeof(s1)==3”为假,这会使程序产生异常,不能正常执行。因为str1的值为abc,但是它还有一个尾符,它的长度应该是4,而不是3,所以在第1处修改为“assert(sizeof(s1)==4);”。str2[10]说明,str2的空间为10,在第2处修改为“assert(sizeof(s2)==10);”。charstr3=23;语句说明23是字符,所占存储空间为1,所以修改为“assert(sizeof(s3)==1);”。
三、简单应用题
introw;
intmax;
intmin;
intcol;
for(row=0;row//外循环求行最大值中的最小值
{
for(max=a[row][0],col=1;col 每一行中的最大值
if(max max=a[row][col]:
if(row==0)//求最小值
min=max:
else
if(max min=max;
}
returnmin;
【解析】本题有两层循环,内层循环求每一行的最大值,外层循环求最小值。求最大值,首先将最大值赋值为每行第一列的元素,然后依次循环比较。将求出的第一个最大值赋值为第一个最小值,然后将以后求得的最大值依次与之比较,求出所有值的最小值。
四、综合应用题
(1)应添加“intNo;charName[32];”。
(2)应添加“voidSet(intno,char*strName)”。
(3)应添加“cout<<"No="<
全国计算机等级考试计算机基础及Photoshop应用试题答案汇总(6套)
[Photoshop应用]2017年2月3日全国计算机等级考试四级数据库系统工程师试题及答案汇总(22套)
[数据库工程师]2017年2月2日全国计算机一级考试模拟试题及答案300题
[WPS Office应用]2017年1月22日2017年3月全国计算机等级考试报名时间及报名入口汇总
[考试动态]2017年1月3日2017全国计算机等级考试考试大纲专题
[政策大纲]2017年1月3日