历年全国计算机二级C++考试真题及答案
2006年9月考试真题(第24次)
1.从工程管理角度,软件设计一般分为两步完成,它们是______。
A、概要设计与详细设计
B、过程控制
C、软件结构设计与数据设计
D、程序设计与数据设计
从工程管理角度看,软件设计分为两步完成:概要设计与详细设计。概要设计(又称结构设计)将软件需求转化为软件体系结构、确定系统级接口、全局数据结构或数据库模式;详细设计确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。故本题答案为A。
2.数据库技术的根本目标是解决数据的______。
A、存储问题
B、共享问题
C、安全问题
D、保护问题
由于数据的集成性使得数据可为多个应用所共享,特别是在网络发达的今天,数据库与网络的结合扩大了数据关系的应用范围。数据的共享本身又可极大地减少数据冗余性,不仅减少了不必要的存储空间,更为重要的是可以避免数据的不一致性。因此,数据库设计的根本目标是要解决数据共享问题。
故本题答案为B。
3.在数据库系统中,用户所见数据模式为______。
A、概念模式
B、外模式
C、内模式
D、物理模式
数据库管理系统的三级模式结构由外模式、模式和内模式组成。外模式又称为子模式,或用户模式,是指数据库用户所看到的数据结构,是用户看到的数据视图。模式又称为逻辑模式,是数据库中对全体数据的逻辑结构和特性的描述,是所有用户所见到的数据视图的总和。外模式是模式的一部分。内模式又称为存储模式或物理模式,是指数据在数据库系统内的存储介质上的表示,即对数据的物理结构和存取方式的描述。故本题答案为B。
4.在长度为64的有序线性表中进行顺序查,最坏情况下需要比较的次数为______。
软件测试appA、63
B、64
C、6
D、7
在进行顺序查过程中,如果线性表中的第1个元素就是被查元素,则只需做一次比较就查成功,查效率最高;但如果被查的元素是线性表中的最后一个元素,或者被查的元素根本就不在线性表中,则为了查这个元素需要与线性表中所有的元素进行比较,这是顺序查的最坏情况。所以对长度为n的线性表进行顺序查,在最坏情况下需要比较n次。故本题答案为B。
5.对下列二叉树
进行中序遍历的结果是______。
A、ACBDFEG
B、ACBDFGE
C、ABDCGEF
D、FCADBEG
二叉树的中序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。
故本题答案为A。
6.下列选项中不属于软件生命周期开发阶段任务的是______。
A、软件测试
B、概要设计
C、软件维护
D、详细设计
软件生命周期分为软件定义、软件开发及软件维护。其中软件开发阶段的任务中软件设计阶段可分解成概要设计阶
段和详细设计阶段;软件维护不属于软件开发阶段。 故本题答案为C 。
7. 下列叙述中正确的是______。
A 、一个算法的空间复杂度大,则其时间复杂度也必定大
B 、一个算法的空间复杂度大,则其时间复杂度必定小
C 、一个算法的时间复杂度大,则其空间复杂度必定小
D 、上述三种说法都不对
算法的复杂度主要包括时间复杂度和空间复杂度:算法在运行过程中需辅助存储空间的大小称为算法的空间复杂度;
算法的时间复杂度是指执行算法所需要的计算工作量,即算法执行过程中所需要的基本运算次数,为了能够比较客观地反映出一个算法的效率,在度量一个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。 故本题答案为D 。
8. 下列选项中不符合良好程序设计风格的是______。
A 、源程序要文档化
B 、数据说明的次序要规范化
C 、避免滥用goto 语句
D 、模块设计要保证高耦合、高内聚
良好的程序设计风格可以使程序结构清晰合理,使程序代码便于维护,因此,程序设计风格对保证程序的质量很重
要。主要应注意和考虑下述一些因素:1、源程序要文档化;2、数据说明的次序要规范化;3、语句的结构应该简单直接,不应该为提高效率而把语句复杂化,避免滥用goto 语句。模块设计要保证低耦合、高内聚。 故本题答案为D 。
9. 设有如下三个关系表
R S T
下列操作中正确的是______。A 、T=R ∩S B 、R ∪S C 、 D 、T=R ∕S
从图中可以看出,关系T 是关系R 和关系S 的简单扩充,而扩充的符号为×,所以答案为
。 故本题答案为C 。
10. 数据库设计的四个阶段是:需求分析、概念设计、逻辑设计和______。
A 、编码设计
B 、测试阶段
C 、运行阶段
D 、物理设计
数据库设计分为以下6个设计阶段:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段、实施阶段及数据
库运行和维护阶段。 故本题答案为D 。
11. 下列运算符不能重载为友元函数的是______。
A 、= () [] ->
B 、+ - ++ --
C 、> < >= <=
D 、+= -= *= /=
本题考查的是运算符的重载。
在C++中,可以通过两种方式对运算符进行重载。一种是类成员函数的方式、一种是友元函数的方式。= () [] ->以及所有的类型转换运算符只能作为成员函数重载,不能重载为友元函数。 故本题答
案为A 。
12. 语句ofstream f("SALARY.DAT ",ios_base::app);的功能是建立流对象f ,并试图打开文件SALARY.DAT 与f 关联,而且______。
A 、若文件存在,将其置为空文件;若文件不存在,打开失败
B 、若文件存在,将文件指针定位于文件尾;若文件不存在,建立一个新文件
C 、若文件存在,将文件指针定位于文件首;若文件不存在,打开失败
D 、若文件存在,打开失败;若文件不存在,建立一个新文件
本题考查的是文件流的输出。
ofstream f("SALARY.DAT",ios_base::app);
是以ios_base::app 方式打开文件,若文件存在,将文件指针定位于文件尾;若文件不存在,建立一个新文件。 故本题答案为B 。
13. 有如下程序
#include<iostream> using namespace std;
class A{ public: virtual void func1(){cout<<"Al ";} void func2(){cout<<"A2";}
};
A
m
n B C 13A B C m 13n 13
class B:public A{ public: void func1(){cout<<"B1";} void func2(){cout<<"B2";}
};
int main(){ A*p=new B; p->func1(); p->func2(); return 0;}
运行此程序,屏幕上将显示输出______。
A、B1B2
B、A1A2
C、B1A2
D、A1B2
本题考查的是派生类。
派生类B由基类A公有继承而来。调用p->func1();后,执行派生类B的函数void func1();调用p->func2();后,执行基类的函数void func2(),因为虚拟函数是根据对象的实际类型调用,非虚拟函数是根据指针类型调用。故通过指针p调用func2时将直接调用基类中的void func2()。故本题答案为C。
14. if语句的语法格式可描述为:
格式1:if(<;条件>)<;语句>
或格式2:if(<;条件>)<;语句1>else<;语句2>
关于上面的语法格式,下列表述中错误的是______。
A、<;条件>部分可以是一个if语句,例如if(if(a==0) …) …
B、<;语句>部分可以是一个if语句,例如if(…) if(…) …
C、如果在<;条件>前加上逻辑非运算符!并交换<;语句1>和<;语句2>的位置,语句功能不变
D、<;语句>部分可以是一个循环语句,例如if(…)while(…) …
本题考查的是if语句。
if为关键字,<;条件>通常是一个表达式;if子句和else子句可以是任何类型的语句,当然也可以是if…else语句本身和while语句。
if…else语句的基本执行过程是:首先计算<;条件>的值,如果此值不为0("真"),则执行<;语句1>,然后忽略<;语句2>,而去执行if语句之后的下一条语句;如果此值为0("假"),则执行<;语句2>,然后忽略<;语句1>,然后继续执行if语句之后的下一条语句。故本题答案为A。
15.下列语句中,错误的是______。
A、const int buffer=256;
B、const double *point;
C、int const buffer=256;
D、double *const point;
本题考查的是符号常量定义。
const int buffer=256; //声明常量buffer
const double *point; //声明常量指针*point,*point不可变,但point的值可以改变
int const buffer=256; //声明常量buffer
double *const point; //声明的point是常量,*point可变,但point的值不可以改变,point不是外部的,必须在声明初始化常量对象。可改为:
double aa = 123.45;
double *const point = &aa;
故本题答案为D。
16.关于运算符重载,下列表述中正确的是______。
A、C++已有的任何运算符都可以重载
B、运算符函数的返回类型不能声明为基本数据类型
C、在类型转换符函数的定义中不需要声明返回类型
D、可以通过运算符重载来创建C++中原来没有的运算符
本题考查的是运算符重载。
运算符重载是针对C++中原有的运算符进行的,不可能通过重载创造出新的运算符,故选项D错误。除了.、.*、->*、::、?:这5个运算符外,其它运算符都可以重载,故选项A错误。运算符函数的返回类型可以声明为基本数据类型,故选项B错误。在重载类型转换符时,由于运算符本身已经表示出返回值类型,因此不需要返回值类型的声明。故本题答案为C。
17.关于在调用模板函数时模板实参的使用,下列叙述正确的是______。
A、对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略
B、对于虚拟类型参数所对应的模板实参,如果他们是参数表中的最后的若干参数,则都可以省略
C、对于虚拟类型参数所对应的模板实参,若能够省略则必须省略
D、对于常规参数所对应的模板实参,任何情况下都不能省略
本题考查的是函数模板中模板实参的省略。
对于虚拟类型参数所对应的模板实参,如果从模板函数的实参表中获得的信息已经能够判定其中部分或全部虚拟类型参数,而且它们又正好是参数表中最后的若干参数,则模板实参表中的那几个参数可以省略。反之,对于某个模板实参,如果从模板函数的实参表中无法获得相同的信息,就不能省略;或者虽然能够获得同样的信息,但在它后面还有不能省略的实参,则其自身还是不能省略,故选项A和B错误。对于虚拟类型参数所对应的模板实参,若能够省略可以省略,也可以不省略,故选项C错误。常规参数的信息无法从模板函数的实参表中获得,因此在调用时必须显式的说明。故本题答案为D。
18.若有下面的函数调用:
fun(a+b,3,max(n-1,b))
则fun的实参个数是______。 A、3 B、4 C、5 D、6
本题考查的是函数的调用。
在C++中,<;形参列表>是由逗号分开的,分别说明函数的各个参数。在fun()函数中它包括3个形参,a+b,3和max(n-1,b);当调用一个函数时,实参与形参一对一地匹配,所以实参个数也是3个。故本题答案为A。
19.下列有关内联函数的叙述中,正确的是______。
A、内联函数在调用时发生控制转移
B、内联函数必须通过关键字inline来定义
C、内联函数是通过编译器来实现的
D、内联函数函数体的最后一条语句必须是return语句
本题考查的是内联函数。
在C++中使用inline关键字来定义内联函数。inline关键字放在函数定义中函数类型之前。不过编译器会将在类的说明部分定义的任何函数都认定为内联函数,即使它们没有inline说明。一个内联函数可以有,也可以没有return语句。内联函数在程序执行时并不产生实际函数调用,而是在函数调用处将函数代码展开执行。内联函数是通过编译器来实现的。故本题答案为C。
20.在公有继承的情况下,允许派生类直接访问的基类成员包括______。
A、公有成员
B、公有成员和保护成员
C、公有成员、保护成员和私有成员
D、保护成员
本题考查的是派生类。
派生类中的成员不能访问基类中的私有成员,可以访问基类中的公有成员和保护成员。此时派生类对基类中各成员的访问能力与继承方式无关,但继承方式将影响基类成员在派生类中的访问控制属性。
故本题答案为B。
21.有如下程序:
#include<iostream> using namespace std;
class Obj{ static int i;
public: Obj(){i++;} ~Obj(){i--;}
static int getVal(){return i;}
};
int Obj::i=0;
void f(){Obj ob2;cout<&Val();}
int main(){ Obj obl; f();
Obj*ob3=new Obj;cout<<ob3->getVal();
delete ob3;cout<<Obj::getVal();
return 0;
}
程序的输出结果是______。 A、232 B、231 C、222 D、221
本题主要考查了C++中类的静态成员。
由于i是类Obj的静态成员,该成员被类的所有实例共享。当定义ob1时,系统自动调用构造函数Obj(),i的值将加1;调用函数f()时,在定义ob2时系统会自动调用构造函数Obj(),i的值将再加1;调用Val();后,将i的值输出,输出值为2;当调用函数f()即将结束时,系统自动调用析构函数~Obj(),i的值将减1;当定义ob3时,系统自动调用构造函
数Obj(),i的值将加1,调用cout<<ob3->getVal();后,将i的值输出,输出值为2;调用delete ob3后将执行Obj的析构函数~Obj(),执行后,i的值将减1,Obj::getVal()为类的一个静态成员函数,其作用是返回私有静态成员变量i的值1。
故本题答案为D。
22.下列有关继承和派生的叙述中,正确的是______。
A、如果一个派生类私有继承其基类,则该派生类中的成员不能访问基类的保护成员
B、派生类的成员函数可以访问基类的所有成员
C、基类对象可以赋值给派生类对象
D、如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类
本题考查的是拷贝构造函数。
拷贝构造函数通常在以下3种情况下会被调用:
(1)用类的一个已知的对象去初始化该类的另一个正在创建的对象。
(2)采用传值调用方式时,对象作为函数实参传递给函数形参。
(3)对象作为函数返回值。故本题答案为B。
23.下列情况中,不会调用拷贝构造函数的是______。
A、用一个对象去初始化同一类的另一个新对象时
B、将类的一个对象赋值给该类的另一个对象时
C、函数的形参是类的对象,调用函数进行形参和实参结合时
D、函数的返回值是类的对象,函数执行返回调用时
本题考查的是拷贝构造函数。
拷贝构造函数通常在以下3种情况下会被调用:
(1)用类的一个已知的对象去初始化该类的另一个正在创建的对象。
(2)采用传值调用方式时,对象作为函数实参传递给函数形参。
(3)对象作为函数返回值。
故本题答案为B。
24.有如下程序
#include<iostream> #include<iomanip> using namespace std;
int main(){ cout<<setprecision(3)<<fixed<<setfill('*')<<setw(8);
cout<<12.345<<______<<34.567; return 0;
}
若程序的输出是: **12.345**34.567
则程序中下划线处遗漏的操作符是______。
A、setprecision
B、fixed
C、setfill('*')
D、setw(8)
本题考查的是输入输出宽度的控制和输出精度的控制。
setw(int n);设置输入输出的宽度。
setprecision(int n);设置浮点数的精度(有效位数或小数位数)。
setfill(char c);设置填充字符。
由程序可以看出,本题设置小数的输出宽度为8,小数位数为3。输出数据时,如果数据宽度小于8,则空闲的位置用*填充。故本题答案为D。
25.有如下的运算符重载函数定义:
double operator +(int i,int k){return double(i+k);}
但定义有错误,对这个错误最准确的描述是______。
A、+只能作为成员函数重载,而这里的+是作为非成员函数重载的
B、两个int型参数的和也应该是int型,而这里将+的返回类型声明为double
C、没有将运算符重载函数声明为某个类的友元
D、C++已经提供了求两个int型数据之和的运算符+,不能再定义同样的运算符
本题考查的是运算符的重载。
在C++中可以对用户自定义类的运算符进行重载,但不能诸如int,char,double等内置类型运算符进行重载。故本题答案为D。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论