1、计算机等级考试二级(C+)34 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(每小题 2 分,共 70 分) 下列各(总题数:35,分数:70.00)1.有以下程序 void swap(char *x,char *y) char t; t=*x;*x=*y;*y=t; main() char *s1=“abc“,*s2=“123“; swap(s1,s2); printf(“%s,%s/n“,s1,s2); 程序执行后的输出结果是_。 (分数:2.00)A.123,abcB.abc,123C.1bc,a23D.321,cba2.若二维数组 a 有 m 列,则计算任一元素 a
2、 i j 在数组中相对位置的公式为( )。 (假设 a0)0位于数组的第一个位置上)(分数:2.00)A.0B.1C.2D.33.下面程序的运行结果是( )。 #includeiostreamh class base protected: int a; public: base( )cout“0“; ; class basel:virtual base public: basel( )cout“1“; ; class base2:virtual base public: base2( )cout“2“; ; class derived:public basel,public base2 pub
3、lic: derived( )cout“3“; ; void main( ) derived obj; coutendl; (分数:2.00)A.5B.3C.2D.04.以下哪个不是 C+语言中的有效标识符?(分数:2.00)A.34aB._ABC.A_BD.A255.表达式 3.6-5/2+1.2+5%2 的值是_。 (分数:2.00)A.4.3B.4.8C.3.3D.3.86.函数 fun 的返回值是( )。 fun(char*a,char*b) intnum=0,n=0; while(*(a+num)!=/0)num+; while(bn)*(a+num)=bn;num+;n+; ret
4、urnnum; (分数:2.00)A.j=i;B.j=(long)i;C.i=(int)j;D.i=j;7.对于模板定义关键字 class 和 typename 说法不正确的是( )。(分数:2.00)A.每次调用此过程,该过程中的局部变量都会被重新初始化B.在本过程中使用到的,在其他过程中定义的变量也为 Statci 型C.每次调用此过程时,该过程中的局部变量的值保持在上一次调用后的值D.定义了该过程中定义的局部变量为“自动“变量8.有以下程序 #includeiostreamh float fun(int x,int y) return(x+y); void main( ) int a=2
5、,b=5,c=8; tout fun( (int)fun(a+c,B) ,a-C) ; 程序运行后的输出结果是( )。 (分数:2.00)A.编译出错B.9C.21D.99.下列对于线性链表的描述中正确的是_。 (分数:2.00)A.存储空间不一定是连续,且各元素的存储顺序是任意的B.存储空间不一定是连续,且前件元素一定存储在后件元素的前面C.存储空间必须连续,且前件元素一定存储在后件元素的前面D.存储空间必须连续,且各元素的存储顺序是任意的10.若已定义: inta=0,1,2,3,4,5,6,7,8,9,*p=a,i; 其中 0i9,则对 a数组元素不正确的引用是( )。 (分数:2.00
6、)A.intB.doubleC.floatD.不确定11.下面程序的运行结果为( )。 # include iostreamh class A public: A( ) cout “1“; A( ) cout “2“; ; class B:public A public: B( ) cout “3“; B ( ) cout “4“; ; void main ( ) B b; (分数:2.00)A.F10B.F4C.F5D.Ctrl12.关于友元的概念错误的是( )。(分数:2.00)A.If x=y Then z=x:z=yB.If x=y Then z=x Else z=yC.z=y:If
7、x=y Then z=xD.If x=n;i-)ai+1=ai; main() int i,aN=1,2,3,4,5,6,7,8,9,10; fun(a,2,9); for(i=0;iA.10234B.12344C.12334D.1223416.C+语言中关于构造函数的说法正确的是( )。(分数:2.00)A.构造函数的函数名不必和类名相同B.构造函数只能每一个C.每个类必定有构造函数D.构造函数必有返回值17.语句 ofstreamf(“SALARY.DAT”,ios_base:app)的功能是建立流对象 f,并试图打开文件SALARY.DAT 与 f 关联,而且_。(分数:2.00)A.若
8、文件存在,将其置为空文件;若文件不存在,打开失败B.若文件存在,将文件指针定位于文件尾;若文件不存在,建立一个新文件C.若文件存在,将文件指针定位于文件首;若文件不存在,打开失败D.若文件存在,打开失败;若文件不存在,建立一个新文件18.有如下程序 #includeiostreamh voidmain( ) charch25=“6937“,“8254“,*p2; inti,j,s=0; for(i=0;i2;i+)pi=chi; for(i=0;i2;i+) for(j=0;pij,/0,;j+=2) s=10*s+pij-0; coutS; 该程序的输出结果是( )。 (分数:2.00)A.
9、69825B.63825C.6385D.69382519.以下选项中不能作为合法常量的是_。 (分数:2.00)A.12340B.1.234e0.4C.12340D.1.23420.以下语句或语句组中,能正确进行字符串赋值的是_。 (分数:2.00)A.char *sp;*sp=“right!“;B.char s10;s=“right!“;C.char s10;*s=“right!“;D.char *sp=“right!“;21.下面程序的结果是( )。 #includeiostreamh class A int a; public: A( ):a(1) void showa( ) cout
10、a; ; class B int a; public: B( ):a(2) void showa( ) cout a; ; class C:public A,public B int a; public: C( ):a(3) void showa( ) cout a; ; void main( ) C c; cshowa( ); (分数:2.00)A.将 private int m 改为 protected int mB.将 private int m 改为 public int mC.将 private int m 改为 static iD.将 private int m 改为 int m2
11、2.设变量 a 是 int 型,f 是 double 型,i 是 float 型,则表达式 10 + a + i * f 值的数据类型是( )。(分数:2.00)A.intB.floatC.doubleD.不确定23.下列选项中不属于结构化程序设计方法的是_。 (分数:2.00)A.自顶向下B.逐步求精C.模块化D.可复用24.设变量已正确定义,则以下能正确计算 f=n!的程序段是_。 (分数:2.00)A.f=0; for(i=1;i1;i+) f*=i;D.f=1; for(i=n;i=2;i-) f*=i;25.下列程序的运行结果为( )。 #includeiostreamh void
12、main( ) int a=2; int b=a+1; cout a/b endl; (分数:2.00)A.实体完整性B.域完整性C.参照完整性D.以上各项都需要定义26.若有以下说明和定义 union dt int a;char b;double c;data; 以下叙述中错误的是_。 (分数:2.00)A.data 的每个成员起始地址都相同B.变量 data 所占的内存字节数与成员 c 所占字节数相等C.程序段 data.a=5;printf(“%f/n“,data.;输出结果为 5.000000D.data 可以作为函数的实参27.下面程序段的运行结果是( )。 voidmain( )
13、ihtt,a,b,C; a=1;b=2;C=2; while(abc) t=a;a=b;b=t;c-; couta“,“b“,“C; (分数:2.00)A.8B.9C.7D.628.下面关于数组的初始化正确的是( )。(分数:2.00)A.char str :a,b,cB.char str2=a,b,cC.char str23=a,b,c,d,e,fD.char str( )=a,b,c29.有如下程序 #include #include using namespace std; class MyClass public: MyClass()cout=0) printf(“%c“,sn-);
14、当编译连接通过后,运行程序 T18 时,输入 Thank!则输出结果是: 5。 (分数:2.00)填空项 1:_46.派生类构造函数的执行顺序是先执行 1 的构造函数,然后执行成员对象的构造 函数,最后执行 2 的构造函数。 (分数:2.00)填空项 1:_47.派生类构造函数的执行顺序是先执行 1 的构造函数,然后执行成员对象的构造 函数,最后执行 2 的构造函数。 (分数:2.00)填空项 1:_48.构造函数是和 1 同名的函数。(分数:2.00)填空项 1:_49.类 test 的析构函数是 1。(分数:2.00)填空项 1:_50.程序 #include“ iostreamh“ vo
15、id main1 int i=10; jnt j=5; cout j+i+ end1; 的结果为 2 (分数:2.00)填空项 1:_计算机等级考试二级(C+)34 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(每小题 2 分,共 70 分) 下列各(总题数:35,分数:70.00)1.有以下程序 void swap(char *x,char *y) char t; t=*x;*x=*y;*y=t; main() char *s1=“abc“,*s2=“123“; swap(s1,s2); printf(“%s,%s/n“,s1,s2); 程序执行后的输出结果是_。 (分数:
16、2.00)A.123,abcB.abc,123C.1bc,a23 D.321,cba解析:此题考核的知识点是指针变量值的交换。C 语言中,字符串常量在内存中是以字符数组的形式进行 存放的,因此字符指针 x 和 y 指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*x 与*y 交 换的是字符串的第一个字符,即字符“a”与“1”的交换,而字符串中其它字符保持不变,所以答案选 C。2.若二维数组 a 有 m 列,则计算任一元素 a i j 在数组中相对位置的公式为( )。 (假设 a0)0位于数组的第一个位置上)(分数:2.00)A.0B.1C.2 D.3解析:本题首先通过第一个 whil
17、e 循环计算字符串 a 的长度,再通过第二个循环,将字符串 a 和 b 相连,最后返回连接后的总长度。 3.下面程序的运行结果是( )。 #includeiostreamh class base protected: int a; public: base( )cout“0“; ; class basel:virtual base public: basel( )cout“1“; ; class base2:virtual base public: base2( )cout“2“; ; class derived:public basel,public base2 public: derive
18、d( )cout“3“; ; void main( ) derived obj; coutendl; (分数:2.00)A.5B.3C.2 D.0解析:本题考查三目运算符“?:”。三目运算符的表达式为(表达式 1)?(表达式 2):(表达式 3),运算过程是当(表达式 1)的值为真时,求(表达式 2)的值为整个表达式的值;如果(表达式 1)的值为假,则求(表达式 3)的值为整个表达式的值。题中,表达式 x12 的结果为假,所以执行的语句是 x-12,最终结果应该是 0。4.以下哪个不是 C+语言中的有效标识符?(分数:2.00)A.34a B._ABC.A_BD.A25解析:本题考查 c+语言
19、标识符规则。在 C+语言中,标识符只能由数字,字母,下划线组成,并且第一个字符不能是数字。注意:选项 A)是以数字开始的。5.表达式 3.6-5/2+1.2+5%2 的值是_。 (分数:2.00)A.4.3B.4.8C.3.3D.3.8 解析:此题考核的是算术运算符的运算规则,算术运算符的结合方向为“自左至右”,先按运算符的优先 级别高低次序执行,同时在 C 中两个整数相除或求余数其结果依旧为整数。计算后结果为 3.8。6.函数 fun 的返回值是( )。 fun(char*a,char*b) intnum=0,n=0; while(*(a+num)!=/0)num+; while(bn)*(
20、a+num)=bn;num+;n+; returnnum; (分数:2.00)A.j=i;B.j=(long)i;C.i=(int)j;D.i=j; 解析:+,-运算符不能用于常量表达式。7.对于模板定义关键字 class 和 typename 说法不正确的是( )。(分数:2.00)A.每次调用此过程,该过程中的局部变量都会被重新初始化B.在本过程中使用到的,在其他过程中定义的变量也为 Statci 型C.每次调用此过程时,该过程中的局部变量的值保持在上一次调用后的值 D.定义了该过程中定义的局部变量为“自动“变量解析:Style 属性用来决定控件类型及列表框部分行为,其值取 0,1,2。
21、0-Dropdown Combo Box:此时组合框称为“下拉式组合框”,看上去像一个下拉列表框,但是可以输入文本或从下拉列表框中选择表项。 1-Simple Combo Box:此时组合框称为“简单组合框”,它由一个文本编辑区和一个标准列表框组成。 2-Dropdown List Box:此时组合框称为“下拉式列表框”,它的外观和下拉式组合框一样,右端也有一个箭头,可供“拉下”或“收起”列表框,可以从下拉列表框选择表项,也可以键入表项的文本作选择,但不接收其他文本输入。 8.有以下程序 #includeiostreamh float fun(int x,int y) return(x+y);
22、 void main( ) int a=2,b=5,c=8; tout fun( (int)fun(a+c,B) ,a-C) ; 程序运行后的输出结果是( )。 (分数:2.00)A.编译出错B.9 C.21D.9解析:本题的运算过程是 fun( (int) fun(a + c,B) ,a-C) ,fun( (int)fun (10,5),2-8),fun( (int)15000000,-6),fun(15,-6)=9。9.下列对于线性链表的描述中正确的是_。 (分数:2.00)A.存储空间不一定是连续,且各元素的存储顺序是任意的 B.存储空间不一定是连续,且前件元素一定存储在后件元素的前面C
23、.存储空间必须连续,且前件元素一定存储在后件元素的前面D.存储空间必须连续,且各元素的存储顺序是任意的解析:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间 的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。10.若已定义: inta=0,1,2,3,4,5,6,7,8,9,*p=a,i; 其中 0i9,则对 a数组元素不正确的引用是( )。 (分数:2.00)A.intB.doubleC.float D.不确定解析:本题中,首先将 0 赋给 k,表达式变为 0,跳出循环,没有执行循环体语句。解答本题的关键是掌握 while 语句。11.下
24、面程序的运行结果为( )。 # include iostreamh class A public: A( ) cout “1“; A( ) cout “2“; ; class B:public A public: B( ) cout “3“; B ( ) cout “4“; ; void main ( ) B b; (分数:2.00)A.F10 B.F4C.F5D.Ctrl解析:对于 template Tadd(T x,T y) return x + y; 调用时町以省略模板实参的声明,但是要求x 和 y 的数据类型必须是一样的。 12.关于友元的概念错误的是( )。(分数:2.00)A.If
25、 x=y Then z=x:z=y B.If x=y Then z=x Else z=yC.z=y:If x=y Then z=xD.If x=n;i-)ai+1=ai; main() int i,aN=1,2,3,4,5,6,7,8,9,10; fun(a,2,9); for(i=0;iA.10234B.12344C.12334 D.12234解析:本题函数 fun 的作用是将指定的数组元素(从下标 n 到下标 m)向后移一位。由函数调用“fun(a,2,9);”可知,函数 fun 用于将 a2 到 a9的各元素依次向后移一位,移完后,a 数组中各元素的值分别为 1,2,3,3,4,5,6,
26、7,8,9,10,故输出的前 5 个数组元素为 12334。16.C+语言中关于构造函数的说法正确的是( )。(分数:2.00)A.构造函数的函数名不必和类名相同B.构造函数只能每一个C.每个类必定有构造函数 D.构造函数必有返回值解析:本题考查构造函数的概念。构造函数的函数名必须和类名相同;构造函数可以有一个,也可以有多个;构造函数没有返回值。17.语句 ofstreamf(“SALARY.DAT”,ios_base:app)的功能是建立流对象 f,并试图打开文件SALARY.DAT 与 f 关联,而且_。(分数:2.00)A.若文件存在,将其置为空文件;若文件不存在,打开失败B.若文件存在
27、,将文件指针定位于文件尾;若文件不存在,建立一个新文件C.若文件存在,将文件指针定位于文件首;若文件不存在,打开失败D.若文件存在,打开失败;若文件不存在,建立一个新文件解析:18.有如下程序 #includeiostreamh voidmain( ) charch25=“6937“,“8254“,*p2; inti,j,s=0; for(i=0;i2;i+)pi=chi; for(i=0;i2;i+) for(j=0;pij,/0,;j+=2) s=10*s+pij-0; coutS; 该程序的输出结果是( )。 (分数:2.00)A.69825B.63825C.6385 D.693825解
28、析:该题主要要搞清楚以下几点: 定义了一个指针数组 char * P2后,程序中第一个循环 for(i=0;i/0是指 Pij中的字符只要不是字符串结束标 志/0,就继续循环,语句 j+ =2;是使下标 j 每次增加 2,也即一个隔一个地从 pi所指向 的字符串中取出字符。经过上述解析后,不难看出,该程序首先从 P0所指向的字符串 “6937”中一个隔一个地取出字符,分别是“6”和“3”,然后从p1所指向的字符串 “8254”中一个隔一个地取出字符,分别是“8”和“5”,同时经过转换和相加运算后,结果 s 中的值应该是 6385。 19.以下选项中不能作为合法常量的是_。 (分数:2.00)A
29、.12340B.1.234e0.4 C.12340D.1.234解析:指数形式的实型常量要求字母 e(或 E)之前必需有数字,且 e 后面的指数必须为整数,所以本题中 选项 B 非法。20.以下语句或语句组中,能正确进行字符串赋值的是_。 (分数:2.00)A.char *sp;*sp=“right!“;B.char s10;s=“right!“;C.char s10;*s=“right!“;D.char *sp=“right!“; 解析: 选项 A 定义了字符型的指针变量 sp,则*sp 存储的是第一个字符,而给它赋的是字符串,故错;选项 B 表示代表数组的首地址,而题中给它赋的是字符串,所
30、以错误;选项 C 定义了一个字符型的数组 s10,再通过*s 给数组元素赋初值,这时是与选项 A 相同的错误。21.下面程序的结果是( )。 #includeiostreamh class A int a; public: A( ):a(1) void showa( ) cout a; ; class B int a; public: B( ):a(2) void showa( ) cout a; ; class C:public A,public B int a; public: C( ):a(3) void showa( ) cout a; ; void main( ) C c; csho
31、wa( ); (分数:2.00)A.将 private int m 改为 protected int mB.将 private int m 改为 public int mC.将 private int m 改为 static i D.将 private int m 改为 int m解析:复选框 Checkbox 用 ItemListener 来监听 ItemEvent 事件,当复选框状态改变时用getStateChange()获取其当前状态,使用 getItem()获得被修改复选框的字符串对象。 22.设变量 a 是 int 型,f 是 double 型,i 是 float 型,则表达式 10
32、 + a + i * f 值的数据类型是( )。(分数:2.00)A.intB.floatC.double D.不确定解析:根据混合运算规则,如果有一个数据是 double 型,则其他数据类型先转化为 double 型,运算的结果最终也是 double 型。为保证精度的不丢失,表达式的数据类型是变量和常量中精确度最高的变量类型。23.下列选项中不属于结构化程序设计方法的是_。 (分数:2.00)A.自顶向下B.逐步求精C.模块化D.可复用 解析: 20 世纪 70 年代以来,提出了许多软件设计方法,主要有逐步求精:对复杂的问题,应设计一些 子目标作过渡,逐步细化;自顶向下:程序设计时应先考虑总
33、体,后考虑细节;先考虑全局目标,后考 虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化;模 块化:一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为分目标, 再进一步分解为具体的小目标,把每个小目标称为一个模块,而可复用是面向对象程序设计的一个优点。24.设变量已正确定义,则以下能正确计算 f=n!的程序段是_。 (分数:2.00)A.f=0; for(i=1;i1;i+) f*=i;D.f=1; for(i=n;i=2;i-) f*=i; 解析:n!=n*(n-1)*2*1,由于选项 A 中 f 的初值为 0,所以循环 n 次
34、后,f 值依然为 0,故选项 A 错误; 选项 B 中循环的终止条件是“i1 时,由于初值“i=n”是符合条件“i1”的,且增量为+1,故循环中永远不会出 现不满足条件“i1”的值,所以出现死循环。25.下列程序的运行结果为( )。 #includeiostreamh void main( ) int a=2; int b=a+1; cout a/b endl; (分数:2.00)A.实体完整性B.域完整性 C.参照完整性D.以上各项都需要定义解析:随机文件流提供了访问文件中任意一段位置。如果是一个比较大的文件,我们采用略去前面不必要的内容,直接去读取需要的内容,随机文件流提供了这样的方法,这
35、样会有很多的时间和资源。所以我们用 Random Stream 来访问这个文件。在 Random Stream 中有一个方法 public int skipBytes(int n)throws IOException,随机文件访问跳过指定的字节。这个方法比较有用,在本题的情况下,用它比较快捷的读取必要的内容。 26.若有以下说明和定义 union dt int a;char b;double c;data; 以下叙述中错误的是_。 (分数:2.00)A.data 的每个成员起始地址都相同B.变量 data 所占的内存字节数与成员 c 所占字节数相等C.程序段 data.a=5;printf(“
36、%f/n“,data.;输出结果为 5.000000 D.data 可以作为函数的实参解析: union 是表示共用体的关键字,成员 a,b,c 共占用同一个内存空间, data 的每个成员起始地址都相 同;共用体变量所占的内存长度等于最长的成员的长度,故变量 data 所占的内存字节数与成员 c 所占字节 数相等;执行“data.a=5;printf(“%f/n“,data.c);” printf 函数只是将内存中的数据以不同的类型输出,而不能将 内存中的整型数据自动转换为等值的浮点数,故 C 是错误的。27.下面程序段的运行结果是( )。 voidmain( ) ihtt,a,b,C; a
37、=1;b=2;C=2; while(abc) t=a;a=b;b=t;c-; couta“,“b“,“C; (分数:2.00)A.8 B.9C.7D.6解析:本题考查的是 DOLoopUntil,结构的循环语句,不管满不满足条件,都要先执行一次。经分析当I7(或 8 或 9)都满足执行三次的条件,但题目要求最小的,所以应该是 7。28.下面关于数组的初始化正确的是( )。(分数:2.00)A.char str :a,b,c B.char str2=a,b,cC.char str23=a,b,c,d,e,fD.char str( )=a,b,c解析:本题考查的是字符数组的初始化。选项 B)中用
38、3 个元素初始化大小为 2 的数组,越界了;选项 C)中应该是 2 行 3 列的数组,题中使用 3 行 2 列初始化;选项 D)中数组合后应用方括号。29.有如下程序 #include #include using namespace std; class MyClass public: MyClass()cout=0) printf(“%c“,sn-); 当编译连接通过后,运行程序 T18 时,输入 Thank!则输出结果是: 5。 (分数:2.00)填空项 1:_ (正确答案:!knahT)解析:本题考核的知识点是“文件包含”处理功能,“文件包含”处理是指一个源文件可以将另外一个源 文件的
39、全部内容包含进来,供源文件使用。此题中“myfun.c“就是被包含在 T18.c 下进行编译。myfun.c 文件 是用来实现字符串反序的功能,用 getchar-|_|-函数输入字符并赋给数组 s,每输入一个字符,数组下标 n 自行加 1,直到遇到回车键时输入结束。while(n=0)下的条件语句就是来实现字符串反续功能的。46.派生类构造函数的执行顺序是先执行 1 的构造函数,然后执行成员对象的构造 函数,最后执行 2 的构造函数。 (分数:2.00)填空项 1:_ (正确答案:基类)解析:本题主要考查的是派生类构造函数的执行顺序,在 C+语言中构造函数的执行顺序是先基类后派生类,而析构函
40、数的执行顺序正好相反,是先调用派生类后调用基类。 47.派生类构造函数的执行顺序是先执行 1 的构造函数,然后执行成员对象的构造 函数,最后执行 2 的构造函数。 (分数:2.00)填空项 1:_ (正确答案:基类)解析:本题主要考查的是派生类构造函数的执行顺序,在 C+语言中构造函数的执行顺序是先基类后派生类,而析构函数的执行顺序正好相反,是先调用派生类后调用基类。 48.构造函数是和 1 同名的函数。(分数:2.00)填空项 1:_ (正确答案:类)解析:C+语言中的构造函数就是在类中定义的和类名一样的函数。49.类 test 的析构函数是 1。(分数:2.00)填空项 1:_ (正确答案:test-|_|-;)解析:C+语言中虚构函数在每个类中只有一个,其函数的写法是在构造函数的前面加一个“”字符。 50.程序 #include“ iostreamh“ void main1 int i=10; jnt j=5; cout j+i+ end1; 的结果为 2 (分数:2.00)填空项 1:_ (正确答案:15)解析:i+为先做与 i 有关的运算后,i 自加 1,而+i 是先给 i 加 1 再进行与 i 有关的操作