计算机二级《C++》考试试题及答案_第1页
计算机二级《C++》考试试题及答案_第2页
计算机二级《C++》考试试题及答案_第3页
计算机二级《C++》考试试题及答案_第4页
计算机二级《C++》考试试题及答案_第5页
已阅读5页,还剩37页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机二级《C++》考试试题及答案一、选择题(每题1分,共40分)下列各题的四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡对应位置。1.下列关于栈的叙述中正确的是()A.栈顶元素最先被删除B.栈顶元素最后被删除C.栈底元素永远不能被删除D.以上三种说法都不对2.下列叙述中正确的是()A.有一个以上根节点的数据结构不一定是非线性结构B.只有一个根节点的数据结构不一定是线性结构C.循环链表是非线性结构D.双向链表是非线性结构3.某二叉树共有7个节点,其中叶子节点只有1个,则该二叉树的深度为(假设根节点在第1层)()A.3B.4C.6D.74.在软件开发中,需求分析阶段产生的主要文档是()A.软件集成测试计划B.软件详细设计说明书C.用户手册D.软件需求规格说明书5.结构化程序所要求的基本结构不包括()A.顺序结构B.GOTO跳转C.选择(分支)结构D.重复(循环)结构6.下面描述中错误的是()A.系统总体结构图支持软件系统的详细设计B.软件设计是将软件需求转换为软件表示的过程C.数据结构与数据库设计是软件设计的任务之一D.PAD图是软件详细设计的表示工具7.负责数据库中查询操作的数据库语言是()A.数据定义语言B.数据管理语言C.数据操纵语言D.数据控制语言8.一个教师可讲授多门课程,一门课程可由多个教师讲授,则实体教师和课程间的联系是()A.1:1联系B.1:m联系C.m:1联系D.m:n联系9.有三个关系R、S和T:R包含属性A、B、C,元组为(a,1,2)、(b,2,1)、(c,3,1);S包含属性A、B、C,元组为(c,3,1);T包含属性A、B、C,元组为(a,1,2)、(b,2,1)。则由R和S得到T的关系运算是()A.自然连接B.差C.交D.并10.定义无符号整数类为UInt,下面可以作为类UInt实例化值的是()A.-369B.369C.0.369D.整数集合{1,2,3,4,5}11.下列关于C++与C语言关系的描述中,正确的是()A.C++是C语言的一个子集B.C++与C语言都是面向对象的程序设计语言C.C++对C语言进行了扩充,增加了面向对象机制D.C++能够兼容C语言的所有语法,不存在任何语法差异12.在C++程序中,独立编译的基本单位是()A.函数B.语句C.源程序文件D.类13.下列标识符中,合法的C++用户标识符是()A.2varB.var-1C._var123D.class14.若有定义语句:inta=10;doubleb=3.14;则表达式a+b+'a'的值的数据类型是()A.intB.doubleC.charD.float15.执行语句序列:inti=0;while(i++<3);循环结束后,i的值是()A.2B.3C.4D.516.下列关于switch语句的描述中,错误的是()A.switch语句中,case子句的语句序列中必须包含break语句B.switch语句中,每个case子句的常量表达式的值必须互不相同C.switch语句中,default子句可以省略D.switch语句的表达式可以是整型、字符型或枚举型17.若有定义:intarr[10]={0,1,2,3,4,5};下列对数组元素的引用中,错误的是()A.arr[0]B.arr[5]C.arr[10]D.arr[arr[2]]18.下列关于指针操作的描述中,错误的是()A.两个同类型的指针可以进行相等性比较B.可以用空指针给指针变量赋值C.指针变量加上一个整数n表示指针向后移动n个基类型存储单元,移动的字节数为n乘以基类型的字节长度D.两个同类型的指针可以进行加法运算19.若有定义:inta=5;int&ref=a;下列关于引用的描述中,正确的是()A.ref是一个指针变量,存储a的地址B.语句int&ref2=ref;是非法操作,不能给引用建立引用C.ref和a占用同一块内存单元D.修改ref的值不会影响a的值20.下列函数参数传递方式中,不会生成实参副本、能够直接操作实参本身的是()A.值传递B.指针传递C.引用传递D.常量值传递21.下列关于内联函数的描述中,正确的是()A.内联函数在运行时将函数体代码嵌入到每个调用点B.内联函数体内如果包含循环语句和switch语句,编译器会忽略inline关键字,将其按普通函数处理C.内联函数必须在类体外定义D.内联函数必须显式使用inline关键字声明,类内定义的成员函数默认不是内联函数22.函数重载的核心判定依据是()A.两个或两个以上的函数取相同的函数名,但形参的个数或类型不同B.两个或两个以上的函数取相同的名字和相同的参数个数,但返回值类型不同C.两个或两个以上的函数名字不同,但形参的个数或类型相同D.两个或两个以上的函数名字、参数都相同,只是函数体实现不同23.若有函数声明:voidfunc(int=10,double=2.5,char='a');则下列函数调用中错误的是()A.func()B.func(20)C.func(20,,'b')D.func(20,3.5,'b')24.下列关于类和对象的描述中,错误的是()A.类是对一类对象共性的抽象,对象是类的具体实例B.类的成员访问权限有private、protected、public三种C.类的私有成员只能被类的成员函数访问,任何类外函数都没有访问权限D.类可以看作是一种用户自定义的数据类型25.若定义了一个类MyClass,下列关于构造函数的描述中,正确的是()A.构造函数必须带有参数B.构造函数可以声明返回值类型为voidC.构造函数在创建对象时由系统自动调用D.一个类只能定义一个构造函数26.下列关于析构函数的描述中,错误的是()A.析构函数的名字是类名前加波浪号~B.析构函数没有参数,也没有返回值C.一个类只能定义一个析构函数D.析构函数必须由用户显式调用,系统不会自动调用27.若有类定义:classTest{private:staticintcount;public:Test(){count++;}~Test(){count--;}staticintgetCount(){returncount;}};intTest::count=0;下列说法中正确的是()A.count是每个对象独立拥有的成员变量B.getCount()函数只能通过对象名调用,不能通过类名调用C.创建3个Test对象后,调用Test::getCount()的返回值是3D.count变量的初始化是在构造函数中完成的28.下列关于this指针的描述中,正确的是()A.this指针是类的成员变量,存储当前对象的地址B.this指针是const类型的指针,指向调用成员函数的当前对象C.静态成员函数中也存在隐含的this指针D.this指针需要用户显式定义才能使用29.C++中引入友元机制的主要目的是()A.提高程序的运行效率B.实现数据的隐藏性C.加强类的封装性D.增加成员函数的种类30.下列关于继承方式的描述中,错误的是()A.公有继承时,基类的公有成员在派生类中仍然是公有成员B.保护继承时,基类的公有成员在派生类中是保护成员C.私有继承时,基类的保护成员在派生类中是私有成员D.无论是哪种继承方式,基类的私有成员在派生类中都可以直接访问31.在多继承结构中,如果两个基类定义了同名成员,派生类直接访问该成员时会产生二义性,解决该二义性的正确方法是()A.使用虚基类B.使用类名限定符明确指定成员所属的基类C.使用重名隐藏机制D.无法解决,必须修改基类的成员名称32.下列关于虚基类的描述中,正确的是()A.虚基类的构造函数由继承层次中的最远派生类负责调用B.设置虚基类的目的是实现运行时多态C.虚基类的声明必须在派生类的实现部分完成D.虚基类的子对象初始化顺序与继承时的声明顺序无关33.C++中实现运行时多态的核心机制是()A.函数重载B.运算符重载C.虚函数与动态绑定D.模板34.下列关于虚函数的描述中,正确的是()A.虚函数可以是静态成员函数B.虚函数可以是友元函数C.基类中用virtual声明的虚函数,在派生类中重定义时即使省略virtual关键字,该函数仍然是虚函数D.构造函数可以声明为虚函数35.若有类定义:classShape{public:virtualdoublearea()=0;};下列描述中错误的是()A.Shape是一个抽象类B.程序中可以定义Shape类的实例对象C.Shape类中的area函数是纯虚函数D.如果派生类没有重写area函数,该派生类仍然是抽象类36.下列关于运算符重载的描述中,正确的是()A.运算符重载可以改变运算符的原有优先级B.运算符重载可以改变运算符的操作数个数C.运算符重载不能改变运算符的语法结构和语义规则D.所有C++内置运算符都可以被重载37.下列关于函数模板的描述中,错误的是()A.函数模板的实例化是由编译器在函数调用时根据实参类型自动完成的B.函数模板中可以声明多个类型参数C.函数模板的类型参数可以使用class或typename关键字声明D.当函数模板与同名普通函数同时存在时,编译器会优先匹配函数模板实例38.C++标准库中,用于标准输出的流对象cout所属的类是()A.istreamB.ostreamC.ifstreamD.ofstream39.若要向一个已经存在的文本文件末尾追加写入内容,打开文件时应使用的打开模式是()A.ios::inB.ios::outC.ios::appD.ios::trunc40.下列关于C++异常处理机制的描述中,错误的是()A.异常处理的核心关键字包括try、catch、throwB.一个try块后面可以跟多个catch块用于捕获不同类型的异常C.throw语句抛出的异常类型必须是基本数据类型,不能是类对象D.catch块的参数列表可以使用省略号(...),表示捕获任意类型的异常选择题参考答案及解析1.答案:A。解析:栈是限定仅在栈顶进行插入和删除操作的线性表,遵循“先进后出”的规则,因此栈顶元素是最后入栈、最先被删除的元素;栈底元素在栈空时可以被删除,不存在永远不能删除的规则。2.答案:B。解析:线性结构的要求是有且只有一个根节点,且每个节点最多有一个前驱、一个后继。二叉树虽然只有一个根节点,但节点可以有两个后继,属于非线性结构;循环链表、双向链表都符合线性结构的定义,属于线性结构;存在多个根节点的数据结构一定是非线性结构。3.答案:D。解析:根据二叉树的性质,度为0的叶子节点个数总比度为2的节点个数多1。本题中叶子节点共1个,说明度为2的节点个数为0,即整棵树的所有节点都只有一个子节点,形成深度为7的单支树。4.答案:D。解析:需求分析阶段的核心交付物是软件需求规格说明书,详细设计说明书是软件设计阶段的产物,集成测试计划是测试阶段的文档,用户手册是软件交付阶段随产品提供的文档。5.答案:B。解析:结构化程序设计的三种基本控制结构是顺序结构、选择结构、循环结构,GOTO跳转语句会破坏程序的结构化逻辑,不属于基本结构,在结构化程序设计中被限制使用。6.答案:A。解析:系统总体结构图是软件概要设计阶段的工具,用于描述系统的模块划分和层次结构,不支持详细设计;PAD图是详细设计阶段的图形化工具,软件设计的核心目标是将需求转换为可实现的软件表示,数据结构与数据库设计是软件设计的核心任务之一。7.答案:C。解析:数据库语言分为三类:数据定义语言(DDL)用于定义数据库的结构,数据操纵语言(DML)用于完成数据的增删改查操作,数据控制语言(DCL)用于权限管理和事务控制。8.答案:D。解析:一个教师可以对应多门课程,一门课程也可以对应多个教师,两个实体集之间存在多对多(m:n)的联系。9.答案:B。解析:关系的差运算R-S的结果是由属于R但不属于S的元组组成的集合,本题中R的元组(a,1,2)、(b,2,1)不在S中,(c,3,1)在S中,差运算结果恰好为T。自然连接是根据公共属性拼接元组,交运算的结果是两个关系共有的元组,并运算的结果是两个关系所有元组的去重集合,均不符合T的结构。10.答案:B。解析:无符号整数类的实例必须是无符号的整数值,-369是负数、0.369是小数、整数集合是复合类型,都不符合无符号整数的定义。11.答案:C。解析:C语言是C++的子集,C++兼容C语言的大部分语法,但存在部分语法差异(例如C++新增的关键字在C语言中可以作为标识符使用);C语言是纯面向过程的语言,C++同时支持面向过程和面向对象的程序设计,在C语言基础上扩充了面向对象、模板、异常处理等机制。12.答案:C。解析:C++采用分离编译模式,每个源程序文件作为独立的编译单位被编译为目标文件,最后通过链接器将所有目标文件链接为可执行程序。13.答案:C。解析:C++标识符的命名规则是:由字母、数字、下划线组成,不能以数字开头,不能与关键字重名。选项A以数字开头,选项B包含非法字符“-”,选项D是关键字class,均不合法。14.答案:B。解析:C++算术运算中会进行隐式类型转换,低类型数据向高类型数据转换:char类型会转换为int类型,int类型与double类型运算时会转换为double类型,最终表达式的结果类型为double。15.答案:C。解析:后置自增运算符i++的执行规则是先返回i的当前值参与表达式运算,再将i的值加1。循环执行过程中,当i=3时,判断i<3为假,但仍会完成自增操作将i变为4后退出循环。16.答案:A。解析:switch语句的case子句后不是必须包含break语句,如果省略break,程序会顺序执行后续case子句的语句;case后的常量表达式值必须唯一,default子句可以省略,switch的表达式只能是整型、字符型、枚举型等离散类型。17.答案:C。解析:长度为10的数组arr的合法下标范围是0到9,arr[10]属于下标越界访问,会引发未定义行为。18.答案:D。解析:两个同类型指针进行加法运算没有实际的语义意义,属于非法操作;指针可以进行相等比较、与空指针赋值、与整数进行偏移运算,这些操作都是合法的。19.答案:C。解析:引用是变量的别名,与原变量占用同一块内存单元,对引用的操作就是对原变量的操作;引用本身不是指针变量,也可以为引用建立引用(本质上是原变量的另一个别名)。20.答案:C。解析:值传递(包括指针传递)会在函数栈帧中生成实参的副本,函数内操作的是副本,无法直接修改实参本身;引用传递不会生成副本,函数内的形参是实参的别名,可以直接操作实参。21.答案:B。解析:内联函数是在编译阶段将函数体嵌入调用点,不是运行时;内联函数适合逻辑简单的小函数,如果包含循环、switch等复杂结构,编译器不会进行内联展开;类内定义的成员函数默认是内联函数,无需显式声明inline。22.答案:A。解析:函数重载要求函数名相同,但形参列表(参数个数、类型、顺序)不同,重载与函数的返回值类型无关。23.答案:C。解析:带默认参数的函数调用时,必须从左向右依次传递实参,不能跳过中间的参数直接给右侧参数传值,因此func(20,,'b')存在语法错误。24.答案:C。解析:类的私有成员可以被类的友元函数、友元类访问,并非完全禁止类外访问。25.答案:C。解析:构造函数在对象创建时由系统自动调用,可以无参(默认构造函数),没有返回值,可以重载多个构造函数实现不同方式的对象初始化。26.答案:D。解析:析构函数在对象生命周期结束时由系统自动调用,不需要用户显式调用;析构函数名是类名前加~,无参数无返回值,一个类只能有一个析构函数。27.答案:C。解析:静态成员count属于类本身,由所有对象共享,在类外进行初始化;静态成员函数可以直接通过类名调用,不需要依赖具体对象;每创建一个对象count加1,创建3个对象后count值为3。28.答案:B。解析:this指针是成员函数的隐含形参,不是类的成员变量,是指向当前对象的const指针,不需要用户显式定义;静态成员函数不依赖具体对象,因此没有this指针。29.答案:A。解析:友元机制允许授权的函数或类直接访问当前类的私有成员,减少了函数调用和类型检查的开销,提高程序运行效率,但会一定程度上破坏类的封装性。30.答案:D。解析:无论采用哪种继承方式,基类的私有成员在派生类中都不能直接访问,只能通过基类提供的公有或保护成员函数访问。31.答案:B。解析:多继承中同名成员的二义性问题可以通过类名限定符明确指定成员所属的基类来解决;虚基类用于解决多继承时共同基类产生多份拷贝的问题,不能解决同名成员的二义性。32.答案:A。解析:为了保证虚基类子对象在派生类中只有一份拷贝,虚基类的构造函数由继承层次中最远端的派生类负责调用;设置虚基类的目的是消除多份拷贝,不是实现多态;虚基类的声明是在继承方式前加virtual关键字,虚基类子对象的初始化顺序优先于非虚基类。33.答案:C。解析:函数重载、运算符重载、模板都是编译时多态(静态多态),虚函数通过动态绑定机制实现运行时多态。34.答案:C。解析:虚函数不能是静态成员函数、友元函数,构造函数不能声明为虚函数;基类中声明的虚函数,派生类重定义时即使省略virtual,该函数仍然保持虚函数特性。35.答案:B。解析:包含纯虚函数的类是抽象类,抽象类不能实例化对象;派生类如果不实现纯虚函数,该派生类仍然是抽象类。36.答案:C。解析:运算符重载不能改变运算符的优先级、结合性、操作数个数和语法规则;部分运算符(如.、::、?:、sizeof等)不能被重载。37.答案:D。解析:当函数模板与同名普通函数同时存在时,编译器会优先匹配普通函数,只有当普通函数无法匹配时才会考虑函数模板的实例。38.答案:B。解析:cout是标准输出流对象,属于ostream类;cin是标准输入流对象,属于istream类;ifstream是文件输入流类,ofstream是文件输出流类。39.答案:C。解析:ios::app模式表示以追加方式打开文件,写入的内容会添加到文件末尾;ios::in是读模式,ios::out是写模式,ios::trunc模式会截断文件原有内容。40.答案:C。解析:C++异常处理中,throw可以抛出任意类型的异常,包括基本数据类型、类对象、指针等。二、基本操作题(18分)请在指定开发环境中打开对应工程文件,工程中定义了表示学生信息的Student类,功能是计算3名学生3门课程的平均成绩,输出平均成绩最高的学生信息。程序中存在3处位于/found/标注下的语法错误,请改正错误使程序运行结果正确。注意:不得改动程序的其他内容,不得删除或修改found标注。存在错误的源程序代码如下:usingnamespacestd;classStudent{private:charname[20];doublescores[3];doubleavg;public:/found/Student(charn[],doubles[]){name=n;scores=s;calcAvg();}/found/voidcalcAvg()const{doublesum=0;for(inti=0;i<3;i++)sum+=scores[i];avg=sum/3;}doublegetAvg()const{returnavg;}voidshow()const{cout<<"姓名:"<<name<<",平均成绩:"<<avg<<endl;}};intmain(){doubles1[3]={85,90,92},s2[3]={88,79,95},s3[3]={92,93,90};Studentst1("张三",s1),st2("李四",s2),st3("王五",s3);/found/Studenttop;if(st2.getAvg()>top.getAvg())top=st2;if(st3.getAvg()>top.getAvg())top=st3;cout<<"成绩最高的学生信息:"<<endl;top.show();return0;}参考答案及评分标准:本题共3处错误,每改正一处得6分,共18分,改动非标注位置的内容不得分。1.第一处错误:构造函数中对数组的直接赋值非法。数组名是常量指针,不能作为左值被直接赋值。改正后的构造函数代码为:Student(charn[],doubles[]){strcpy(name,n);for(inti=0;i<3;i++)scores[i]=s[i];calcAvg();}2.第二处错误:calcAvg函数被错误声明为const成员函数。const成员函数承诺不修改对象的成员变量,但calcAvg函数需要给成员变量avg赋值,因此必须去掉const修饰符,改正为:voidcalcAvg(){/*函数体保持不变*/}3.第三处错误:定义top对象时调用了不存在的默认构造函数。由于类中已经定义了带参数的构造函数,编译器不会自动生成无参默认构造函数,结合程序逻辑,top用于存储成绩最高的学生,初始值应为第一个学生st1,改正为:Studenttop=st1;改正后程序的正确输出为:成绩最高的学生信息:姓名:王五,平均成绩:91.6667。本题考查类构造函数的使用规则、const成员函数的访问限制、默认构造函数的生成条件,是二级考试中基本操作题的高频考点,改错时需要严格遵循C++语法规则,不能改变程序的原有逻辑。三、简单应用题(24分)请在指定开发环境中打开对应工程文件,工程中定义了整型顺序表类SeqList,请编写成员函数intremoveAll(intx),实现功能:删除顺序表中所有值等于x的元素,返回被删除元素的个数,删除后剩余元素的相对顺序保持不变。注意:不得改动已有代码,仅在//*begin*和//*end*之间补充代码。已有的代码框架如下:usingnamespacestd;constintMAXSIZE=100;classSeqList{private:intdata[MAXSIZE];intlength;public:SeqList(inta[],intn){for(inti=0;i<n;i++)data[i]=a[i];length=n;}voidshow()const{for(inti=0;i<length;i++)cout<<data[i]<<"";cout<<endl;}intremoveAll(intx);};intSeqList::removeAll(intx){//*begin*//*end*}intmain(){intarr[]={2,5,3,5,7,5,9,5};SeqListlist(arr,8);cout<<"删除前顺序表:";list.show();intdelCount=list.removeAll(5);cout<<"删除的元素个数:"<<delCount<<endl;cout<<"删除后顺序表:";list.show();return0;}参考答案及评分标准:本题总分24分,其中算法逻辑正确18分,返回值正确3分,边界情况处理正确3分。最优实现采用双指针(快慢指针)法,时间复杂度O(n),空间复杂度O(1),参考代码如下:intk=0;//慢指针,记录保留元素的存储位置intcount=0;//记录删除的元素个数for(inti=0;i<length;i++){//快指针遍历所有元素if(data[i]!=x){data[k++]=data[i];//非删除元素移动到慢指针位置}else{count++;}}length=k;//更新顺序表的有效长度returncount;程序正确运行时,输出删除的元素个数为4,删除后顺序表为2379。若采用“逐个查找目标元素、逐个将后续元素前移”的实现方式,逻辑正确也可得分,但该方法时间复杂度为O(n²),算法效率较低,酌情扣3分。编写代码时需要覆盖所有边界情况:当顺序表中不存在值为x的元素时,函数返回0且顺序表内容不变;当顺序表中所有元素均为x时,函数返回原顺序表长度,删除后顺序表长度置0。双指针法无需额外判断即可自然处理上述边界情况,是线性表删除操作的经典实现方案。四、综合应用题(18分)请在指定开发环境中打开对应工程文件,工程中定义了三维点类Point3D,需要补充实现三部分功能:一是带默认参数的构造函数,三个坐标参数的默认值均为0;二是重载加法运算符“+”,实现两个三维点的对应坐标分量相加;三是重载流插入运算符“<<”,按(x,y,z)的格

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论