1、计算机二级考试 C+模拟题一 2014 年及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(每小题 1 分,共 35 小题,共 35 分(总题数:35,分数:40.00)1.下列选项中不符合良好程序设汁风格的是( )。(分数:1.00)A.源程序要文档化B.数据说明的次序要规范化C.避免滥用 goto 语句D.模块设计要保证高耦合、高内聚2.有下列二叉树,对此二叉树中序遍历的结果是( )。 (分数:1.00)A.ABCDEFB.BDAECFC.ABDCEFD.ABCDFE3.对于长度为 n 的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是( )。(分数:1.00)
2、A.冒泡排序为 n2B.冒泡排序为 nC.快速排序为 nD.快速排序为 n(n-1)24.为了使模块尽可能独立,要求( )。(分数:1.00)A.模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强B.模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱C.模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱D.模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强5.在软件设计中,不属于过程设计工具的是( )。(分数:1.00)A.PDL(过程设计语言)B.PAD 图C.N-S 图D.DVD 图6.下列工具中为需求分析常用工具的是( )。(分数:1.00)A.PADB.PFDC.N-SD.DF
3、D7.下列是软件调试技术的是( )。(分数:1.00)A.错误推断B.集成测试C.回溯法D.边界值分析8.两个或两个以上模块之问联系的紧密程度称为( )。(分数:1.00)A.耦合性B.内聚性C.复杂性D.数据传输特性9.实体是信息世界中广泛使用的一个术语,它用于表示( )。(分数:1.00)A.有生命的事物B.无生命的事物C.实际存在的事物D.一切事物10.数据库系统的核心是( )。(分数:1.00)A.数据模型B.数据库管理系统C.数据库D.数据库管理员11.下面关于虚函数的描述中正确的是( )。(分数:1.00)A.虚函数是一个静态成员函数B.虚函数是一个非成员函数C.虚函数可以在函数说
4、明时定义,也可以在函数实现时定义D.派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型12.以下 for 语句中不是死循环的是( )。(分数:1.00)A.for(inti=0;i0;i);D.for(;);13.执行下列语句序列: inti=0;while(i=b)?ab; 下列对函数模板 Max( )的调用中错误的是( )。(分数:1.00)A.Max(35,45)B.Max(35,4)C.Max(35,45)D.Max(35,4)16.已知在一个类体中包含如下函数原型:VOLUMEOPERATOR-(VOLUME)const;,下列关于这个函数的叙述中,错误的是( )。(分数:1
5、.00)A.这是运算符一的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变类的任何数据成员的值17.下面说法正确的是( )。(分数:1.00)A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方C.类的内联函数必须在类体内定义D.类的内联函数必须在类体外通过加关键字 inline 定义18.静态成员函数没有( )。(分数:1.00)A.返回值B.this 指针C.指针参数D.返回类型19.执行下列语句后,输出结果为( )。 coutput(S); coutSetVariab
6、le(5)与语句 mySetVariable(5)等价24.有如下程序: #included usingnamespacestd; classTestClass private: intX,y; public: TestClass(inti,intj) x=i; y=j; voidprint() coutshow(); return0; 该程序运行后的打印结果是( )。(分数:1.00)A.5B.1C.0D.226.下面程序输出的结果为( )。 #include“iostreamh“ classA public: A()cOUt4)C.30lD.!(50;i);D.for(;);解析: 【解析
7、】本题考查循环语句 for 的使用。for 循环开始时,首先执行初始化操作,然后判断终止条件是否满足,如果满足,则执行循环体中的语句,最后执行迭代部分。完成一次循环后,重新判断终止条件。在 for 语句中,如果省略了终止条件判断部分,并且在语句中没有 break,或终止条件判断部分始终没有终止,都将出现死循环。13.执行下列语句序列: inti=0;while(i=b)?ab; 下列对函数模板 Max( )的调用中错误的是( )。(分数:1.00)A.Max(35,45)B.Max(35,4) C.Max(35,45)D.Max(35,4)解析: 【解析】引用模板函数和引用一般函数在语法形式上
8、没有任何区别。说明一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的形参。16.已知在一个类体中包含如下函数原型:VOLUMEOPERATOR-(VOLUME)const;,下列关于这个函数的叙述中,错误的是( )。(分数:1.00)A.这是运算符一的重载运算符函数B.这个函数所重载的运算符是一个一元运算符 C.这是一个成员函数D.这个函数不改变类的任何数据成员的值解析: 【解析】本题考核运算符的重载。题中语句为运算符一这是一个二元运算符,且是作为常成员函数来重载的,所以它不能更新对象的数据成员,也不能调用该类中没有用 const 修饰的成员
9、函数。17.下面说法正确的是( )。(分数:1.00)A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方 C.类的内联函数必须在类体内定义D.类的内联函数必须在类体外通过加关键字 inline 定义解析: 【解析】内联函数用 inline 修饰,用于取代 C 语言中的宏定义。inline 是建议机制而不是强制机制,也就是说,程序员可以指定任意函数为 inline 函数,但是编译器会根据系统情况来决定是否将其inline 处理。对于较大的函数,编译器往往会取消其 inline 特性。inline 函数的特点之一就是执行
10、速度快,其实质是在编译时将函数的目标代码插入到每个调用该函数的地方,从而没有出栈入栈、保护现场等开销,提高了效率。在类体内定义的成员函数,自动被编译器当做内联函数处理,在类体外定义的成员函数,如果用 inline 修饰,则编译器也认为是一种内联建议。18.静态成员函数没有( )。(分数:1.00)A.返回值B.this 指针 C.指针参数D.返回类型解析: 【解析】this 指针是系统隐含的用于指向当前对象的指针。由于静态函数是同类中所有对象都共享的函数,在内存中只存在一份,不属于某个对象所有,所以静态函数没有 this 指针。19.执行下列语句后,输出结果为( )。 coutput(S);
11、coutSetVariable(5)与语句 mySetVariable(5)等价 解析: 【解析】选项 A,语句 P=rny;是把对象 my 的地址值赋值给指针变量 P;选项 B,语句MyClass*P,my;中由于 P 只是一个指向对象的指针,因此定义指针 P 不调用构造函数,所以此语句只调用一次构造函数:对成员函数的引用可以通过两种形式:指针一成员函数(形参表),或者对象名成语函数名(形参表),故选项 C 错误,选项 D 正确。24.有如下程序: #included usingnamespacestd; classTestClass private: intX,y; public: Tes
12、tClass(inti,intj) x=i; y=j; voidprint() coutshow(); return0; 该程序运行后的打印结果是( )。(分数:1.00)A.5B.1C.0D.2 解析: 【解析】TestClass 为 TestClass1 的基类,在主函数 main 中定义 TestClass 对象b,*P。TestClass1 对象 d,P 指向 d,调用其 show 函数。“TestClass(inti):TestClass(i1),b(i)”语句中的 TestClass 基类参数为 2,所以 show 输出 2。26.下面程序输出的结果为( )。 #include“i
13、ostreamh“ classA public: A()cOUt4)C.30l D.!(58)(28)解析: 【解析】false 为逻辑常量,选项 A 为 1 小于 3 并且 5 小于 7,这个是真的;选项 B 是 2 不大于 4也为真;选项 D 是 5 大于 8 或者 2 小于 8,只要有一个为真,D 就为真,所以选项 D 也为真。选项 C 中“”为按位的与运算,3 和 0 按位与,然后再与 1,结果为假。34.所有在函数中定义的变量及函数的形式参数,都属于( )。(分数:1.00)A.全局变量B.局部变量 C.静态变量D.常量解析: 【解析】全局变量是在所有函数定义、类定义和程序块之外声明
14、的变量,局部变量是在某个函数定义、类定义或程序块之内声明的变量。用关键字 Static 声明的局部变量称为静态变量,故正确答案为B 项。35.有以下程序: #include usingnamespacestd; classR public: R(intr1,intr2) R1=r1; R2=r2; voidprint(); voidprint()const; private: intR1,R2; voidR:print() cout voidR:print()const cout intmain() Ra(5,4); constRb(20,52); bprint(); return0; 执行后
15、的输出结果是( )。(分数:1.00)A.5,4B.20,52 C.0,0D.4,5解析: 【解析】使用 const 关键字修饰的对象称为常对象,题中对象 b 被声明为类 R 的常对象。使用const 关键字说明的成员函数称为常成员函数,类 R 中用 const 重载了函数 print()。在使用常对象和常成员函数时应注意的是:const 是函数类型的一个组成部分,因此在常成员函数部分也要带 const 关键字;常成员函数不能更新对象的数据成员,也不能调用该类中没有用 const 修饰的成员函数;如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,不能调用其他的成员函数;cons
16、t 关键字可以参与区分重载函数。_解析:_解析:_解析:_解析:_解析:二、程序改错题(18 分)(总题数:1,分数:18.00)41.使用 VC60 打开考生文件夹下的源程序文件 1cpp,该程序运行时有错。请改正程序中的错误,使程序输出的结果为 100 37 32 注意:错误的语句在*error*的下面,修改该语句即可。 试题程序: #include *error* voidmain *error* intm=0142: *error* intn=0X27: intq=32; cout cout cout return; (分数:18.00)_正确答案:( (1)“voidmain()”。
17、 (2)“intm=0144;”。 (3)“intn=OX25;”或“intn=0x25;”。)解析: 【解析】本题主要考查了主函数定义及幂同进制之间的转换,包括十进制到八进制,十进制到十六进制。主函数定义的定义形式为“main()”,函数名之后必须是一对括号,因此第 1 处应改为“voidmain()”。cout 输出默认是以十进制方式输出的,根据题目要求输出的结果可发现变量的初值不正确,十进制的 100 对应八进制的 144,卡进制的 37 对应十六进制的 25,因此 2 和 3 应分别改成“intm=0144;”,“intn=025;”或“intn=025;”。三、简单应用题(24 分)
18、(总题数:1,分数:24.00)42.使用 VC60 打开考生文件夹下的源程序文件 2cpp。阅读下列函数说明和代码,补充空出的代码。函数 DecToBin(char*des,intn)的功能是将十进制数据 n 转换成二进制数据,并将转换结果存放在des 中。 例如:58 的二进制数据为 111010,则 DecToBin(char*des,58); cout 输出结果为:111010 注意:不能修改程序的其他部分,只能补充 DecToBin(char*des,intn)函数。 试题程序: #include #defineMAXLEN1024 voidDecToBin(char*des,int
19、n) voidmain() chardesMAXLEN; intn=58: DecToBin(des,n); cout return; (分数:24.00)_正确答案:( intj,i=0; chartemp; while(n!=0) desi=n20; n=n2: i: 转化结果为二进制最高位在 des 的下标最低处,顺序刚好相反 desi=NULL; for(j=0;j temp=desj;交换 desj=desi-1-i; desi-1-i=temp; )解析: 【解析】本题为将十进制数转换成二进制数,因此采用除 2 求余法,通过该方法最终可以将一个十进制数转换成一个只包含 1 和 0
20、的数组。除 2 求余法得到的是 0 和 1 的数值,不是“0”和“1”字符,还需将数字转化成字符,O 和 1 通过加上“0”的 ASCIl 码便可得到 0 和 1 的 ASCIl 码字符。因为除 2 求余法得到的字符数组是从低位到高位保存的,因此需要先倒序后再输出,可利用循环方式将顺序调转过来。四、综合应用题(18 分)(总题数:1,分数:18.00)43.使用 VC60 打开考生文件夹下的源程序文件 3cpp,其中定义了用于表示雇员的 Employee 类,但类 Em-ployee 的定义并不完整。请按要求完成下列操作,将类 TC 的定义补充完整。 (1)定义私有数据成员 name、stre
21、et、city、zipcode 和 age 分别用于表示姓名、街道、城市、邮编、年龄,除年龄是整型外,其余都是 char 型的数据。请在注释 1 之后添加适当的语句。 (2)完成默认构造函数 TC 的定义,使其把参数传递给私有数据成员 name、streel、city、zipcode 和 age。请在注释 2 之后添加适当的语句。 (3)完成成员函数 aherName(char*newName)的定义。请在注释 3 之后添加适当的语句。 (4)完成成员函数 IsEqual(char*ename)的定义,实现当 name 相等时返回真,否则返回假的功能。请在注释 4 之后添加适当的语句。 注意:
22、除在指定位置添加语句之外,请不要改动程序中的其他内容。 试题程序: #include #include #defineMAXLEN20 classTC private: *、* intage; public: TC(char*newName,char*newStreet,char* newCt,char*newZp,intnewAge); voidalterName(char*newName); voiddisplay(); boolIsEqual(char*ename); ; TC:TC(char*newName,char*newStreet,char* newCt,char*newZp,i
23、ntnewAge) *2* age=newAge; voidTC:alterName(char*newName) *3* boolTC:IsEqual(char*ename) *4* voidTC:display() cout cout voidmain(void) TCemployee4= TC(“张三“,“海淀区复兴路 l 号“,“北京“,“000001“,18), TC(“李四“,“海淀区复兴路 2 号“,“北京“,“000002“,19), TC(“王五“,“海淀区复兴路 3 号“,“北京“,“000003“,20), TC(“赵六“,“海淀区复兴路 4 号“,“北京“,“000004
24、“,21) ; for(inti=0;i“n 修改“李四“的名字为“李小四“n“ for(intj=0;j_正确答案:( (1)应添加“charnameMAXLEN,streetMAX-LEN,cityMAXLEN,zipcodeMAXLEN;”。 (2)应添加“strcpy(name,newName);strcpy(street,newStreet);strcpy(city,newCt);strcPy(zipeode,De-wZp);”。 (3)应添加“strcpy(name,newName);”。 (4)应添加“returnstrcmp(name,ename)=0;”。)解析: 【解析】本
25、题第 1 处要求补充类 TC 的私有数据成员 name、street、city、zipcode 和 age 的定义,分别用于表示姓名、街道、城市、邮编、年龄,除年龄是整型外,其余都是 char 型的数据,由主函数内的对象数组可知,name、street、city、zipcode 均为字符数组,故第 1 处应添加“charnameMAX-LEN,streetMAXLEN,cityMAXLEN,zipcodeMAXLEN;”。构造函数完成成员变量的初始化,这里需要给 name、street、city、zipeode 赋初值,可利用字符串拷贝函数将参数字符串复制到成员变量中,第 2 处应添加“str
26、cpy(name,newName);strcpy(street,newStreet);strcpy(city,newCt);strcpy(zipcode,newZp);”。函数 al-terName(char*newName)是改变成员变量name 的值,即将参数复制给 name,可利用字符串拷贝函数 strcpy 完成复制任务,故第 3 处应添加“strcpy(name,newName);”。IsEqual(char*ename)函数是比较 name 成员变量和参数 newName 是否相同,可使用字符串比较函数 strcmp,第 4 处应添加“returnstrcmp(name,ename)=0;”。