青少年编程能力等级测评CPA C++五级试卷(1)
一、单项选择题(共15题,每题3分,共45分)
CP5_1_1.下列有关类的重用意义的叙述中,不正确的是( )。
A.类的重用有利于代码结构的维护
B.类的重用有利于减少代码的冗余
C.类的重用有利于提升程序的执行效率
D.类的重用有利于提升程序的可扩展性和灵活性
CP5_1_2.类的组合,其核心特征是( )。
A.一个类内嵌其他类作为成员
B.一个类内嵌其他类的私有成员作为成员
C.一个类内嵌其他类的保护成员作为成员
D.一个类内嵌其他类的对象作为成员
CP5_1_3.执行下列代码,输出结果是( )。
#include <iostream>
using namespace std;
class Point {
public:
Point(int a) :x(a+1) {};
void print() {
cout << "x:" << x <<" ";
}
private:
int x;
};
Point& re_p(int a) {
Point* res = new Point(a+1);
res->print();
return *res;
}
int main(){
Point& a = re_p(2);
a.print();
return 0;
}
A.x:2 x:2
B.x:2 x:3
C.x:3 x:4
D.x:4 x:4
CP5_1_4.执行下列代码,输出结果是( )。
#include <iostream>
using namespace std;
class B;
class A {
public:
char ia;
A() {ia = 'A';}
B *b;
};
class B {
public:
char ib;
B() {ib = 'B';}
A oa;
};
int main() {
A t1;
t1.b = new B();
B t2;
cout << t1.ia <<t1.b->ib;
cout << t2.ib<<t2.oa.ia<<endl;
return 0;
}
A.ABBA
B.AABB
C.BBAA
D.BAAB
CP5_1_5.在C++中,类的默认继承方式是( )。
A.公有继承
B.私有继承
C.保护继承
D.多态继承
CP5_1_6.执行下列代码,输出结果是( )。
#include <iostream>
using namespace std;
class Person{
public:
void Print(){cout<<'P';}
void Output(){cout<<1;}
virtual ~Person(){cout<<3; }
};
class Tom:public Person{
public:
void Print(){cout<<'T';}
};
int main(){
Tom a;
a.Output();
a.Print();
return 0;
}
A.1T
B.1P
C.1T3
D.1P3
CP5_1_7.在公有继承的情况下,允许派生类中新定义的成员函数直接访问的基类成员是( )。
A.公有成员和保护成员
B.公有成员
C.保护成员和私有成员
D.公有成员、保护成员和私有成员
CP5_1_8.有如下类的声明,则在创建一个类 C 的对象时,输出的信息是( )。
class A{
public:
A(){ cout<<'A';}
};
class B{
public:
B(){ cout<<'B';}
A aa;
};
class C:public B{
public:
C(){ cout<<'C'; }
};
A.ABC
B.BAC
C.BCA
D.CBA
CP5_1_9.C++要实现运行时多态性,需使用的是( )。
A.构造函数
B.析构函数
C.虚函数
D.重载函数
CP5_1_10.有如下类声明,则下列叙述正确的是( )。
class A{
public:
virtual void fun1(){}
void fun2(){}
};
class B:public A{
public:
virtual void fun2(){cout <<"fun2";}
void fun1(){cout<<"fun1";}
};
A. A::fun2()和B::fun1()都不是虚函数
B. A::fun2()和B::fun1()都是虚函数
C. A::fun2()是虚函数,而B::fun1()不是虚函数
D. A::fun2()不是虚函数,而B::fun1()是虚函数
CP5_1_11.下列关于模板的叙述中,错误的是( )。
A.模板形参只能由关键字 typename 声明
B.函数模板中可能含有虚拟类型参数
C.类模板的成员函数都是模板函数
D.满足一定条件时可以省略模板实参
CP5_1_12.下列代码是函数模板声明及变量定义,则下列调用语句错误的是( )。
template <class T1, class T2, class T3> T1 sum(T2,T3);
double d1,d2;
A.sum<double,double>(d1,d2);
B.sum<double>(d1,d2);
C.sum<double,double,double>(d1,d2);
D.sum(d1,d2);
CP5_1_13.下列有关类模板的叙述中,错误的是( )。
A.类模板的成员函数都是函数模板,类模板实例化后,成员函数也随之实例化
B.可以为类模板参数设置默认值
C.类模板描述了一组类
D.一个类模板中只允许有一个类型参数
CP5_1_14.运行下列代码,若能够输出3.8,则/**(1)**/处应填写的语句是( )。
#include<iostream>
using namespace std;
template <class T>
class A{
private:
T a1,a2;
public:
A(T aa1,T aa2){
a1=aa1;
a2=aa2;
}
T add(){
T sum;
sum=a1+a2;
return sum;
}
};
int main(){
/**(1)**/
cout<<a.add()<<endl;
return 0;
}
A. A a(1.5,2.3);
B. A<double> a(1.5,2.3);
C. <double> A a(1.5,2.3);
D. double A a(1.5,2.3);
CP5_1_15.STL引入C++后,新增的编程模式是( )。
A.泛型程序设计
B.面向过程程序设计
C.数据抽象程序设计
D.面向对象程序设计
二、多项选择题(共5题,每题2分,共10分)
CP5_1_16.下列有关类的组合和继承的叙述中,正确的有( )。
A.组合和继承都是类重用的实现方法之一
B.类的组合,整体类自动获得局部类的全部接口
C.类的继承,子类可自动继承父类的接口
D.组合关系和继承均破坏了类的封装性
CP5_1_17.下列有关派生类的叙述中,正确的有( )。
A.一个派生类可以作为另一个派生类的基类
B.派生类至少有一个基类
C.派生类只继承了基类的公有成员和保护成员
D.派生类默认的继承方式是private
CP5_1_18.执行下列代码,若输出结果为:“2023-3-20”,则/***code***/处可以填写的代码有( )。
#include<iostream>
#include<string>
using namespace std;
class Date{
protected:
int day,month,year;
public:
Date(int day,int month,int year){
this->day=day;
this->month=month;
this->year=year;
}
friend ostream& operator<<(ostream &os,const Date &d);
};
ostream& operator<<(ostream &os,const Date &d){
cout<<d.year<<"-"<<d.month<<"-"<<d.day<<endl;
return os;
}
int main(){
/***code***/
cout<<d<<endl;
}
A.string d="2023-3-20";
B.string d="2023,3,20";
C.Date d(20,3,2023);
D.Date d(20.,3.,2020.);
CP5_1_19.设有如下模板定义,则对func的调用,正确的有( )。
Template <class T>
T func(T x ,T y) {return x*x+y*y;}
A. func(3,5)
B. func<>(3,5)
C. func(3,5.5)
D. func<int>(3,5.5)
CP5_1_20.下列基本容器,属于STL标准模板库中关联容器的有( )。
A.双端队列
B.集合
C.单向链表
D.映射
三、编程题(共3题,每题15分,共45分)
CP5_1_21.编写程序实现如下功能:
通过定义组合类,输入平面直角坐标系上的一个坐标点(x,y),求该坐标点到坐标原点的距离。
说明:
(1)定义坐标点是Point类对象。使用Dis()函数获得坐标点到圆心的距离。点到圆心间的距离公式:
。
(2)编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。
#include <iostream>
#include <cmath>
using namespace std;
class Point{ //坐标点
/*********code*********/
/************code***********/
};
class Distance{ //坐标点到圆心的距离
/***************code****************/
/****************code**************/
private:
Point t; //组合类成员
};
int main()
{
float x,y;
cin>>x>>y;
Distance D;
cout << "Distance="<<D.Dis(x,y)<<endl;
return 0;
}
样例1:
输入:1 1
输出:Distance=1.41421
样例2:
输入:-3 -4
输出:Distance=5
CP5_1_22.编写程序实现如下功能:
输入圆的半径,求球体表面积及体积。球体看作由圆继承而来,定义圆类Circle作为基类,Sphere类为派生类。在派生类中对虚函数area()和volume()重新定义,求球体的表面积和体积。
说明:
(1)球体表面积=4*π*r2 ; 球体体积=4/3*(π*r3)。
(2)编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。
#include <iostream>
using namespace std;
const double PI=3.14;
class Circle{
//基类:定义一个数据成员radius作为半径,两个虚函数area()和volume()
/************code************/
/****************code************/
};
class Sphere:public Circle{
//派生类Sphere 求圆的表面积和体积
/*************code****************/
/**************code****************/
};
int main(){
double r;
cin>>r;
Sphere s(r);
cout <<s.area() << endl;
cout << s.volume() << endl;
return 0;
}
样例1:
输入:1.0
输出:12.56
4.18667
样例2:
输入:2.5
输出:78.5
65.4167
CP5_1_23.编写程序实现如下功能:
通过编写函数模板,实现求解3个数值从小到大的排序。3个值可以是整型、浮点型或者字符型。
说明:编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。
#include <iostream>
using namespace std;
template <class T>
/****************code****************/
/***************code*****************/
int main(){
int Int[3],m=0;
char Char[4]="";
double Double[3];
//输入一个整数:1代表整数排序;2代表字符排序;3代表浮点数排序
cin>>m;
switch(m)
{case 1: cin>>Int[0]>>Int[1]>>Int[2];
MinToMax(Int);
break;
case 2: cin>>Char[0]>>Char[1]>>Char[2];
MinToMax(Char);
break;
case 3: cin>>Double[0]>>Double[1]>>Double[2];
MinToMax(Double);
break;
default: return 0;
}
return 0;
}
样例1:
输入:1
12 2 -9
输出:-9 2 12
样例2:
输入:2
D e C
输出:C D e
样例3:
输入:3
2.3 4.5 1.2
输出:1.2 2.3 4.5