计算机二级复习.docx
《计算机二级复习.docx》由会员分享,可在线阅读,更多相关《计算机二级复习.docx(36页珍藏版)》请在冰豆网上搜索。
计算机二级复习
计算机二级复习
程序流程图中带有箭头的线段表示的是( )。
A)图元关系
B)数据流
C)控制流
D)调用关系
参考答案:
C
【解析】在数据流图中,用标有名字的箭头表示数据流。
在程序流程图中,用标有名字的箭头表示控制流。
所以选择C)。
结构化程序设计的基本原则不包括( )。
A)多态性
B)自顶向下
C)模块化
D)逐步求精
参考答案:
A
【解析】结构化程序设计的思想包括:
自顶向下、逐步求精、模块化、限制使用goto语句,所以选择A)。
在软件开发中,需求分析阶段产生的主要文档是( )。
A)可行性分析报告
B)软件需求规格说明书
C)概要设计说明书
D)集成测试计划
参考答案:
B
【解析】A)错误,可行性分析阶段产生可行性分析报告。
C)错误,概要设计说明书是总体设计阶段产生的文档。
D)错误,集成测试计划是在概要设计阶段编写的文档。
B)正确,需求规格说明书是后续工作如设计、编码等需要的重要参考文档。
算法的有穷性是指( )。
A)算法程序的运行时间是有限的
B)算法程序所处理的数据量是有限的
C)算法程序的长度是有限的
D)算法只能被有限的用户使用
参考答案:
A
【解析】算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
有穷性是指算法程序的运行时间是有限的。
对长度为n的线性表排序,在最坏情况下,比较次数不是n(n-1)/2的排序方法是( )。
A)快速排序
B)冒泡排序
C)直接插入排序
D)堆排序
参考答案:
D
【解析】除了堆排序算法的比较次数是
,其他的都是n(n-1)/2。
在数据库设计中,将E-R图转换成关系数据模型的过程属于( )。
A)需求分析阶段
B)概念设计阶段
C)逻辑设计阶段
D)物理设计阶段
参考答案:
C
【解析】E-R图转换成关系模型数据则是把图形分析出来的联系反映到数据库中,即设计出表,所以属于辑设计阶段。
有三个关系R、S和T如下:
由关系R和S通过运算得到关系T,则所使用的运算为( )。
A)并
B)自然连接
C)笛卡尔积
D)交
参考答案:
D
【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以B)错误。
笛卡尔积是用R集合中元素为第一元素,S集合中元素为第二元素构成的有序对,所以C)错误。
根据关系T可以很明显的看出是从关系R与关系S中取得相同的关系组所以取得是交运算,选择D)。
设有表示学生选课的三张表,学生S(学号,姓名,性别,年龄,身份证号),课程C(课号,课名),选课SC(学号,课号,成绩),则表SC的关键字(键或码)为( )。
A)课号,成绩
B)学号,成绩
C)学号,课号
D)学号,姓名,成绩
参考答案:
C
【解析】学号是学生表S的主键,课号是课程表C的主键,所以选课表SC的关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号,所以选择C)。
有如下程序:
#include
usingnamespacestd;
intmain()
{
int*p;
*p=9;
cout<<"Thevalueatp:
"<<*p;
return0;
}
编译运行程序将出现的情况是()。
A)编译时出现语法错误,不能生成可执行文件
B)运行时一定输出:
Thevalueatp:
9
C)运行时一定输出:
Thevalueatp:
*9
D)运行时有可能出错
参考答案:
D
【解析】先定义指针变量,然后给指针变量赋初值有三种情况:
①用取地址运算符"&"将变量地址赋给指针变量,如p=&a;②将一个指针变量中的地址赋给另一个指针变量,如p=p1;③给指针变量赋空值0,如q=0,表示该指针变量不指向任何变量。
而不能用一个常量给指针变量赋初值,所以本题选D。
if语句的语法格式可描述为:
格式1:
if(<条件>)<语句>
或
格式2:
if(<条件>)<语句1>
else<语句2>
关于上面的语法格式,下列表述中错误的是()。
A)<条件>部分可以是一个if语句,例如if(if(a==0)…)…
B)<语句>部分可以是一个if语句,例如if(…)if(…)…
C)如果在<条件>前加上逻辑非运算符!
并交换<语句1>和<语句2>的位置,语句功能不变
D)<语句>部分可以是一个循环语句,例如if(…)while(…)…
参考答案:
A
【解析】本题考查if语句,if语句的条件部分不能嵌套if语句,所以A选项错误;B选项就是if语句嵌套;C选项其实就是将判断条件颠倒,然后执行语句也颠倒,所以效果一样;D选项也正确。
下列关于C++函数的说明中,正确的是()。
A)内联函数就是定义在另一个函数体内部的函数
B)函数体的最后一条语句必须是return语句
C)标准C++要求在调用一个函数之前,必须先声明其原型
D)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式
参考答案:
D
【解析】一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,而不是在定义在另一个函数体内,所以A选项错误。
函数可以没有返回值,所以就不需要return了,如果被调函数在调用函数之前已经定义,那么就不需要声明,所以C选项错误,正确选项为D。
下列有关内联函数的叙述中,正确的是()。
A)内联函数在调用时发生控制转移
B)内联函数必须通过关键字inline来定义
C)内联函数是通过编译器来实现的
D)内联函数函数体的最后一条语句必须是return语句
参考答案:
C
【解析】一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,所以在调用时不发生控制转移。
在类内部实现的函数都是内联函数,可以不用inline定义;只有函数外部定义的内联函数才必须加关键字inline。
编译系统并非对内联函数必须使用内联,而且根据具体情况决定。
内联函数不是必须要有返回值的。
下列运算符不能重载为友元函数的是()。
A)=()()->
B)+-++--
C)><>=<=
D)+=-=*=/=
参考答案:
A
【解析】关于运算符重载为友元函数有如下规定:
①一般情况下,单目运算符最好重载为类的成员函数,双目运算符则最好重载为类的友元函数;②双目运算符"=、()、[]、->"不能重载为类的友元函数。
所以本题答案为A。
有如下程序:
#include
usingnamespacestd;
intmain()
{
voidfunction(doubleval);
doubleval;
function(val);
cout<return0;
}
voidfunction(doubleval)
{
val=3;
}
编译运行这个程序将出现的情况是()。
A)编译出错,无法运行
B)输出:
3
C)输出:
3.0
D)输出一个不确定的数
参考答案:
D
【解析】本题考查函数调用及传值方式传递参数,执行函数function时,并没有将3的值传回来,而val又没有初始化,所以会输出一个不确定的值,D选项正确。
使用delete语句删除一个指针时,直接把指针变量的名称放在delete[]后面即可
MyClassobj(10);
操作符的重载
由于常对象不能被更新,因此()。
A)通过常对象只能调用它的常成员函数
B)通过常对象只能调用静态成员函数
C)常对象的成员都是常成员
D)通过常对象可以调用任何不改变对象值的成员函数
参考答案:
A
【解析】本题考查常对象的基本知识,常对象只能调用它的常成员函数,而不能调用非const函数,常对象的成员函数不一定都是常成员函数,只需保证其数据成员是常数据成员即可。
所以本题选A。
下列关于this指针的描述中,正确的是()。
A)类的成员函数都有this指针
B)类的友元函数都有this指针
C)任何与类相关的函数都有this指针
D)类的非静态成员函数都有this指针
参考答案:
D
【解析】this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员时,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。
另外,全局函数和静态函数都不能使用this指针。
所以答案为D。
有如下程序:
#include
usingnamespacestd;
classA
{
public:
A(){cout<<"A";}
~A(){cout<<"~A";}
};
classB:
publicA
{
A*p;
public:
B(){cout<<"B";p=newA();}
~B(){cout<<"~B";deletep;}
};
intmain()
{
Bobj;
return0;
}
执行这个程序的输出结果是()。
A)BAA~A~B~A
B)ABA~B~A~A
C)BAA~B~A~A
D)ABA~A~B~A
参考答案:
B
【解析】本题考查派生类的构造函数和析构函数,在定义一个派生类的对象时,先调用基类的构造函数,然后再执行派生类的构造函数。
对象释放时,先执行派生类的析构函数,再执行基类的析构函数。
所以本题答案为B。
有如下函数模板:
template
Tcast(Uu){returnu;}
其功能是将U类型数据转换为T类型数据。
已知i为int型变量,下列对模板函数cast的调用中正确的是()。
A)cast(i);
B)cast<>(i);
C)cast(i);
D)cast(i);
参考答案:
D
【解析】本题考查函数模板的基本运用,属于基础知识。
函数模板实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型代表,这个通用函数就是函数模板。
函数模板可以设定默认参数,这样在调用模板函数时就可以省略实参,函数模板的实例就是一个函数的定义。
所以本题答案为D。
当使用ifstream流类定义一个流对象并打开一个磁盘文件时,文件的默认打开方式为()。
A)ios_base:
:
in
B)ios_base:
:
in|ios_base:
:
out
C)ios_base:
:
out
D)ios_base:
:
in&ios_base:
:
out
参考答案:
A
【解析】本题考查对文件输入流的操作,ifstream流类为输入流类,默认的文件输入流打开方式为ios:
:
in。
故答案为A。
构造函数前不加void或其它任何类型名,直接使用MyClass(inti)即可
主要考查delete语句释放指针,一般格式为:
delete[]+指针。
在长度为n的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。
A)O(n)
B)O(n2)
C)
D)
参考答案:
C
【解析】当有序线性表为顺序存储时才能用二分法查找。
可以证明的是对于长度为n的有序线性表,在最坏情况下,二分法查找只需要比较
次,而顺序查找需要比较n次。
下列叙述中正确的是( )。
A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的
B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构
C)顺序存储结构能存储有序表,链式存储结构不能存储有序表
D)链式存储结构比顺序存储结构节省存储空间
参考答案:
A
【解析】链式存储结构既可以针对线性结构也可以针对非线性结构,所以B)与C)错误。
链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以D)错误。
在软件开发中,需求分析阶段可以使用的工具是( )。
A)N-S图
B)DFD图
C)PAD图
D)程序流程图
参考答案:
B
【解析】在需求分析阶段可以使用的工具有数据流图DFD图,数据字典DD,判定树与判定表,所以选择B)。
在面向对象方法中,不属于"对象"基本特点的是( )。
A)一致性
B)分类性
C)多态性
D)标识唯一性
参考答案:
A
【解析】对象有如下一些基本特点:
标识唯一性、分类性、多态性、封装性、模块独立性好。
所以选择A)。
下列语句中,错误的是()。
A)constintbuffer=256;
B)constdouble*point;
C)intconstbuffer=256;
D)double*constpoint;
参考答案:
D
【解析】const是一个C++关键字,用于限定不允许改变的变量。
选项B是指向常量的指针,定义时可以不初始化;选项D是指针常量,定义时必须初始化。
故答案为D。
有如下程序段:
inti=0,j=1;
int&r=i;//①
r=j;//②
int*p=&i;//③
*p=&r;//④
其中会产生编译错误的语句是()。
A)④
B)③
C)②
D)①
参考答案:
A
【解析】本题考查指针和引用。
①为引用,使用正确;④中&r表示一个地址,而*p已经是一个值了,不能将一个指针赋值给一个值,所以编译错误。
通过运算符重载,可以改变运算符原有的()。
A)操作数类型
B)操作数个数
C)优先级
D)结合性
参考答案:
A
【解析】重载运算符的规则如下:
①C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载;②C++不能重载的运算符只有5个;③重载不能改变运算符运算对象的个数;④重载不能改变运算符的优先级和结合性;⑤重载运算符的函数不能有默认的参数;⑥重载的运算符必须和用户定义的自定义类型的对象一起使用,至少应有一个是类对象,即不允许参数全部是C++的标准类型。
故本题答案为A。
下列情况中,不会调用拷贝构造函数的是()。
A)用一个对象去初始化同一类的另一个新对象时
B)将类的一个对象赋值给该类的另一个对象时
C)函数的形参是类的对象,调用函数进行形参和实参结合时
D)函数的返回值是类的对象,函数执行返回调用时
参考答案:
B
【解析】本题考查复制构造函数,在以下3种情况下使用:
①程序中需要新建立一个对象,并用另一个对象对它初始化;②函数的参数为类的对象;③函数的返回值是类的对象。
其中B选项是由赋值运算符重载实现的。
所以基类对象不能赋值给派生类对象。
抽象类是指含有纯虚拟函数的类。
在公有继承的情况下,允许派生类直接访问的基类成员包括()。
A)公有成员
B)公有成员和保护成员
C)公有成员、保护成员和私有成员
D)保护成员
参考答案:
B
【解析】本题考查公用继承对基类成员的访问属性。
在公用继承中,基类的公用成员和保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有。
所以本题答案为B。
有如下程序:
#include
usingnamespacestd;
classBase{
public:
voidfun(){cout<<"Base:
:
fun"<};
classDerived:
publicBase{
public:
voidfun(){
cout<<"Derived:
:
fun"<}
};
intmain(){
Derivedd;
d.fun();
return0;
}
已知其执行后的输出结果为:
Base:
:
fun
Derived:
:
fun
则程序中下画线处应填入的语句是()。
A)Base.fun();
B)Base:
:
fun();
C)Base->fun();
D)fun();
参考答案:
B
【解析】本题考查公用继承对基类成员的访问属性。
在公用继承中,基类的公用成员和保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有。
本题中想要输出Base:
:
fun,则必须调用基类的公用成员函数fun,所以使用Base:
:
fun();来调用基类的成员函数fun。
有如下程序:
#include
usingnamespacestd;
classInstrument{
public:
virtualvoidDisplay()=0;
};
classPiano:
publicInstrument{
public:
voidDisplay(){/*函数体略*/}
};
intmain(){
Instruments;
Instrument*p=0;
//…;
return0;
}
下列叙述中正确的是()。
A)语句"Insturment*p=0;"编译时出错
B)语句"Instruments;"编译时出错
C)类Piano中的Display函数不是虚函数
D)类Instrument是一个虚基类
参考答案:
B
【解析】本题考查纯虚函数和抽象类,纯虚函数是在声明虚函数时被"初始化"为0的函数,包含纯虚函数的类为抽象类,抽象类不能被实例化,所以语句"Instruments;"在编译时出错。
有如下程序:
#include
usingnamespacestd;
classA{
public:
virtualvoidfunc1(){cout<<"A1";}
voidfunc2(){cout<<"A2";}
};
classB:
publicA{
public:
voidfunc1(){cout<<"B1";}
voidfunc2(){cout<<"B2";}
};
intmain(){
A*p=newB;
p->func1();
p->func2();
deletep;
return0;
}
执行这个程序的输出结果是()。
A)B1B2
B)A1A2
C)B1A2
D)A1B2
参考答案:
C
【解析】本题考查虚函数。
虚函数指在基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。
题中定义了一个派生类对象B,并使用类A的对象指针指向B,由于基类A中的func1为虚函数,所以会执行派生类的func1,输出B1,而基类中的func2不是虚函数,所以p->func2()会执行基类的func2,输出A2。
故答案为C。
关于关键字class和typename,下列表述中正确的是()。
A)程序中的typename都可以替换为class
B)程序中的class都可以替换为typename
C)在模板形参表中只能用typename来声明参数的类型
D)在模板形参表中只能用class或typename来声明参数的类型
参考答案:
A
【解析】程序中的typename都可以替换为class,但程序中的class不可以全部替换为typename。
在模板类型形参中除了typename和class以外,也可以用常规类型来声明参数的类型,所以C、D选项错误。
下列关于C++流的描述中,错误的是()。
A)cout>>′A′表达式可输出字符A
B)eof()函数可以检测是否到达文件尾
C)对磁盘文件进行流操作时,必须包含头文件fstream
D)以ios_base:
:
out模式打开的文件不存在时,将自动建立一个新文件
参考答案:
A
【解析】本题考查C++流,想要输出字符"A",则应该是cout<<"A",所以本题答案为A。
模板对类型的参数化提供了很好的支持,因此()。
A)类模板的主要作用是生成抽象类
B)类模板实例化时,编译器将根据给出的模板实参生成一个类
C)在类模板中的数据成员都具有同样类型
D)类模板中的成员函数都没有返回值
参考答案:
B
【解析】本题考查类模板的基本概念。
类模板的定义和声明都以关键字template开头。
关键字后面是一个用逗号分隔的模板参数表,用尖括号"<>"括起来,这个表被称为类模板的模板参数表。
类模板是类的抽象,类是类模板的实例。
类模板使类中的一些数据成员和成员函数的参数或返回值可以取任意的数据类型。
所以B选项正确。
有如下程序:
#include
usingnamespacestd;
classBase1
{
public:
Base1(intd){cout<~Base1(){}
};
classBase2
{
public:
Base2(intd){cout<~Base2(){}
};
classDerived:
publicBase1,Base2
{
public:
Derived(inta,intb,intc,intd):
Base1(b),Base2(a),b1(d),b2(c){}
private:
intb1;
intb2;
};
intmain()
{
Derivedd(1,2,3,4);
return0;
}
执行这个程序的输出结果是()。
A)1234
B)2134
C)12
D)21
参考答案:
D
【解析】本题考查派生类的构造函数和析构函数,在定义一个派生类的对象时,先调用基类的构造函数,然后再执行派生类的构造函数,对象释放时,先执行派生类的析构函数,再执行基类的析构函数。
本题中定义一个派生类对象时,分别调用基类的构造函数,所以分别输出21。
有如下程序:
#include
usingnamespacestd;
classBase
{
private:
voidfun1()const{cout<<"fun1";}
protected:
voidfun2()const{cout<<"fun2";}
public:
voidfun3()const{cout<<"fun3";}
};
classDerived:
protectedBase
{
public:
voidfun4()const{cout<<"fun4";}
};
intmain()
{
Derivedobj;
obj.fun1();//①
obj.fun2();//②
obj.fun3();//③
obj.fun4();//④
return0;
}
其中有语法错误的语句是()。
A)①②③④
B)①②③
C)②③④
D)①④
参考答案:
B
【解析】本题考查保护继承中派生类对基