点击查看:2018年9月计算机二级C++考试冲刺提分题及答案汇总
1[简答题]定义内联函数实现求三个实数中的最大值。
参考解析:
解:内联函数只适用于功能简单,代码短小而又被重复使用的函数。函数体中包含复杂结构控制语句,如switch、复杂if嵌套、while语句等,以及无法内联展开的递归函数,都不能定义为内联函数,即使定义,系统也将作为一般函数处理。
#include
inline max(int a,int b,int c){
if(a>b&&a>c) return a;
if(b>a&&b>c) return b;
if(c>a&&c>b) return c;
}
void main(){
cout<
}
2[简答题]设计一个单向链表类模板,节点数据域中数据从小到大排列,并设计插入、删除节点的成员函数。
参考解析:
#include
using namespace std;
templateclass List;
templateclass Node{
T info; //数据域
Node *link; //指针域
public:
Node(); //生成头结点的构造函数
Node(const T & data);//生成一般结点的构造函数
friend class List;
};
template Node::Node(){link=NULL;}
template Node::Node(const T & data){
info=data;
link=NULL;
}
//定义链表类
templateclass List{
Node *head; //链表头指针和尾指针
public:
List(); //构造函数,生成头结点(空链表)
~List(); //析构函数
void MakeEmpty(); //清空一个链表,只余表头结点
Node* Find(T data); //搜索数据域与data相同的结点,返回该结点的地址
void PrintList(); //打印链表的数据域
void InsertOrder(Node *p); //按升序生成链表
Node* CreatNode(T data); //创建一个结点(孤立结点)
Node* DeleteNode(Node* p); //删除指定结点
};
templateList::List(){
head=new Node(-9999);//头结点,最小的数据从小到大插入
}
templateList::~List(){
MakeEmpty();
delete head;
}
templatevoid List::MakeEmpty(){
Node *tempP;
while(head->link!=NULL){
tempP=head->link;
head->link=tempP->link; //把头结点后的第一个节点从链中脱离
delete tempP; //删除(释放)脱离下来的结点
}
}
template Node* List::Find(T data){
Node *tempP=head->link;
while(tempP!=NULL && tempP->info!=data) tempP=tempP->link;
return tempP; //搜索成功返回该结点地址,不成功返回NULL
}
templatevoid List::PrintList(){
Node* tempP=head->link;
while(tempP!=NULL){
cout tempP=tempP->link; } cout< } templatevoid List::InsertOrder(Node *p){ Node *tempP=head,*tempQ=head; //tempQ指向tempP前面的一个节点 while(tempP!=NULL){ if(p->infoinfo)break; //找第一个比插入结点大的结点,由tempP指向 tempQ=tempP; tempP=tempP->link; } p->link=tempP; tempQ->link=p; } templateNode* List::CreatNode(T data){//建立新节点 Node*tempP=new Node(data); return tempP; } templateNode* List::DeleteNode(Node* p){ Node* tempP=head->link,*tempQ=head,*tempC; while(tempP!=NULL && tempP!=p){ tempQ=tempP; tempP=tempP->link; } tempC=tempP; tempQ->link=tempP->link; return tempC; } int main(){ Node * P1; List list1; int a[10]={20,12,0,-5,9,-18,6,11,5,3},i,j; for(i=0;i<10;i++){ P1=list1.CreatNode(a[i]); list1.InsertOrder(P1); } list1.PrintList(); cout<<"请输入一个要求删除的整数"< cin>>j; P1=list1.Find(j); if(P1!=NULL){ P1=list1.DeleteNode(P1); delete P1; list1.PrintList(); } else cout<<"未找到"< cout<<"请输入一个要求插入的整数"< cin>>j; P1=list1.CreatNode(j); list1.InsertOrder(P1); list1.PrintList(); list1.MakeEmpty();//清空list1 list1.PrintList(); return 0; } 3[单选题] 下列关于虚函数与函数重载区别的叙述中不正确的是( )。 A.函数说明形式上不同 B.函数允许非成员函数重载,虚函数只能是成员函数 C.函数重载的调用依据参数和类型的差别,虚函数则依据对象 D.函数重载的本体可以在类外定义,虚函数不可以 参考答案:D 参考解析:A项、B项、C项均为虚函数与函数重载的不同之处。但有一点它们是相同的:在类内外定义均可。故D项错误。 4[单选题] 设有表示学生选课的3张表,学生S(学号、姓名、性别、年龄、身份证号)、课程C(课号、课名)、选课SC(学号、课号、成绩),则表SC的关键字(键或码)为( )。 A.课号、成绩B.学号、成绩C.学号、课号D.学号、姓名、成绩 参考答案:C 参考解析:关键字是指属性或属性的组合,其功能是唯一地标识一个元组或数据,而SC中学号和课号的组合可以对元组进行唯一的标识。 5[简答题]请使用VC6或使用【答题】菜单打开考生文件夹pr092下的工程pros2。此工程中包含一个程序文件main.cpp,其中有“部门”类Department和“职工”类Staff的定义,还有主函数main的定义。在主函数中定义了两个“职工”对象,他们属于同一部门。程序展示,当该部门改换办公室后,这两个人的办公室也同时得到改变。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 改换办公室前: 职工号:0789姓名:张三部门:人事处办公室:521 职工号:0513姓名:李四部门:人事处办公室:521 改换办公室后: 职工号:0789姓名:张三部门:人事处办公室:311 职工号:0513姓名:李四部门:人事处办公室:311 注意:只在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。 #include using namespace std; class Department{ //“部门”类 public: Department(const char*name,const char*office){ strcpy(this一>name,nanle); //**********found********** } const char*getName()const{return name;}//返回部门名称 //**********found********** const char*getOffice()const{________} //返回办公室房号 void changeOfficeTo(const char*office){ //改换为指定房号的另一个办公室 strcpy(this一>office,office); } private: char name[20];//部门名称 char office[20];//部门所在办公室房号 }; class staff{//“职工”类 public: //**********found********** Staff(const char*my—id,const char木my_name,Department&my_dept):——{ strcpy(this一>staff id,my_id); strcpy(this一>name,my_name); } const char*getlD()const{return staff_id;} const char*getName()consl{return name;} Department getDepartment()const{return dept;} char staff=id[10];//职工号 char name[20];//姓名 Department&dept;//所在部门 }; void showStaff(Staff&staff){ cout<<”职工号:”< cout<<”姓名:”< 6[单选题]执行下列语句后,输出结果为( )。 cout.put('s'); cout<<'c'<<'a'; A.ca B.sca C.s D.a 参考答案:B 7[单选题]在一棵二叉树的前序遍历、中序遍历、后序遍历所产生的序列中,所有叶结点的先后顺( )。 A.都不相同 B.完全相同 C.前序和中序相同,而与后序不同 D.中序和后序相同,而与前序不同 参考答案:B 参考解析:对二叉树的访问有3种方式,其中任意的两种可惟一确定一颗二叉树,但无论是前序、后序还是中序遍历二叉树时,其区别在于访问根的先后次序不同,而访问叶结点的顺序完全相同。 8[单选题] 下列语句都是程序运行时的第一条输出语句,其中一条语句的输出效果与其他三条语句不同,该语句是( )。 A.cout< 参考答案:D 参考解析:setw(6)将输出宽度设为6,如果位数不够则在最左边补齐,因此该项输出一定不会与其他三项一致。 9[简答题] 请使用VC6或使用【答题】菜单打开考生文件夹proj2下的工程proj2,此工程包含有一个源程序文件proj2.cpp,其中定义了Stack类和ArrayStack类。 Stack是一个用于表示数据结构“栈”的类,栈中的元素是字符型数据。Stack为抽象类,它只定义了栈的用户接口,如下所示: 公有成员函数 功能 push 入栈:在栈顶位置添加一个元素 pop 退栈:取出并返回栈顶元素 ArrayStack是Stack的派生类,它实现了Stack定义的接口。ArrayStack内部使用动态分配的字符数组作为栈元素的存储空间。数据成员maxSize表示的是栈的最大容量,top用于记录栈顶的位置。成员函数push和pop分别实现具体的入栈和退栈操作。 请在程序中的横线处填写适当的代码,然后删除横线,以实现上述功能。此程序的正确输出结果应为: a,b,C C,b,a 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“//****料found****”。 //proj2.cpp #include using namespacc std; class Stack{ public: virtual void push(char C)=0; virtual char pop()=0; }; class ArrayStack:public Stack{ char*P; int maxSizc; int top; public: ArravStack(int s) { top=0; maxSize=s: //*********found********* P=______; } ~ArrayStack() { //*********found********* _______; } void push(char c) } if(top==maxSize){ cerr<<”Overflow! \n”: return; } //*********found********* _______; top++: } char pop() { if(top==0){ cerr<<”Underflow!、n”; return‘\0’; } Top--; //*********found********* ______; } }; void f(Stack&sRef) { char ch[]={‘a’,‘b’,‘c’}; cout< sRef.push(oh[0]);sRef.push(ch[1]);sRef.push(ch[2]); cout< cout< cout< } int main() { ArrayStack as(10); f(as): return 0: } 参考解析: (1)Ilew char[s] (2)delete[]P (3)P[top]=e (4)return P[top] 【考点分析】 本题主要考查的是表示栈的抽象类Stack类及它的派生类ArrayStaek类、纯虚函数和成员函数。栈的节点一般使用指针表示,定义构造函数时要给指针分配空间,使用New语句来完成。~ArrayStack()是析构函数,因为前面已经使用new来分配空间了,因此在这里要用delete语句来释放指针。 【解题思路】 (1)主要考查的是ArrayStack类的构造函数,在函数中要为P申请S个char型空间,应使用语句P=flew char[s];。 (2)主要考查析构函数,使用delete语句释放指针,即delete[]P;。 (3)主要考查push函数,top表示栈顶元素下标,添加的数据放到栈顶,因此使用语句P[top]=c;。 (4)主要考查pop函数,输出栈顶数据,top表示栈顶元素下标,因此使用语句return P[top];。 10[单选题]有以下函数 fun(char *a,char *b) { while((*a!=’\0’) &&(*b!=’\0’)&&(*a==*b)) { a++; b++;} return (*a-*b); } 该函数的功能是( ) A.计算a和b所指字符串的长度之差 B.将b所指字符串复制到a所指字符串中 C.将b所指字符串连接到a所指字符串后面 D.比较a和b所指字符串的大小 参考答案:D 11[单选题]下列叙述中正确的是( )。 A.算法的效率只与问题的规模有关,而与数据的存储结构无关 B.算法的时间复杂度是指执行算法所需要的计算工作量 C.数据的逻辑结构与存储结构是一一对应的 D.算法的时间复杂度与空间复杂度一定相关 参考答案:B 12[判断题]C++语言比C语言对数据类型要求更加严格了。 参考答案:对 13[单选题]下面选项中不属于面向对象程序设计特征的是( )。 A.继承性 B.多态性 C.类比性 D.封装性 参考答案:C
微信搜索"考试吧"了解更多考试资讯、下载备考资料 14[单选题]下列关于数据库设计的叙述中,正确的是( )。 A.在需求分析阶段建立数据字典 B.在概念设计阶段建立数据字典 C.在逻辑设计阶段建立数据字典 D.在物理设计阶段建立数据字典 参考答案:A 参考解析:数据库设计目前一般采用生命周期法,即将整个数据库应用系统的开发分解成日标独立的若干阶段。分别是:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段、编码阶段、测试阶段、运行阶段、进一步修改阶段。数据字典是对系统中数据的详尽描述,是各类数据属性的清单。对数据设计来讲,数据字典是进行洋细的数据收集和数据分析所获得的主要结果。 15[单选题]下列叙述中正确的是( )。 A.用E-R图能够表示实体集之间一对一的联系、一对多的联系、多对多的联系 B.用E-R图只能表示实体集之间一对一的联系 C.用E-R图只能表示实体集之间一对多的联系 D.用E-R图表示的概念数据模型只能转换为关系数据模型 参考答案:A 参考解析:用E-R图可以简单明了地描述实体及其相互之间的联系,用E-R图还可以方便地描述多个实体集之间的联系和一个实体集内部实体之间的联系。因此,选项A中的说法是正确的, 而选项B与C中的说法都是错误的。 为了建立用户所要求的数据库.必须把概念结构(用E-R图表示的概念数据模型)转换为某个具体的数据库管理系统所支持的数据模型.这就是逻辑结构设计所要完成的任务。在已给定数据库管理系统的情况下,数据库的逻辑设计可以分两步来进行: ①将概念模型转换成一般的数据模型; ②将一般的数据模型转换为特定的数据库管理系统所支持的数据模型。 由此可知,用E-R图表示的概念数据模型不仅能转换为关系数据模型,还可以转换为其他数据模型,如网状模型和层次模型等。因此,选项D中的说法也是错误的。 16[单选题]下列数据结构中,属于非线性结构的是( )。 A.循环队列B.带链队列C.二叉树D.带链栈 参考答案:C 参考解析:队列是一种允许在一端进行插入,而在另一端进行删除的线性表。栈也是一种特殊的线性表,其插入与删除只能在线性表的一端进行。 17[单选题] c++语言类体系中,不能被派生类继承的有( )。 A.转换函数B.构造函数C.虚函数D.静态成员函数 参考答案:B 参考解析:派生类对象的数据结构是由基类中说明的数据成员和派生类中说明的数据成员共同构成,所以不能继承基类的构造函数,必须重新定义。 18[单选题] 在软件设计中,不属于过程设计工具的是( )。 A.PDL(过程设计语言)B.PAD图C.N-S图D.DVD图 参考答案:D 参考解析:PDL是过程设计语言(ProcedureDesignLanguage)的简写,也称程序描述语言,是硐于描述模块算法设计和处理细节的语言;N-S图是编程过程中常用的一种分析工具,提出了最初分析问题方法;PAD是问题分析圈(ProblemAnalysisDiagram)的简写,它用二维树型结构的图表示程序的控制流,将这种图转换为程序代码比较容易;DFD(数据流图)是描述数据处理过程的工具。 19[单选题] 下面不正确的描述为( )。 A.调用函数时,实参可以是表达式 B.调用函数时,实参与形参可以共用内存单元 C.调用函数时,将为形参分配内存单元 D.调用函数时,实参与形参的类型必须一致 参考答案:B 参考解析:函数调用时用实参替换形参,如果实参为表达式,将为表达武的值创建一个临时对象,然后将该实参替换形参。替换的实质是变量间的复制,当然这种复制需要为形参分配内存。需要注意的是:形参在编泽时不分配内存,在运行时才分配内存。 20[单选题] 有如下程序: #include #includediomanip> usingnamespacestd; intmain( ){ ints[]={123,234); cout< for(inti=0;i<2;i++){cout< return0; } 运行时的输出结果是( )。 A.123B.***123 234234C.***123D.***123 ***234234*** 参考答案:B 参考解析:setw()为填充字符控制,仅对紧接着它的字符起作用,当输出的字符宽度小于setw()预留的字符数时,需用setw()设置的字符给予填充。
21[填空题]C++语言具有面向对象方法中要求的三大特性: ( ) 、 ( ) 和 ( ) 。 参考解析:封装性 、 继承性 和 多态性 。 22[简答题]指出下列数据中哪些可作为C++的合法常数? (a) 588918 (b) 0129 (c) 0x88a (d) e-5 (e) ″A″ (f) .55 (g) ’\\’ (h) 0XCD (i) 8E7 (j) π 参考解析:(a)、(c)(e)、(f)、(g)、(h)、(i) 23[单选题] 有如下程序: #include usingnamespacestd; classA { public: A(){cout<<"A";} ~A(){cout<<"~A";} }; classB { A*P: public: B(){cout<<"B";p=newA;} ~B(){cout<<"~B";deleteP;} }; intmain() { Bobi; return0; } 执行这个程序的输出结果是( )。 A.BAA~A~B~AB.ABA~B~A~AC.BAA~B~A~AD.ABA~A~B~A 参考答案:B 参考解析:本题考查的是类的构造函数和析构函数。派生类构造函数的执行顺序:首先调用基类的构造函数,调用顺序按它们被继承时说明的顺序;然后调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容。因此本题中,首先调用基类构造函数输出A,然后调用子对象的构造函数输出B,P=newA再调用类A的构造函数输出A。析构函数的调用顺序和构造函数的调用顺序相反。 24[单选题]开发软件时对提高开发人员工作效率至关重要的是 A.操作系统的资源管理功能 B.先进的软件开发工具和环境 C.程序人员的数量 D.计算机的并行处理能力 参考答案:B 25[单选题] 下列关于模板形参的描述中,错误的是( )。 A.模板形参表必须在关键字template之后 B.模板形参表必须用括弧( )括起来 C.可以用class修饰模板形参 D.可以用typename修饰模板形参 参考答案:B 参考解析:主要考查函数模板的定义。声明一个函数模板的格式为“template<<模板形参表声明>><函数声明>”,其中<模板形参>具有typename<参数名>、class<参数名>、<类型修饰><参数名>三种形式,形参用“<>”括起来。 26[单选题] 有下列程序: #include voidmain( ) {inta=1,b=2,c=3,d=0; if(a==1&&b++==2) if(b!=2‖c--!=3) printf("%d,%d,%d\n",a,b,c); elseprintf("%d,%d,%d\n",a,b,c); elseprintf("%d,%d,%d,%d\n",a,b,c); } 程序运行后的输出结果是( )。 A.1,2,3B.1,3,2C.1,3,3D.3,2,1 参考答案:C 参考解析:在程序中,当执行第一条if语句时,进行逻辑语句的判断,因为变量b的初值为2,所以其值加1后为3,与2不相等,所以if语句中的逻辑表达式的值为假,则程序执行最后一条elseprintf语句。输出变量为a,b,c,当前数值为1,3,3。所以正确答案为选项C。 微信搜索"考试吧"了解更多考试资讯、下载备考资料