1、国家二级( C+)笔试模拟试卷 68及答案与解析 1 下列各项中不属于算法基本特征的是 ( )。 ( A)可行性 ( B)递归性 ( C)确定性 ( D)有穷性 2 下列各项特点中,属于线性表的顺序存储结构的是 ( )。 ( A)线性表中所有元素所占的存储空间是不连续的 ( B)线性表的数据元素在存储空间中是随便存放的 ( C)线性表中所有元素所占的存储空间是连续的 ( D)前后件两个元素在存储空间是随便存放的 3 下列关于栈的叙述中,不正确的是 ( )。 ( A)在栈中能插入数据 ( B)在栈中能删除数据 ( C)栈是先进先出的线性表 ( D)栈是先进后出的线性表 4 下列关于链式存储的叙述
2、中,正确的是 ( )。 ( A)链式存储结构的空间不可以是不连续的 ( B)数据节点的存储顺序与数据元素之间的逻辑关系必须一致 ( C)链式存储方式只可用于线性结构 ( D)链式存储也可用于非线性结构 5 对于输入输出,在设计和编程时都应该考虑的原则是 ( )。 ( A)对部分输入数据检验数据的合法性 ( B)不允许默认值 ( C)输入一批数据时,最好使用输入结束标志 ( D)输入数 据时,不允许使用自由格式 6 下面内容不属于使用软件危机的是 ( )。 ( A)软件质量难以保证 ( B)软件的成本不断提高 ( C)软件需求增长缓慢 ( D)软件不可维护或维护程度非常低 7 数据字典 (DD)
3、 是定义以下哪种系统描述工具中的数据的工具 ( )。 ( A)数据流程图 ( B)系统流程图 ( C)程序流程图 ( D)软件结构图 8 一个关系数据库文件中的各条记录 ( )。 ( A)前后顺序不能任意颠倒,一定要按照输入的顺序排列 ( B)前后顺序可以任意颠倒,不影响库中数 据的数据关系 ( C)前后顺序可以任意颠倒,但排列顷序不同,统计处理的结果就可能不同 ( D)前后顺序不能任意颠倒,一定要按照关键词段值的顺序排列 9 对待排序文件的初始状态不作任何要求的排序方法有 ( )。 ( A)直接插入和快速排序 ( B)直接插入和归并排序 ( C)归并和快速排序 ( D)归并和直接选择排序 1
4、0 概要设计是软件系统结构的总体设计,以下选项中不属于概要设计的是 ( )。 ( A)把软件划分成模块 ( B)确定模块之间的调用关系 ( C)确定各个模块的功能 ( D)设 计每个模块的伪代码 11 C+源程序文件的扩展名为 ( )。 ( A) .CPP ( B) .C ( C) .DLL ( D) .EXE 12 知大写字母 A的 ASCII码是 65,小写 a的; ASCII码值是 97,则用八进制表示字符常量 101为 ( )。 ( A)字符 A ( B)字符 a ( C)字符 e ( D)非法常量 13 下列关于 C+运算符结合性的说法中,错误的是 ( )。 ( A)赋值运算符是右结
5、合性的 ( B)复合运算符是右结合的 ( C)单目运算符是左结合的 ( D)双目算术 运算符是左结合的 14 以下程序段的输出结果是 ( )。 int x=5; do cout x- end1; while(!x); ( A) 5 ( B)无任何输出 ( C) 4 ( D)陷入死循环 15 执行下面的程序段后,变量 k的值为 ( )。 int k=3, s2; s0=k; k=s1*10; ( A)不定值 ( B) 33 ( C) 30 ( D) 10 16 下面有关重载函数的说明中,正确的是 ( )。 ( A) 重载函数必须具有不同的返回值类型 ( B)重载函数形参个数必须不同 ( C)重载
6、函数必须具有不同的形参列表 ( D)重载函数名可以不同 17 对于常成员函数,下面描述正确的是 ( )。 ( A)常成员函数只能修改常数据成员 ( B)常成员函数只能修改一般数据成员 ( C)常成员函数不能修改任何数据成员 ( D)常成员函数只能通过常对象调用 18 下列虚基类的声明中,正确的是 ( )。 ( A) class virtualB:public A ( B) virtual classB:public A ( C) class B:public A virtual ( D) class B:virtual public A 19 下列对基类和派生类关系的描述中,错误的是 ( )。
7、 ( A)派生类是基类的具体化 ( B)派生类是基类的子集 ( C)派生类是基类定义的延续 ( D)派生类是基类的组合 20 下面的描述中, ( )是正确的。 ( A) virtual可以用来声明虚函数 ( B)含有纯虚函数的类是不可以用宋创建对象的,因为它是虚基类 ( C)即使基类的构造函数没有参数,派生类也必须建立构 造函数 ( D)静态数据成员可以通过成员初始化成员列表来初始化 21 有以下程序: #include iestream using namespace std; int f(int n) if(n=1) return 1; else return f(n-1)+1; int
8、main() int i, j=0; for(i=1; idatai; for (i=1; itemp j-; dataj+1 = temp; for(i=O;istr; personi .set mes(str); coutsetvalue(20); ps-fun(5); ps-disp(); return 0; 程序运行后,输出的结果是 ( )。 ( A) 15 ( B) 20 ( C) 25 ( D) 30 26 若有以下程序: #include iostream using namespace std; class sample private: int n; public: samp
9、le() sample(int m) n=m; void addvalue(int m) sample s; s.n=n+m; *this=s; void disp() cout “n=“ n end1; ; int main() sample s(10); s.addvalue(5); s.disp(); return 0; 程序运行后的输出结果是 ( )。 ( A) n=10 ( B) n=5 ( C) n=15 ( D) n=20 27 若有以下程序: #include iostream using namespace std; class A private: int x; publi
10、c: int z; void setx(int i) x=i; int getx () return x; ; class B : public A private: int m; public: int p; void setvalue(int a,int b, int C) setx (A) ; z=b; m=c; void display() cout getx() “,“ z “,“ m end1; ; int main ( ) B obj; obj.setvalue(2,3,4); obj.display(); return 0; 程序运行以后的输出结果是 ( )。 ( A)产生语法
11、错误 ( B) 2,3,4 ( C) 2,2,2 ( D) 4,3,2 28 有如下程序: #include iostream using namespace std; class Base private: char c; public: Base(char n) :c(n) Base ( ) cout c; ; class Derived : public Base private: char c; public: Derived(char n) :Base(n+1),c(n) Derived () cout c; ; int main ( ) Derived obj (x); retur
12、n 0; 执行上面的程序将输出 ( )。 ( A) xy ( B) yx ( C) x ( D) y 29 有以下程序: #include iostream using namespace std; class A public: virtual void setx(int i,int j=0) x=i; y=j; virtual void print()=0; protected: int x,y; ; class B : public A public: void print() cout x*x “, “; ; class C : public A public: void print(
13、) cout x*x*x end1; ; int main() A *pa; B b; C c; pa= pa-setx(5); pa-print (); pa= pa-setx(2); pa-print(); return 0; 程序运行后的输出结果是 ( )。 ( A) 25, 8 ( B) 2, 5 ( C) 5, 2 ( D) 8, 25 30 在 ios base类中定义了 3个用于文件流定位的枚举常量,下列枚举常量不属于此类的是 ( )。 ( A) ios_ase: beg ( B) ios_base: cur ( C) ios_base: end ( D) ios_base: a
14、te 31 排序是计算机程序设计中的一种重要操作,常见的排序方法有插入排序、【 】和选择排序等。 32 当循环队列非空且队尾指针等于队头指针时,说明循环队列已满,不能进行入队运算。这种情况称为【 】。 33 【 】是一种信息隐蔽技术,目的在于将对象的使用者和对象的设计者分开。 34 为了便于对照检查,测试用例应由输入数据和预期的【 】两部分组成。 35 【 】是从二维表 列的方向进行的运算。 36 【 】是 C+语言程序的入口。 37 程序 #include“iostream h“ void main() int i=10; int i=5; cout j+i+ endl; 的结果为【 】。
15、38 C+语言的基本控制结构为顺序结构、选择结构和【 】。 39 语句 int*i; i=new int10;,释放指针 i的语句是【 】。 40 函数重载要求重载的函数必须有 和原函数一样的【 】。 41 在 C+语言中每个类都有一个【 】指针,该指针指向正在调用成员函数的对象。 42 程序的结果为【 】。 #include“iostream h“ template typename T T total(T*data) Ts=0; while(*data) s+=*data+; return s; int main() int x = 2, 4, 6, 8, 0, 12, 14, 16, 1
16、8 ; cout total(X); return 0; cout endl; 43 语句 cout n还可表示为【 】。 44 设有以下程序: #include iostream using namespace std; int main() int a, b, k: 4, m=6, *p1=&k, *p2=&m; a=p1=&m; b=(*p1) (*p2)+7; cout a b end1; return 0; 执行该程序后, a的值为【 】, b的值为【 】。 国家二级( C+)笔试模拟试卷 68答案与解析 1 【正确答案】 B 【试题解析】 一个算法所必须具有的基本特征是:可行性、确
17、定性、有穷性和拥有足够的情报。 B选项是指算法设计基本方法。 2 【正确答案】 C 【试题解析】 线性表的顺序存储结构要求:线性表中所有元素所占的存储空间是连续 的,并且线性表的数据元素在存储空间中是按逻辑顺序依次存放的。因此,选项 A、 B是错误的。在线性表的顺序存储结构中,前后件两个元素在存储空间中是紧邻的,因此,选项 D也是错误的。 3 【正确答案】 C 【试题解析】 栈是一种线性表,只不过是一种特殊的线性表。在这种特殊的线性表中,插入和删除运算都只在线性表的一端进行。即在这种线性表中,一端是封闭的,不允许进行插入与删除元素。一端是开口的,允许进行插入与删除元素,选项 A、 B是正确的。
18、栈是一种先进后出的线性表。 4 【正确答案】 D 【试题解析】 链式存储结构不同于顺序存储结构,它的存储空间可以是不连续的,并且数据节点的存储顺序与数据元素之间的逻辑关系可以不一致,数据元素之间的逻辑关系是由指针域来确定的。链式存储方式可用于线性结构链式存储也可用于非线性结构,在表示复杂的非线性结构时,指针域的个数要多一些。 5 【正确答案】 C 【试题解析】 输入输出信息是用户直接关心的,输入输出方式和格式应尽可能方便用户的使用,因为系统能否被用户接受,往往取决于输入输出的风格。好的输入输出风格对所有输入数据检验数据的合法性,允许默认值,并且在输入数据时,允 许使用自由格式。 6 【正确答案
19、】 C 【试题解析】 所谓软件危机是泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题。选项 A、 B、 D都属于软件危机的一种表现,软件危机还包括软件需求的增长得不到满足、软件开发成本和进度无法控制和软件开发生产率的提高赶不上硬件的发展和应用需求的增长。 7 【正确答案】 A 【试题解析】 本题考查数据字典的作用,数据字典是对数据流程图中出现的被命名的图形元素的确切解释。 8 【正确答案】 B 【试题解析】 关系数据库的逻辑性强而物理性少,因此 关系数据库中的各条记录前后顺序可以任意颠倒,不影响库中数据的数据关系。 9 【正确答案】 A 【试题解析】 只有归并排序要求待排序文件 “部分
20、排序 ” (把待排序的文件分成若干个子文件,每个子文件内的记录是己排序的 )。 10 【正确答案】 D 【试题解析】 概要设计是软件系统结构的总体设计,其目的就是要按照需求规格说明书,把软件按照功能划分为多个模块,然后确定每个模块要实现的功能,最后确定模块之间的调用关系。而设计每个模块的伪代码则属于详细设计。所以只有最后一个不属于概要设计范畴。 11 【正确答案】 A 【试题解析】 本题考察有关 C+语言中有关 C+程序开发方面的知识点。 C+语言源程序的扩展名为 CPP, DLL是动态连接库文件的扩展名, .EXE是可执行文件的扩展名。 12 【正确答案】 A 【试题解析】 此题考核的知识点
21、是转义字符。此题目的关键是八进制的 101对应的十进制数是多少。八进制 101转换为十进制为 65,也就是大写字母 A的 ASCII码。 13 【正确答案】 C 【试题解析】 运算符的结合方式有两种:左结合和右结合。左结合表示运算符优先与其左边的标 识符结合进行运算,如加法;右结合表示运算符优先与其右边的标识符结合,如单目算术运算符 +和 -。赋值运算符、复合运算符和单目运算符都是右结合的。双目算术运算符是左结合的。所以选项 C是错误的。 14 【正确答案】 A 【试题解析】 本题考查循环语句 do-while语句的执行情况。根据 do-while循环语句功能特点可得:首先无条件执行循环体,表
22、达式 x-的值为 5,输出为 5, x的值变为 4,然后检查条件 (!x)为假 (false),则循环结束。 15 【正确答案】 A 【试题解析】 本题考核数组元素 的初值及其引用。若数组为 auto型,且没有进行初始化,其元素的值为不确定。本程序中,虽然给 s0赋了一个初值,但 s1的值依旧是不确定的,所以执行语句 “k=s1*10”后, k的值也不确定的。 16 【正确答案】 C 【试题解析】 所谓函数重载,是指同一个函数名可以对应多个函数的实现。进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。即重载函数必须具有不同的形参列表。 17 【正确答案】 C 【试题解析】 对于
23、常成员函数需要注意以下几点: const是常成员 函数类型的一个组成部分,因此在实现部分也要带 const关键词。 常成员函数不更新对象的数据成员,也不能调用该类中没有用 const修饰的成员函数。 如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数,而不能调用其他的成员函数。 当成员函数是常成员函数时,常对象和一般对象都可以调用它。 18 【正确答案】 D 【试题解析】 虚基类说明格式如下: Virtual 其中, virtual是虚基类的关键词。虚基类的说明是用在定义派生类时,写在派生类名的 后面。即: class: Virtual。 19 【正确答案】 B 【试题解析】 本题
24、考核基类和派生类的关系。派生类中包含了基类中的成员,它是对基类定义的扩充和延续,是对基类定义的进一步具体化,而不是基类的子集。 20 【正确答案】 A 【试题解析】 本题考核 C+中各知识点的应用。 virtual关键词既可以用来声明虚基类,也可以用来声明虚函数。所以选项 A的描述是正确的。 C+规定,含有纯虚函数的类是抽象类,它不能用来定义对象。选项 B的描 述中,前半句是正确的,但后半句是错误的。 在 C+中,如果所有的基类和子对象构造函数都不需要参数,派生也不需要参数初始化,则派生类中,可以不定义构造函数。所以选项 C的描述是错误的。 在 C+中,静态数据成员的初始化必须在类体外进行。所
25、以选项 D的描述是错误的。 21 【正确答案】 B 【试题解析】 本题考查的知识点是递归函数的调用。根据程序代码逐步分析: f(n)用来计算 n+(n-1)+1 ,在 f(n)定义内部又调用 f(n)自身,这就是递归函数。 f(n)=f(n-1)+1,因此必须先计算出 f(n-1),而 f(n-1)=f(n-2)+1,又必须计算 f(n-2)。 由此类推,直到 n=1,返回后可以此计算出 f(n), f(n-1), f(1) 。 第 1次调用 f(n)时,形参 n接收的值为 1,进入函数体后,由于满足 “n=1”,执行 return语句得到 1。第 2次调用 f(n)时, n的值为 2,不满足
26、条件 “n=1”,执行 return f(n-1)+1,在这条语句中又调用 f(n-1)即 f(1),从而得到 f(2)的返回值为2。所以 j=1+2=3。 22 【正确答案】 B 【试题解析】 本题属于综合题,考查数组和循环语句两方面的知识。此题看起来很复杂,其实不然,根据程序逐步分析: 在程序第 1个 for语句中,为数组 data赋输入的值,即 2, 8, 4, 3。 第 2个 for语句是嵌套式循环,循环次数是 3次,即从 1到 3。第 1次循环时, i=1,执行 “j=i-1”后, j=0,然后把 data1的值赋给 temp,再进入 while循环。 while后的条件表达式 “d
27、ataj temp&j =0”,就是当 data刚大于 temp,同时 j不小于 0时执行 while循环体。当 while条件表达式成立时,执行“dataj+1=dataj”,即当 data刚大于 dataj大于 dataj+1时,把它们俩的值交换一下,以此类推,最后实现把数组中的数从小到大排列起来。 最后一个 for语句用于打印经过程序处理后数组中的元素。 23 【正确答案】 B 【试题解析】 本题考查对指针作为函数形参的掌握程度。根据程序代码逐步分析: 第一个被调函数 setstar()为 void型。形参为一个 char类型的指针变量 a和一个整型变量 n,函数体由 for循 环语句构
28、成,给指针变量 a所指的变量赋值,并对从 a所指的存储单元开始的连续 n个存储单元,进行赋值 (*)。 函数 arrout()也是 void类型,形参也是两个,一个为 char类型的指针,另一个是整型变量 n。函数体也是由 for循环语句构成,不过 setstar()函数是给指针变量所指的存储单元赋值,:而 arrout()函数是输出指针变量所指的存储单元中的值。 主函数中,程序首先定义并赋初值于数组 c,调用 setstar()函数,把实参数组元素 c4的地址传递给 setstar的形参变量 a,并把 M-B的 值 (即 6)传递给 n。这样最后的结果是数组元素 c0、 c1、 c2和 c3
29、中的值不变,从 c4开始以后的数组元素中的值都将被改变为字符 *。调用函数 arrout()输出改变后的数组 c中的值。 24 【正确答案】 A 【试题解析】 本题考核静态数据成员的应用。分析程序: 类 visited中,定义了两个私有成员:整型变量 number和指针变量 name。两个公有成员:静态数据变量 glob和函数 set mes()。 在函数 set mes中,把传入的字符串保存在类的私有成员 name中,并把静态数据成员 glob自加,同时赋值给私有成员 number。 通过以上分析可知,函数 set mes()用来记录输入的名字 (即来访者的姓名 ),静态数据变量 glob用
30、来记录有多少来访者。 在主函数中,输入 5个字符串 (即 5个来访者的姓名 )后,用来记录来访者数目的静态数据成员 glob的值变成 5。所以程序最后的输出结果是 5。 25 【正确答案】 C 【试题解析】 本题考核对象指针的应用。程序首先定义了一个类 sample,其中包含一个私有成员 i和 3个公有成员函数。函数 setvalue()的 功能是给私有成员 i赋值,函数 fun()的功能是将私有成员 i的值增加 m,函数 disp的功能是输出变量 i的值。在主函数中,先定义了类 sample的一个耐象指针 ps,并申请了一块内存空间。执行 语句 ps-setvalue(20);后,类中 i的
31、值为 20,执行语句 “ps-fun(5); ”后,类中 i的值为 25。所以程序最后输出 25。 26 【正确答案】 C 【试题解析】 本题考核 this指针的应用。本程序中 sample类定义了一个addvalue非静态成员函数。 addvalue()函数的原型是: void addvalue(sample *this,int m);,该函数的第 1个参数是执行该类对象的一个指针,即 this指针。由于这个参数是系统隐含的,所以在定义该成员函数时并没有看到这样一个参数。在成员函数的定义体中,可以通过 this访问这一参数。程序的最后输出结果是15。 27 【正确答案】 B 【试题解析】 本
32、题考核公有继承中的类成员访问权限。当类的继承方式为公有继承时,基类的公有成员和保护成员分别作为派生类的公有成员和保护成员,派生类的其他成员可以直接访问它们。其他外部使用者只能通过派生类的对象 访问继承来的公有成员。 在本题中,数据成员 z和函数 setx()都是基类 A的公有成员,它们经过公有继承以后,在派生类 B中还是公有成员,而派生类 B中的函数setValue()和 display()都是公有成员,可以通过对象对它们进行访问。所以程序中对各成员的访问是正确的。本程序的功能是输出已设置的各成员的值。 28 【正确答案】 A 【试题解析】 在 C+中,由于析构函数不能被继承,因此在执行派生类
33、的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执 行构造函数的顺序正好相反。在此题的程序中,在主函数结束时,派生类 Derived对象。 obj将被删除,所以就会调用对象的析构函数。先调用派生类的析构函数,输出 x,然后调用基类的析构函数,输出 y。 29 【正确答案】 A 【试题解析】 该程序中定义了 A类、 B类和 C类共 3个类。其中,类 A是抽象类,它的类体内有一个纯虚函数 pnnt()。抽象类不可以定义对象,但可以定义指向对象的指针。类 B和类 C都是类 A的公有派生类,这些类是具体类,它们对 A类中纯虚函数都有不同的实现。该
34、程序的主函数中,定义一个指向类 A对象的 指针 pa,又定义了类 B和类 C的 2个对象,并使指针 pa分别指向这些对象。这里,采用动态联编,在运行时选择 print()函数。所以,执行语句序列 “pa=&b;pa-setx(5); pa-print(); ”后,系统调用类 B的 print()函数,输出 25;执行语句序列 “pa=&c; pa-setx(2); pa-prim(); ”后,系统调用类 C的 prim()函数,输出8。 30 【正确答案】 D 【试题解析】 C+文件流的定位方式有 3种,被定义为 ios_base: seek_dir中的一组枚举符号: ios base: be
35、g 相对于文件首 ios base: cur 相对于当前位置 (负数表示当前位置之前 ) ios_base: end相对于文件尾 31 【正确答案】 交换排序 【试题解析】 常见的排序方法有插入排序 (包括简单插入排序法和希尔排序法等 )、交换排序 (包括冒泡排序和快速排序法等 )和选择排序 (包括简单选择排序和堆排序等 )。注意:常见的排序方法及其作用机制和区别。 32 【正确答案】 上溢 【试题解析】 入队运算是指在循环队列的队尾加入一个新元素。 这个运算有两个基本操作:首先将队尾指针进一 (即 rear=rear+1),并当 Year=m+1时置 rear =1;然后将新元素插入队尾指针
36、指向的位置。当循环队列非空 (s=1)时且队尾指针等于队头指针时,说明循环队列已满,不能进行入队运算,这种情况称为 “上溢 ”。 33 【正确答案】 封装 【试题解析】 面向对象技术中包括以下几个基本概念,即对象、类、方法、消息、继承和封装,其中封装是一种信息隐蔽技术,目的在于将对象的使用者对象的和设计者分开。 34 【正确答案】 输出结果 35 【正确答案】 关系运算 【试题解析】 在关系模型的数据语言中,一般除了运用常规的集合运算, (并、交、差、笛卡尔积等 )外,还定义了一些专门的关系运算,如投影、选择、连接等。前者是将关系 (即二维表 )看成是元组的集合,这些运算主要是从二维表的行的方
37、向来进行的;后者主要是从二维表的列的方向来进行的运算。两者统称为关系代数。 36 【正确答案】 main()函数 【试题解析】 main()是 C+语言的入口函数。注意: main()函数可以放在程序的任何位置 37 【正确答案】 15 【试题解析】 i+为 先做与 i有关的运算后, i自加 1,而 +i是先给 i加 1再进行与 i有关的操作注意:各种运算符的应用,注意 +, -。 38 【正确答案】 循环结构 【试题解析】 C+语言 3种基本结构就是顺序结构,选择结构,循环结构。 39 【正确答案】 deletei 【试题解析】 申请内存空间时用 new,释放内存空间用 delete。注意:
38、 new和delete的运用和 malloc, free的运用。 40 【正确答案】 函数名 【试题解析】 重载函数的函数名应和原函数一致。注意: 重载函数的 方式方法,重载函数的参数,重载函数的返回值。 41 【正确答案】 this 【试题解析】 c+语言中 this指针是类自带的一个指针,它指向正在调用成员函数的对象。注意: C+类的基本概念, this指针概念。 42 【正确答案】 20 【试题解析】 要理解, data的含意。 43 【正确答案】 cout endl; 【试题解析】 “n”表示换行, endl也可表示换行。注意: endl和 “n”可以通用。 44 【正确答案】 0 7 【试题解析】 本题考核的知识点是有 关指针的运算。程序中定义了两个指针变量p1和 p2,并通过赋初值让它们分别指向了变量 k和 m。语句 “a=p1=&m; ”中先执行关系运算符 “p1=&m”,显然是 0(假 ),然后把 0赋值给 a。接着执行语句“b=(*p1) (*p2)+7”,此处 *p1的值就是 k的值 4, *p2的值就是 m的值 6,即把“4 6+7”的结果赋给 b, b的值为 7。