2018年9月计算机二级C++考试冲刺提分题及答案(2)
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‘