目录
考后感悟:
这次考试抽到的PTA试题除了考查C++基础知识外,选择题中也考了很多虚函数的相关内容,大题也考了STL容器相关操作。
复习时要着重复习STL标准模板库(即各种容器,算法,迭代器),特别是vector容器和string容器的各种基本操作以及排序算法
如有相关C++考试问题可评论或私信
2022年6月30日
一、判断题
R1-1
分数 1
作者 黄淑伟
单位 沈阳师范大学
this 指针是一个系统预定义的特殊指针,指向当前正在操作的对象。(T)
T
F
R1-2
分数 1
作者 黄淑伟
单位 沈阳师范大学
如果A是B的友元类,那么B的成员函数可以访问A的私有成员。(F)
T
F
R1-3
分数 1
作者 何振峰
单位 福州大学
因为静态成员函数不能是虚函数,所以它们不能实现多态。(T)
T
F
R1-4
分数 1
作者 刘莹
单位 威海职业学院
STL中关联型容器都是有序的。(T)
T
F
R1-5
分数 1
作者 张德慧
单位 西安邮电大学
C++程序中,一个类的析构函数可以被重载。(F)
T
F
R1-6
分数 1
作者 黄淑伟
单位 沈阳师范大学
静态成员的特点是不管这个类创建了多少个对象,其静态成员在内存中只保留一份副本,这个副本为该类的所有对象共享,或者说静态成员为类所有。(T)
T
F
二、单选题
R2-1
分数 2
作者 何振峰
单位 福州大学
在派生类对基类继承的传递性中,_B_是错误的。
A.在公有继承方式下,直接派生类对象可以直接调用基类中的公有成员函数,去访问基类的私有数据成员
B.在私有继承方式下,间接派生类对象可以直接调用基类中的公有成员函数,去访问基类的私有数据成员
C.在公有继承方式下,间接派生类对象可以直接调用基类中的公有成员函数,去访问基类的私有数据成员
D.不管是私有继承还是公有继承,基类中的私有成员在派生类的作用域内都是不可能见的。
R2-2
分数 2
作者 何振峰
单位 福州大学
下列描述中,( D)是抽象类的特性。
A.可以说明虚函数
B.可以进行构造函数重载
C.可以定义友元函数
D.不能定义该类对象
R2-3
分数 2
作者 何振峰
单位 福州大学
关于虚函数的描述中,( B)是正确的。
A.虚函数是一个非成员函数
B.基类中说明了虚函数后,派生类中与其对应的函数可不必说明为虚函数
C.派生类的虚函数与基类的虚函数具有不同的参数个数和类型
D.虚函数是一个static 类型的成员函数
R2-4
分数 2
作者 董卫萍
单位 绍兴文理学院元培学院
假定MyClass为一个类,则该类的复制构造函数的声明语句为(D)
A.MyClass(MyClass *x)
B.MyClass(int x)
C.MyClass(MyClass x)
D.MyClass(const MyClass& x);
R2-5
分数 2
作者 王秀
单位 福州大学
在C++中,关于下列设置缺省参数值的描述中,(C)是正确的。
A.不允许设置缺省参数值;
B.设置缺省参数值时,必须全部都设置;
C.在指定了缺省值的参数右边,不能出现没有指定缺省值的参数;
D.只能在函数的定义性声明中指定参数的缺省值;
R2-6
分数 2
作者 王秀
单位 福州大学
下面说法正确的是(A)。
A.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方
B.类的内联函数必须在类体内定义
C.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方
D.类的内联函数必须在类体外通过加关键字inline定义
R2-7
分数 2
作者 何振峰
单位 福州大学
命名空间应用于:(A)
A.避免各个不同函数、变量等的名称冲突
B.提高代码的执行速度
C.在类外定义类的成员函数
D.以上答案都正确
R2-8
分数 2
作者 何振峰
单位 福州大学
下列表达错误的是( D)。
A.cin.fill(‘#’)
B.cout.setf(ios::uppercase)
C.cout<<setw(5)
D.cout<<fill(‘#’)
R2-9
分数 2
作者 王秀
单位 福州大学
关于new运算符的下列描述中,(A)是错误的。
A.使用它创建对象数组时必须指定初始值;
B.使用它创建的对象或对象数组可以使用运算符delete删除;
C.使用它创建对象时要调用构造函数;
D.它可以用来动态创建对象和对象数组;
R2-10
分数 2
作者 张德慧
单位 西安邮电大学
在C++语言中设置虚基类的目的是( D) 。
A.缩短程序的目标代码
B.提高程序的运行效率
C.简化程序代码
D.解决多继承造成的二义性问题
R2-11
分数 2
作者 何振峰
单位 福州大学
对于以下关于友元的说法(B)
A.如果函数fun被声明为类A的友元函数,则fun的形参类型不能是A。
B.以上答案都不对
C.如果函数fun被声明为类A的友元函数,则该函数能访问A的保护成员,但不能访问私有成员
D.如果函数fun被声明为类A的友元函数,则该函数成为A的成员函数
R2-12
分数 2
作者 何振峰
单位 福州大学
设A为自定义类,现有普通函数int fun(A& x)。则在该函数被调用]时:(A)
A.无需初始化形参x
B.仅在实参为常量时,才会执行复制构造函数以初始化形参x
C.仅在该函数为A类的友元函数时,无需初始化形参x
D.将执行复制构造函数来初始化形参x
三、函数题
R6-1 编写一个函数模板Swap,实现两个变量交换。
分数 10
作者 张德慧
单位 西安邮电大学
编写一个函数模板Swap,实现两个变量交换。
函数模板实例化:
Swap( i, j );
:其中 i 和 j 都是用户传入的参数, i 和 j类型相同,但可以是任何数据类型。
裁判测试程序样例:
#include
using namespace std;
//你提交的代码将被嵌入到这里
int main()
{
int i,j;
char m,n;
cin>>i>>j;
cin>>m>>n;
Swap(i,j);
Swap(m,n);
cout<<i<<’ ‘<<j<<’\n’;
cout<<m <<’ '<<n<<endl;
return 0;
}
输入样例:
2 1
a c
输出样例:
1 2
c a
template<typename T>
void Swap(T &a,T &b){
T t = a;
a = b;
b = t;
}
R6-2 从shape类派生出一个圆形类Circle
分数 10
作者 张德慧
单位 西安邮电大学
请从下列shape类派生出一个圆形类Circle,这个类圆形的半径radius作为私有成员,类中应包含初始化半径的构造函数。圆周率PI取3.1415926。
class shape {
public:
double getArea(){ return -1; };
double getPerimeter(){ return -1 };
}
圆形类名Circle
裁判测试程序样例:
#include
using namespace std;
class shape {
public:
double getArea(){ return -1 };// 求面积
double getPerimeter(){ return -1 }; // 求周长
};
/* 你提交的代码将被嵌入到这里 */
int main() {
double r;
cin>>r;
Circle c®;
cout<<c.getArea()<<endl;
cout<<c.getPerimeter()<<endl;
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里填写一组输入
2.78
输出样例:
在这里填写相应的输出
24.2795
17.4673
const double PI = 3.1415926;
class Circle:public shape{
private:
double r;
public:
Circle(double r):r(r){}
double getArea(){
return PI*r*r;
};
double getPerimeter(){
return 2*PI*r;
};
};
R6-3 求正15边形的面积和周长
分数 10
作者 张德慧
单位 西安邮电大学
求正15边形的面积和周长
在一个正n边形(Regular Polygon)中,所有边的边长都相等,且所有角的度数相同(即这个多边形是等边、等角的)。我们已经从下列抽象类shape实现了一个正n边形类RegularPolygon。其构造方法为:RegularPolygon(int n,double side); 其中n为边数,side为边长。
从键盘输入正15边形的边长s,请补充下列程序计算该正15边形的面积和周长。
class shape {// 抽象类
public:
virtual double getArea()=0;// 求面积
virtual double getPerimeter()=0; // 求周长
};
裁判测试程序样例:
#include
#include
using namespace std;
class shape {// 抽象类
public:
virtual double getArea()=0;// 求面积
virtual double getPerimeter()=0; // 求周长
};
//这里定义了正多边形类RegularPolygon,其构造方法为:RegularPolygon(int n,double side); 其中n为边数,side为边长。
int main()
{
double s;
cin>>s;
/* 请在这里填写答案 */
return 0;
}
输入样例1:
在这里给出一组输入。例如:
6.1828
输出样例1:
在这里给出相应的输出。例如:
674.415
92.742
输入样例2:
在这里给出一组输入。例如:
-1.234
输出样例2:
在这里给出相应的输出。例如:
Illegal input data.
if(s<0){
cout<<"Illegal input data."<<endl;
return 0;
}
RegularPolygon r(15,s);
cout<<r.getArea()<<endl;
cout<<r.getPerimeter()<<endl;
R6-4 将学生对象按照学号升序排序C++
分数 10
作者 张德慧
单位 西安邮电大学
请阅读程序并补全源代码:先从键盘录入5个学生的数据,保存到向量vector容器对象v中,然后将学生对象按照学号number从小到大排序后输出。
裁判测试程序样例:
//本程序将下面的学生类Student对象按照学号number从小到大排序后输出。
#include
#include
#include
#include
using namespace std;
class Student {
string number;
string name;
float score;
public:
// Constructor
Student(string number1, string name1, float score1) {
number = number1;
name = name1;
score = score1;
}
string get_number(){
return number;
}
// Used to print student details in main()
void print() {
cout<<number << " " <<name << " " << score<<endl;
}
};
bool cmp_number(Student s1,Student s2);//比较学号的函数,需要考生实现
int main()
{
vector<Student> v;
/* 请在这里填写答案 */
输入样
在这里给出一组输入。例如:
04031021 Zhang3 84
04031013 Li4 73
04031018 Wang5 98
04031038 Ma6 65
04031029 Chen7 96
输出样例:
在这里给出相应的输出。例如:
04031013 Li4 73
04031018 Wang5 98
04031021 Zhang3 84
04031029 Chen7 96
04031038 Ma6 65
string number;
string name;
float score;
for(int i=0;i<5;i++){
cin>>number>>name>>score;
Student s(number,name,score);
v.push_back(s);
}
sort(v.begin(),v.end(),cmp_number);
for(vector<Student>::iterator it = v.begin();it!=v.end();it++){
(*it).print();
}
}
bool cmp_number(Student s1,Student s2){
if(s1.get_number()<s2.get_number()){
return true;
}
return false;
}
R6-5 定义有静态成员的C++学生类Student(10分)
分数 10
作者 张德慧
单位 西安邮电大学
本程序中学生Student类中有学号 number,姓名 name,成绩 score 等数据成员,另外有静态变量:学生对象个数 count 和总分sum。静态成员函数average( )用来计算学生的平均分。
Student类构造函数的原型如下:
Student(int number1, String name1, float score1);
裁判测试程序样例:
/* 请在这里填写答案 */
int main( )
{
// Student::init( );
Student stu1(1,“Bill”,87);
stu1.print( );
Student stu2(2,"Adam",91);
stu2.print( );
Student stu3(3,"David",96);
stu3.print( );
Student::average( ); //静态成员函数的调用
return 0;
}
输出样例:
在这里给出相应的输出。例如:
number: 1 name: Bill score: 87 count: 1
number: 2 name: Adam score: 91 count: 2
number: 3 name: David score: 96 count: 3
sum is 274
count is 3
average is 91.3333
#include <iostream>
#include <string>
using namespace std;
class Student{
public:
int number;
string name;
float score;
Student(int number, string name, float score):number(number),name(name),score(score){
count++;
sum+=score;
}
static double count;
static double sum;
static void average();
void print(){
cout<<"number: "<<number<<" name: "<<name<<" score: "<<score<<" count: "<<count<<endl;
}
};
double Student::count = 0;
double Student::sum = 0;
void Student::average(){
double arg = sum/count;
cout<<"sum is "<<sum<<endl;
cout<<"count is "<<count<<endl;
cout<<"average is "<<arg<<endl;
}
/*
number: 1 name: Bill score: 87 count: 1
number: 2 name: Adam score: 91 count: 2
number: 3 name: David score: 96 count: 3
sum is 274
count is 3
average is 91.3333
*/
四、编程题
R7-1 分离目录路径和文件名
分数 10
作者 张德慧
单位 西安邮电大学
输入文件目录路径和文件名,要求分离成目录路径和文件名分别输出
输入格式:
例如:输入
c:\windows\winhelp.exe
输出格式:
c:\windows (目录路径)
winhelp.exe (文件名)
输入样例:
/usr/bin/man
输出样例:
/usr/bin
man
#include <iostream>
#include <string>
using namespace std;
void separate(string &str){
int i = str.find_last_of("/\\");
cout<<str.substr(0,i)<<endl;
cout<<str.substr(i+1)<<endl;
}
int main()
{
string s;
getline(cin,s);
separate(s);
return 0;
}
R7-2 找出足球赛对阵方
分数 10
作者 张德慧
单位 浙江大学
2014年世界杯足球赛在6月24日星期二小组赛赛程如下所示:
Australian VS Spain; Holland VS Chile; Cameroon VS Brazil; Croatia VS Mexico
请你编写一个简单的C++程序,当输入其中任何一个国家的名字就能找出与其对阵的国家名。例如,输入“Holland”,就能找到对阵方是“Chile”。
输入格式:
Holland
输出格式:
Holland team’s rival is Chile.
输入样例:
Germany
输出样例:
Germany’s team has no match today.
//因对string容器不熟悉,暂时用分支语句实现
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin>>s;
if(s=="Australian"){
cout<<s<<" team's rival is Spain."<<endl;
return 0;
}
if(s=="Spain"){
cout<<s<<" team's rival is Australian."<<endl;
return 0;
}
if(s=="Holland"){
cout<<s<<" team's rival is Chile."<<endl;
return 0;
}
if(s=="Chile"){
cout<<s<<" team's rival is Holland."<<endl;
return 0;
}
if(s=="Cameroon"){
cout<<s<<" team's rival is Brazil."<<endl;
return 0;
}
if(s=="Brazil"){
cout<<s<<" team's rival is Cameroon."<<endl;
return 0;
}
if(s=="Croatia"){
cout<<s<<" team's rival is Mexico."<<endl;
return 0;
}
if(s=="Mexico"){
cout<<s<<" team's rival is Croatia."<<endl;
return 0;
}
cout<<s<<"'s team has no match today."<<endl;
return 0;
}