1、二级 C+笔试 18 及答案解析(总分:86.00,做题时间:90 分钟)一、B选择题/B(总题数:30,分数:60.00)1.线性表的链式存储结构是一种( )的存储结构。(分数:2.00)A.随机存储B.顺序存储C.索引存储D.散列存储2.有以下程序: #include iostream using namespace std; static int days= 31,28,31,30,31,30,31,31,30,31,30,31 ; class date private: int month,day,year; public: date( int m,int d,int y ) mont
2、h = m; day = d; year = y; date() void disp() coutyear“-“month“-“dayend1; date operator+( iht day ) date dt = * this; day += dt.day; while ( day days dt.month - 1 ) day -= days dt.month - 1 ; if ( +dt.month = 13 ) dt.month = 1; dt.year+; dt.day = day; return dt; ; int main() date dl( 6, 20, 2004 ), d
3、2; d2 = dt + 20; d2.disp(); return 0; 执行后的输出结果是( )。(分数:2.00)A.2004-7-10B.2004-6-20C.2004-7-20D.程序编译时出错3.设有以下说明语句: typedef struct int n; char ch8; PER; 则下面叙述中,正确的是( )。(分数:2.00)A.PER 是结构体变量名B.PER 是结构体类型名C.typedef struct 是结构体类型D.struct 是结构类型名4.下列对字符数组进行初始化的语句中,正确的是( )。(分数:2.00)A.char a=“Hello“;B.chara=
4、H,e,1,1,0;C.char a5=“Hello“;D.char a25=“Hello“,“World“;5.首先访问结点的左子树,然后访问该结点,最后访问结点的右子树,这种遍历称为 ( )。(分数:2.00)A.前序遍历B.后序遍历C.中序遍历D.层次遍历6.有以下程序: #includeiostream using namespace std; int f(int x); int sum(int n) int x,s=0; for(x = 0;x=n;x+) s+=f(x); return s; int f(int x) return (x*x+1); int main() int a
5、,b; cout“Enter a integer number:“; cina; b=sum(a) ; couta“,“bend1; return 0; 如果输入数字 3,其输出结果是( )。(分数:2.00)A.3,12B.3,16C.3,18D.4,207.以下选项中,( )是合法的用户标识符。(分数:2.00)A.longB._2TestC.3DmaxD.dat8.若以下定义: struct link int data; struct link *next; a,b,C,*p,*q; 且变量 a 和 b之间已有下图所示的链表结构。 (分数:2.00)A.next=c;next=b;B.n
6、ext=q;next=next;C.q-next=p-next;p-next= int main() ofstream ofile; char ch; ofile.open(“d:/abc.txt“, W); do cinch; ofile.put(ch); while(ch!=#); ofile.close(); return 0; 程序出错的原因是( )。(分数:2.00)A.成员函数 open 调用形式错误B.输入文件没有关闭C.成员函数 put 调用形式错误D.对象 ofile 定义错误27.为完成下面的程序,应在划线处填入的语句是( )。 #include iostream usin
7、g namespace std; class Base private: int x; public: Base(int i) x=i; Base() ; class Derived : public Base public: _ /完成类 Derive 构造函数的定义 ; int main() Derived Obj; return 0; (分数:2.00)A.Derived(int :Base(B.Derived()C.voidDerived(int :Base(0)D.Derived(int Base(;29.自顶向下分析方法从文法的开始符号出发,判断其能否( )出输入符号串。(分数:2
8、.00)A.归纳B.归约C.推理D.推导30.以下程序段的输出结果是( )。 char str = “BCDE“,*ptr=str; cout*(p+4)end1;(分数:2.00)A.字符 E 的地址B.0C.69D.不确定二、B填空题/B(总题数:13,分数:26.00)31.一个节点的子节点个数称为该节点的U 【1】 /U。(分数:2.00)填空项 1:_32.类是一个支持集成的抽象数据类型,而对象是类的U 【2】 /U。(分数:2.00)填空项 1:_33.软件测试分 4 个步骤进行,即单元测试、集成测试、确认测试和U 【3】 /U。(分数:2.00)填空项 1:_34.U【4】 /U
9、是在进行了成功的测试之后才开始的。它与软件测试不同,测试的目的是发现错误,进一步诊断和改正错误,则是调试的任务。(分数:2.00)填空项 1:_35.数据库系统由数据库、U 【5】 /U、硬件平台、数据库管理员和软件平台所组成。(分数:2.00)填空项 1:_36.有以下程序: #includeiostream using namespace std; int main() int i=1,sum=0; Loop:if(i=20) sum+=i; i+; goto Loop; coutsumend1; return 0; 该程序运行后的输出结果是U 【6】 /U。(分数:2.00)填空项 1:
10、_37.fun()函数的功能是:首先对 a 所指的 N 行 N 列的矩阵,找出各行中的最大的数,再求这 N 个最大值中的最小的那个数作为函数返回值。请填空完成此程序。 #define N 100 int fun(int (*A) N) int row,col,max,min; for(row=0;row填空项 1:_38.下面程序的运行结果是U 【9】 /U。 #include iostream using namespace std; void fun(int day = d; year = y; date() void disp() coutyear“-“month“-“dayend1;
11、date operator+( iht day ) date dt = * this; day += dt.day; while ( day days dt.month - 1 ) day -= days dt.month - 1 ; if ( +dt.month = 13 ) dt.month = 1; dt.year+; dt.day = day; return dt; ; int main() date dl( 6, 20, 2004 ), d2; d2 = dt + 20; d2.disp(); return 0; 执行后的输出结果是( )。(分数:2.00)A.2004-7-10 B
12、.2004-6-20C.2004-7-20D.程序编译时出错解析:解析 本题通过将“+”运算符重载为类 date 的成员函数实现简单的对象加法。类 date 中的“+”运算符重载函数中,将传入的实参值 day,加到类 date 的私有成员变量 day 上,并实现变量 month和 year 的相应变化,从而达到日期对象相加的目的。3.设有以下说明语句: typedef struct int n; char ch8; PER; 则下面叙述中,正确的是( )。(分数:2.00)A.PER 是结构体变量名B.PER 是结构体类型名 C.typedef struct 是结构体类型D.struct 是结
13、构类型名解析:解析 本题考核用 typedef 定义自己的变量类型。C+语言允许定义用关键字 typedef 所命名的新的数据类型。实际上,没有建立一个新的数据类型,而仅是对存在的类型定义了一个新的名字。所定义的新名是现有的类型名的补充,而不是取代。4.下列对字符数组进行初始化的语句中,正确的是( )。(分数:2.00)A.char a=“Hello“; B.chara=H,e,1,1,0;C.char a5=“Hello“;D.char a25=“Hello“,“World“;解析:解析 本题考查对字符数组的初始化。 选项 A 中,数组 a 在定义后紧跟初始化的情况下可省略数组长度,其最终数
14、组长度由所赋字符串常量的长度给定。选项 A 是正确。 选项 B 中,a 是一个二维数组,二维数组也能在定义时被初始化。如果对全部元素都赋初值,则定义数组时第一维的大小可以忽略,但第二维的大小不能省略。故选项 B 是错误。 选项 C 和选项 D 都忽略了字符串的大小要比字符串中的字符数多 1 这一点,造成了数组的越界。5.首先访问结点的左子树,然后访问该结点,最后访问结点的右子树,这种遍历称为 ( )。(分数:2.00)A.前序遍历B.后序遍历C.中序遍历 D.层次遍历解析:解析 前序遍历是指若二叉树为空树,则空操作:否则:访问根节点:先序遍历左子树:先序遍历右子树。中序遍历二叉树是指若二叉树为
15、空树,则空操作:否则,中序遍历左子树;访问根节点;中序遍历右子树。后序遍历二叉树是指若二叉树为空树,则空操作;否则,后序遍历左子树;后序遍历右子树;访问根节点。因为根节点是在中间访问的,即中序遍历。6.有以下程序: #includeiostream using namespace std; int f(int x); int sum(int n) int x,s=0; for(x = 0;x=n;x+) s+=f(x); return s; int f(int x) return (x*x+1); int main() int a,b; cout“Enter a integer number:
16、“; cina; b=sum(a) ; couta“,“bend1; return 0; 如果输入数字 3,其输出结果是( )。(分数:2.00)A.3,12B.3,16C.3,18 D.4,20解析:解析 这还是有关调用函数的程序,而且有两层关系。根据程序逐步分析: 本程序包含了 3 个函数,其中主函数 main 调用了 sam()函数,而在 sum()函数中又调用了 f 函数。 在主函数中,先从键盘输入一整数,并赋值给 a。在这里题目开始已给出输入的是整数 3,调用函数 sum(),并把 3 传值给形参 n,最后输出 a,b 的值。 在 sum()函数中,有一个 for 循环语句,在每次循
17、环时调用函数 f,并把当前的 x 值传给形参 x,循环结束后,返回 s 值。 在 f()函数中,变量 x 接收实参的值后,执行表达式“x*x+1”,并返回表达式的运算结果。 在 sum()函数中,由于 n 值为 3,不难看出,当x=0、x=1、x=2 和 x=3 时,都能执行循环体,即调用函数 f,第 1 次循环更改 s 值为 1,第 2 次循环更改s 值为 3, 第 3 次更改为 8,第 4 次更改为 18,也就是最后一次循环,即最终 sum()返回值将是 18。 在主函数收到 sum()函数的返回值,并输出 3,18。7.以下选项中,( )是合法的用户标识符。(分数:2.00)A.long
18、B._2Test C.3DmaxD.dat解析:分析 有关用户标识符的考题经常在考试中出现,考生应该重视。选项 A 中 long 是 C+语言保留字,不能用于用户标识符。选项 C 中的 3Dmax,它的第一个字符是数字 3,不是所规定字母或下划线,所以也不是合法的用户标识符。选项 D 中的 A.dat,它中间出现了符号“.”,不符合标识符的定义规则。所以只有选项 B 中的标识符是合法的 C+标识符。8.若以下定义: struct link int data; struct link *next; a,b,C,*p,*q; 且变量 a 和 b之间已有下图所示的链表结构。 (分数:2.00)A.n
19、ext=c;next=b;B.next=q;next=next;C.q-next=p-next;p-next= int main() ofstream ofile; char ch; ofile.open(“d:/abc.txt“, W); do cinch; ofile.put(ch); while(ch!=#); ofile.close(); return 0; 程序出错的原因是( )。(分数:2.00)A.成员函数 open 调用形式错误 B.输入文件没有关闭C.成员函数 put 调用形式错误D.对象 ofile 定义错误解析:解析 本题考核文件的打开。C+中,可以在定义文件流对象的同时
20、打开文件,也可以在定义文件流对象以后用 open()函数打开文件。可以通过构造函数或 open 函数的第 2 个参数,确定文件的打开模式。打开模式用下列常量表示: ios_base:app 为添加数据而打开(总是在文件尾部写); ios_ase:binary 作为二进制文件打开: ios_ase:in 为输入而打开: ios_ase:out 为输出而打开; ios_base:tmnc 若文件存在,截为空文件; ios_base:ate 打开时定位于文件尾。 题中成员函数 open()的第 2 个实参不符合 C+的打开模式,所以产生调用错误。27.为完成下面的程序,应在划线处填入的语句是( )。
21、 #include iostream using namespace std; class Base private: int x; public: Base(int i) x=i; Base() ; class Derived : public Base public: _ /完成类 Derive 构造函数的定义 ; int main() Derived Obj; return 0; (分数:2.00)A.Derived(int :Base( B.Derived()C.voidDerived(int :Base(0)D.Derived(int Base(;解析:解析 程序中,类 Derive
22、d 是基类 Base 的公有派生。在类 Derived 的构造函数应该包括调用基类构造函数使基类的数据成员得以初始化。解析:解析 本题考核一维数组元素的引用和一维数组的输出。程序中的 do-while 循环语句的执行过程如下: 第 1 次循环时,i=0、y=18,把“y%2”的值 0 存入 a0,执行 i+后,i 的值变为 1,再执行y=y/2;,使 y 的值变为 9。 同理,第 2 次循环后,a1的值为 1,第 3 次循环后,a2的值变为 0,第4 次循环后,a3的值变为 0,第 5 次循环后,a4的值为 1,然后退出 do-while 循环体。 for 循环是输出从 a4到 a0的值,结果
23、为:10010。29.自顶向下分析方法从文法的开始符号出发,判断其能否( )出输入符号串。(分数:2.00)A.归纳B.归约C.推理D.推导 解析:解析 本题考核自顶向下分析方法的概念。30.以下程序段的输出结果是( )。 char str = “BCDE“,*ptr=str; cout*(p+4)end1;(分数:2.00)A.字符 E 的地址B.0 C.69D.不确定解析:解析 本题考核字符串指针。在程序段中,有语句:“char str=“BCDE“,*ptr=str;”。由字符串赋值的规则可知:字符串数组 str 中的 5 个元素的值分别为:B、C、D、 E和/0。而指针ptr 指向 s
24、tr0。最后程序要求输出*(p+4),即数组元素 str4的值,而 str4中存放的是字符/0。所以最后输出的值为 0。二、B填空题/B(总题数:13,分数:26.00)31.一个节点的子节点个数称为该节点的U 【1】 /U。(分数:2.00)填空项 1:_ (正确答案:度)解析:解析 在一个树结构中,一个节点拥有子节点个数称为该节点的度。所有节点中最大的度称为树的度。32.类是一个支持集成的抽象数据类型,而对象是类的U 【2】 /U。(分数:2.00)填空项 1:_ (正确答案:实例)解析:解析 在面向对象方法中,将属性、操作相似的对象归为类,也就是说,类是具有共同属性、共同方法的对象的集合
25、。所以,类是对象的抽象,它描述了属于该对象类型的所有对象的性质,而一个对象则是其对应类的一个实例。33.软件测试分 4 个步骤进行,即单元测试、集成测试、确认测试和U 【3】 /U。(分数:2.00)填空项 1:_ (正确答案:系统测试)解析:解析 软件测试按 4 个步骤进行,即单元测试、组装测试、确认测试和系统测试。通过这些步骤地实施来验证软件是否合格。34.U【4】 /U是在进行了成功的测试之后才开始的。它与软件测试不同,测试的目的是发现错误,进一步诊断和改正错误,则是调试的任务。(分数:2.00)填空项 1:_ (正确答案:程序调试)解析:解析 本题考查软件测试和软件调试的区别。软件测试
26、贯穿整个软件生命期,它是尽可能的发现软件中的错误。软件调试主要在开发阶段,它是在测试成功后开始,诊断和改正程序中潜在的错误。35.数据库系统由数据库、U 【5】 /U、硬件平台、数据库管理员和软件平台所组成。(分数:2.00)填空项 1:_ (正确答案:数据库管理系统)解析:解析 本题考查数据库系统的组成部分,其中硬件平台包括计算机、网络。软件平台包括操作系统、数据库系统开发工具和接口软件。36.有以下程序: #includeiostream using namespace std; int main() int i=1,sum=0; Loop:if(i=20) sum+=i; i+; got
27、o Loop; coutsumend1; return 0; 该程序运行后的输出结果是U 【6】 /U。(分数:2.00)填空项 1:_ (正确答案:210)解析:解析 本题是 goto 跳转语句的应用。程序中,如果满足条件“i=20”,则执行语句“sum+=i;i+;”然后,又跳转到 Loop 处。直到条件“i=20”不满足。由此可知,此程序的功能是统计 120 的总和,即 210。37.fun()函数的功能是:首先对 a 所指的 N 行 N 列的矩阵,找出各行中的最大的数,再求这 N 个最大值中的最小的那个数作为函数返回值。请填空完成此程序。 #define N 100 int fun(i
28、nt (*A) N) int row,col,max,min; for(row=0;row填空项 1:_ (正确答案:7arowcolmax 或 arowcol=max 或 maxarowcol或 max=arowcol)解析:8maxmin 或 max=min 或 minmax 或 min=max。 解析 由程序可知,第 2 个 for 循环是用宋找出某一列中的最大值。由于 if 选择后面的语句是把数组元素值存入变量 max 中,说明此时的数组元素比开始设定的 max 值要大,所以 if 中的条件表达式为:arowcolmax。第 1 个 for 循环用于实现对矩阵的行扫描,由于 else
29、if 后面的执行语句是把 max 赋给 min,说明此时 max 比开始设定的 min 还小,所以 else if 中的条件表达式为:maxmin 或 max=min。38.下面程序的运行结果是U 【9】 /U。 #include iostream using namespace std; void fun(int &a, int b=3) static int i=2; a = a + b + i; i = i + a; int main() int x=5, y=2; fun(x, y); coutx“,“; fun(x); coutxend1; return 0; (分数:2.00)填空
30、项 1:_ (正确答案:9,23)解析:解析 本题主要考察 C+中变量的作用域、存储类别和参数默认值的使用。本题主函数中,第 1次调用 fun()函数时,利用实参 x 和 y 将 5 和 2 分别赋值给形参 a 和 b;由于形参 a 为传址方式传值,因此在函数 fun()内部,由于 a 的改变:a =a+b+i=5+2+2=9。导致实参 x 值也变为 9,因此程序第 1 次输出x 值为 9。 此后静态局部变量 i 值变为:i=i+a=2+9=11。 主函数第 2 次调用 fun()时,只给出了一个实参 x,其值由上述计算应该为 9,而另一个参数由于 fun()函数定义中为形参 b 指定了默认值
31、 3,因此此时程序将把 3 作为形参 b 的值代入 fun()函数中去。类似上面计算有:a=a+b+i=9+3+11=23。 由于形参 a 采用传址方式传值,因此实参 x 值也随之变为 23,则程序第 2 次输出值应该为 23。故程序整体输出为“9,23”。39.虚函数必须是类的U 【10】 /U。(分数:2.00)填空项 1:_ (正确答案:成员函数)解析:解析 C+中,只有类的成员函数才能说明为虚函数。这是因为,虚函数仅适用于有继承关系的类对象,所以普通函数不能说明为虚函数。40.下面是复数类 complex 的定义,其中作为友元函数重载的运算符“-”的功能是将参数对象的实部减1,然后返回
32、对该对象的引用。请补充完整。 class complex private: int real; int imag; public: complex(int r=0,int i=0):real(r),imag(i) void show() coutreal(imag填空项 1:_ (正确答案:friend complex& operator-(complex&))解析:分析 本题考核运算符重载的定义。程序要填入的是运算符函数 operator-在类 complex 中的声明。根据题目给出的条件,易得到答案。41.在下面程序横线处填上适当内容,使程序输出为:55599。 #include iost
33、ream using namespace std; template class TYPE class HisClass TYPE data; public: HisClass(TYPE a, TYPE b, TYPE C) ; TYPE getData() return data;) ; templateclass TYPE HisClassTYPE:HisClass(TYPE a,TYPE b,TYPE C) U【12】 /U; else 主 f(bC) data=b; else data=c; int main() HisClassint x1(3,4,5),x2(5,3,4),x3(4
34、,5,3),x4(7,8,9),x5(8,7,9); coutx1getData()x2getData()x3getData() x4getData()X5getData(); return 0; (分数:2.00)填空项 1:_ (正确答案:if(ab&aC) data=a)解析:解析 本题考核类模板的定义。其构造函数实现的功能是将 a、b、c 中的最大值赋给私有成员data。42.有以下程序: #include iostream using namespace std; class CFactorial private: int value; int fact; public: CFact
35、orial ( int val ); void CalculateFactorial(); void Display(); ; CFactorial : CFactorial( int val ) value = val; fact = 1; void CFactorial : CalculateFactorial() int i = value; while ( i 1 ) fact *= i-; void CFactorial : Display() coutvalue“!=“factend1; int main() CFactorial A( 5 ); ACalculateFactori
36、al(); ADisplay(); return 0; 程序中,类 CPactorial 的功能是U 【13】 /U,该程序运行的结果是U 【14】 /U。(分数:2.00)填空项 1:_ (正确答案:13求自然数的阶乘 14120)解析:解析 类 CFactorial 中的成员函数 CalculateFactorial()实现的功能是:求自然数 value 的阶乘结果。43.有以下程序: #include iostreamh #include fstreamh #include stdlibh int main() fstream filel,file2; char line100; fil
37、elopen(“sourcetxt“,ios:in); if(!file1) cout“Cant open file sourcetxt!“end1; abort(); file2open(“dest.txt“,ios:out); if(!file2) cout“Cant open file desttxt!“end1; abort(); while(!file1eof() filelgetline(1ine,100); file2line; file2end1; filelclose(); file2close(); return 0; 此程序实现的功能是U 【15】 /U。(分数:2.00)填空项 1:_ (正确答案:将文本文件 source.txt 中内容复制到文本文件 dest.txt 中)解析:解析 程序首先将两个文件 source 和 dest 都打开,然后通过 while 循环,以一行为单位进行内容的复制。