1-1-1 构造函数在创建类对象时自动调用执行。
T F
| 参考答案
答案 T
1-1-2 派生类对象不可以直接访问基类的私有成员。
T F
| 参考答案
答案 T
1-1-3 抽象类是指包含纯虚函数的类。
T F
| 参考答案
答案 T
1-1-4 类的析构函数可以重载。
T F
| 参考答案
答案 F
1-1-5 C++中所有的运算符都可以重载。
T F
| 参考答案
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 1/27
答案 F
1-1-6 拷贝构造函数的形参必须是本类对象的引用。
T F
| 参考答案
答案 T
1-1-7 使用new创建对象时必须指定初始值。
T F
| 参考答案
答案 F
1-1-8 内联函数就是定义在另一个函数体内部的函数。
T F
| 参考答案
答案 F
1-1-9 一个类的友元函数可以访问该类的私有成员。
T F
| 参考答案
答案 T
1-1-10 在类的静态成员函数内不能使用this指针。
T F
| 参考答案
答案 T
单选题 30 分
2-1 随机题目池 1 (10 选 10) 每题 1 分
2-1-1 ( )不是面向对象程序设计的主要特征。
A. 封装
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 2/27
B. 继承
C. 多态
D. 结构
| 参考答案
答案 D
2-1-2 C++的源文件的扩展名是_________。
A. h
B. obj
C. cpp
D. c++
| 参考答案
答案 C
2-1-3 下面有关内联函数的说法,错误的是__________。
A. 内联函数主要解决程序的运行效率问题
B. 内联函数调用机制跟普通函数不同
C. 内联函数中可以包括各种语句
D. 内联函数使用inline定义
| 参考答案
答案 C
2-1-4 已知int x =5;下列定义引用的方法中,_______是正确的。
A. int &y = 5;
B. int &y = x;
C. int y = &x;
D. int &y = &x;
| 参考答案
答案 B
2-1-5 关于C++类的说法,正确的是_________。
A. 只能有一个构造函数和一个析构函数
B. 可以有一个构造函数和多个析构函数
C. 可以有多个构造函数和一个析构函数
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 3/27
D. 可以有多个构造函数和多个析构函数
| 参考答案
答案 C
2-1-6 关于析构函数的说法,错误的是_________。
A. 析构函数由系统自动调用
B. 每个类都有析构函数
C. 析构函数在对象生命期结束时被调用
D. 析构函数可以重载
| 参考答案
答案 D
2-1-7 基类成员在派生类中的访问属性
基类中的公有成员在公有派生类中的访问属性为 ▁▁▁▁▁。
A. 私有 B. 保护 C. 公有 D. 无法访问
| 参考答案
答案 C
2-1-8 关于赋值兼容规则
赋值兼容规则是指在需要基类对象的任何地方, 都可以使用 ▁▁▁▁▁ 派生类的对象来替代。
A. 私有 B. 保护 C. 公有 D. 任何
| 参考答案
答案 C
2-1-9 下列关于虚函数的说法,错误的是___________。
A. 定义虚函数的关键字是virtual
B. 派生类可以重定义基类的虚函数
C. 构造函数可以定义为虚函数
D. 析构函数可以定义为虚函数
| 参考答案
答案 C
2-1-10 C++中的模板包括:
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 4/27
A. 对象模板和函数模板
B. 对象模板和类模板
C. 函数模板和类模板
D. 变量模板和对象模板
| 参考答案
答案 C
2-2 随机题目池 2 (10 选 10) 每题 2 分
2-2-1 有如下语句序列: char str[10]; cin>>str;当从键盘输入"This is a program"时,str数组得到的字符串是
A. "This is a program"
B. "This is a"
C. "This"
D. "This is"
| 参考答案
答案 C
2-2-2 关于函数的默认参数
若有下面的函数声明
则 ▁▁▁▁▁ 是错误的语句。
A. F(); | 参考答案 | B. F(3); |
C. F(, 5); D. F(6, 9);
答案 C
2-2-3 有如下函数模板定义: template T func(T x, T y) { return x>y?x:y; }在下列对func的调用中,错误的是( )
A. func(3, 5);
B. func(3.0, 5.5);
C. func (3, 5.5);
D. func('a', 'b');
| 参考答案
void F(int x = 1, y = 2);
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 5/27
答案 C
2-2-4 下列有关类的说法不正确的是:
A. 对象是类的一个实例
B. 任何一个对象只能属于一个具体的类
C. 一个类只能有一个对象
D. 类与对象的关系和数据类型与变量的关系相似
| 参考答案
答案 C
2-2-5 在子类的成员函数中,可以直接访问的有_________ A. 父类的public或protected的成员
B. 父类的private或protected的成员
C. 只有父类的public的成员
D. 父类的public或private的成员
| 参考答案
答案 A
2-2-6 下列关于this指针的叙述中,正确的是( )
A. 任何与类相关的函数都有this指针
B. 类的成员函数都有this指针
C. 类的构造函数没有this指针
D. 类的非静态成员函数才有this指针
| 参考答案
答案 D
2-2-7 下列关于派生类构造函数和析构函数的说法中,错误的是()
A. 派生类的构造函数会隐含调用基类的构造函数
B. 如果基类中有默认构造函数,派生类可以不定义构造函数
C. 在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数
D. 在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数
| 参考答案
答案 D
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 6/27
2-2-8 以下说法正确的是()。
A. 在静态成员函数中可以调用同类的其他任何成员函数
B. const成员函数不能作用于非const对象
C. 在静态成员函数中不能使用this指针
D. 静态成员变量每个对象有各自的一份
| 参考答案
答案 C
2-2-9 下列关于运算符重载的描述中,错误的是()。
A. 运算符重载后,原来运算符操作不可再用
B. 运算符重载不改变优先级
C. 运算符重载函数的参数个数与重载方式有关
D. 运算符重载不改变结合性
| 参考答案
答案 A
2-2-10 关于纯虚函数和抽象类的描述中,( )是错误的。
A. 纯虚函数是一种特殊的虚函数,它没有具体的实现
B. 抽象类是指具有纯虚函数的类
C. 一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类
D. 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出
| 参考答案
答案 C
程序填空题 10 分
5-1 随机题目池 1 (2 选 2) 每题 5 分
5-1-1 下列程序定义了一个point的类,类中有私有数据成员x和y,公有的带参构造函数和print成员函数。dPoint函数的功能是将point对象的成员都*2。请根据测试输入输出,完善程序。
#include <iostream> using namespace std; class point{
double x,y; public:
point(double _x,double _y)
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 7/27
{
x=_x; y=_y;
}v oid print() {
cout<<x<<" "<<y<<endl; | (1分)//输出x和y的值,用空格隔开 | } |
f riend void dPoint(point &p); | (1分)//将dPoint函数声明为point类的友元函数 | |
}; | ||
void dPoint( point &p | (1分))//将point对象的成员函数都乘以2 |
{
p.x*=2; p.y*=2;
}i nt main() {
double x,y; cin>>x>>y;
point p(x,y); dPoint(p); p.print(); return 0; | (1分)//根据输入的x和y定义point对象p |
(1分)//调用p的print输出p的成员 |
}
输入样例
1.1 2.2
输出样例
2.2 4.4
| 参考答案
填空#1 填空#2 填空#3 填空#4 填空#5 | cout<<x<<" "<<y<<endl;friend void dPoint(point &p);point &ppoint p(x,y);p.print(); |
5-1-2 下列程序定义了一个名为blog的类,有一个私有数据成员name。请根据测试样例,完善该类的普通构造函数,拷贝构造函数和=运算符重载的定义。
#include <iostream> using namespace std; class blog{
string name; public:
blog( string _name="" {name=_name; | (1分)) //定义普通构造函数 |
cout<<"原创了名为<<"<<name<<">>的博文."<<endl; | (1分) |
}
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 8/27
blog(const blog &b)//定义拷贝构造函数{
name=b.name;
cout<<"拷贝了名为<<"<<name<<">>的博文."<<endl; | (1分) | } |
c onst blog& operator=( const blog &b | (1分) )//赋值运算符重载 | |
{ | name=b.name; | |
cout<<"赋值获得了名为<<"<<name<<">>的博文."<<endl; | (1分) |
return *this; }
}; int main() {
string name; cin>>name; blog b1(name); blog b2=b1; blog b3; b3=b2;
return 0; }
输入样例:
敦重明辨
输出样例:
原创了名为<<敦重明辨>>的博文.拷贝了名为<<敦重明辨>>的博文.原创了名为<<>>的博文.
赋值获得了名为<<敦重明辨>>的博文.
| 参考答案
填空#1 填空#2 填空#3 填空#4 填空#5 | string _name=""cout<<"原创了名为<<"<<name<<">>的博文."<<endl;cout<<"拷贝了名为<<"<<name<<">>的博文."<<endl;const blog &bcout<<"赋值获得了名为<<"<<name<<">>的博文."<<endl; |
函数题 50 分
6-1 随机题目池 1 (1 选 1) 每题 5 分
6-1-1 本题要求定义一个天气类Weather。类声明包含的成员如下: Weather包含3个私有数据成员:
天气描述 string description温度double temperature
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 9/27
湿度 int humidity
Weather包含2个共有成员函数: setWeather()设置天气信息displayWeather()显示当前天气信息
根据main函数和测试需求定义Weather类裁判测试程序样例:
输入样例:
输出样例:
| 教师提交
代码 编译器: GXX
#include <iostream> using namespace std;
class Weather{ string des; double tem;
int hu; public:
void setWeather(string _des,double _tem,int _hu) {
des=_des; tem=_tem;
hu=_hu; }v oid displayWeather() {
cout<<"Weather Description: "<<des<<endl; cout<<"Temperature: "<<tem<<"摄氏度"<<endl; cout<<"Humidity: "<<hu<<"%"<<endl;
} };
/* 请在这里填写答案 */
int main() {
// 创建一个Weather对象
Weather currentWeather;
// 设置天气信息
currentWeather.setWeather("小雨", 25.5, 45);
// 打印天气信息
currentWeather.displayWeather(); return 0;
}
Weather Description: 小雨Temperature: 25.5摄氏度Humidity: 45%
| 参考答案
答案 编译器: GXX
6-2 随机题目池 2 (1 选 1) 每题 5 分
6-2-1 请根据main函数及测试需求创建一个学校类。
裁判测试程序样例:
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
| 教师提交
代码 编译器: GXX
class School{ public: School() {
cout<<"创建一个学校"<<endl;
}~ School() {
cout<<"撤销一个学校"<<endl;
} };
| 参考答案
答案 编译器: GXX
#include<iostream> using namespace std;
/* 请在这里填写答案 */
int main() {
// 创建一个学校对象,调用无参构造函数
School mySchool; return 0;
}
123456789
创建一个学校撤销一个学校
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 11/27
6-3 随机题目池 3 (1 选 1) 每题 5 分
6-3-1
根据main函数及输出样例写银行账户BankAccount类的定义
ownerName、accountId 和 balance 是私有数据成员,分别表示账户持有人的姓名、账户ID和账户余额。
getOwnerName、getAccountId 和 getBalance 是公共成员函数,用于获取账户的相关信息。
deposit 方法用于向账户中存款,只有当存款金额大于0时才会执行存款操作。withdraw 方法用于从账户中取款,只有当取款金额大于0且账户余额充足时才会执行取款操作。
displayAccountInfo 方法用于显示账户的详细信息。
裁判测试程序样例:
输入样例1:
输出样例1:
#include<iostream> #include<string> using namespace std;
/* 请在这里填写答案 */
int main() {
// 创建一个银行账户对象,使用构造函数初始化
BankAccount account("John Doe", 12345, 1000.00); double a;
cin>>a; double b; cin>>b;
// 显示账户信息
account.displayAccountInfo();
// 进行存款操作
account.deposit(a);
// 进行取款操作
account.withdraw(b);
// 再次显示账户信息
account.displayAccountInfo(); return 0;
}
Bank account created for John Doe with account ID 12345
Account ID: 12345, Owner: John Doe, Balance: 1000
Deposited 1 to the account of John Doe. New balance is 1001
输入样例2:
输出样例2:
输入样例3:
输出样例3:
| 教师提交
代码 编译器: GXX
class BankAccount {
string name; int id;
double balance; public:
BankAccount(string _name,int _id,double _balance) {
name=_name; id=_id; balance=_balance;
cout<<"Bank account created for "<<name<<" with account ID " <<id<<endl;
}v oid displayAccountInfo() {
cout<<"Account ID: "<<id<<", Owner: "<<name<<", Balance: " <<balance<<endl;
}
Withdrew 998 from the account of John Doe. Remaining balance is 3
Account ID: 12345, Owner: John Doe, Balance: 3
11 500
Bank account created for John Doe with account ID 12345
Account ID: 12345, Owner: John Doe, Balance: 1000
Deposited 1 to the account of John Doe. New balance is 1001
Invalid or insufficient funds for withdrawal
Account ID: 12345, Owner: John Doe, Balance: 1001
-3
1200
Bank account created for John Doe with account ID 12345 Account ID: 12345, Owner: John Doe, Balance: 1000 Invalid deposit amount
Invalid or insufficient funds for withdrawal
Account ID: 12345, Owner: John Doe, Balance: 1000
void deposit(double a) {
if(a<0) {
cout<<"Invalid deposit amount"<<endl; return;
}b alance+=a;
cout<<"Deposited "<<a<<" to the account of "<<name<<". New balance is "<<balance<<endl;
}v oid withdraw(double b) {
if(b>balance) {
cout<<"Invalid or insufficient funds for withdrawal"<<endl; return ;
}b alance-=b;
cout<<"Withdrew "<<b<<" from the account of "<<name<<". Remaining balance is "<<balance<<endl;
} };
| 参考答案
答案 编译器: GXX
6-4 随机题目池 4 (1 选 1) 每题 10 分
6-4-1
已有责任老师类Teacher的部分代码如下:
请补充完整责任老师类Teacher的函数定义,并编写实验室类Laboratory的代码,使之得出样例的输出结果。实验室类Laboratory中包含楼栋名称、课室编号、以及责任老师三个数据成员。
裁判测试程序样例:
//责任老师类
class Teacher{ private:
string m_name; //姓名
string m_phone; //联系方式public:
Teacher(string name, string phone); ~Teacher();
void show() const; };
#include <iostream> #include <string> using namespace std;
输入样例:
本例没有输入。
输出样例:
在这里给出相应的输出。例如:
| 教师提交
代码 编译器: GXX
Teacher::Teacher(string name, string phone) {
m_name=name; m_phone=phone; cout<<"创建责任老师"<<endl;
}T eacher::~Teacher() {
cout<<"撤销责任老师"<<endl;
//责任老师类
class Teacher{ private:
string m_name; //姓名
string m_phone; //联系方式public:
Teacher(string name, string phone); ~Teacher();
void show() const; };
/* 请在这里填写答案 */
int main() {
Laboratory lab("实训楼",304,"ZhangSan","13612345678"); cout<<"楼栋名称: "<<lab.getNameBuilding()<<endl; cout<<"课室编号: "<<lab.getIdRoom()<<endl; lab.getTeacher().show();
return 0; }
创建责任老师创建实验室
楼栋名称: 科技楼
课室编号: 305
责任老师姓名: zhang联系方式 : 13435
撤销责任老师撤销实验室撤销责任老师
}v oid Teacher::show() const {
cout<<"责任老师姓名: "<<m_name<<endl;
cout<<"联系方式 : "<<m_phone<<endl; }c lass Laboratory
{
string l_name; int l_id;
Teacher t; public:
Laboratory(string bname,int id, string tname, string pn):t(tname,pn)
{
l_name=bname; l_id=id;
cout<<"创建实验室"<<endl; }s tring getNameBuilding() {
return l_name; }
int getIdRoom() {
return l_id; }T eacher getTeacher() {
return t;
} ~Laboratory() {
cout<<"撤销实验室"<<endl;
} };
| 参考答案
答案 编译器: GXX
6-5 随机题目池 5 (1 选 1) 每题 10 分
6-5-1 已知两个类的部分代码如下,请补全Person类的函数定义,并完成Student类的代码编写,使之实现样例的结果。
函数接口定义:
//Person类
class Person{
string m_name; //姓名public:
Person(string name = "");//构造函数string getName(); //返回姓名
void show(); //显示姓名
};
裁判测试程序样例:
//Student类
class Student:public Person{ private:
int m_id; //学号
double m_a, m_b, m_c; //三门课成绩double m_Avg; //平均成绩
public:
Student(string name = "", int id = ' ', double a = 0,double b = 0,double c = 0);//构造函数
void show(); //显示姓名、学号、三门课成绩、平均成绩 (要求输出时保留两位小数)
double getAvg();//返回平均成绩};
#include <iostream> #include<string> #include<iomanip> using namespace std;
//Person类
class Person{
string m_name; //姓名public:
Person(string name = "");//构造函数string getName(); //返回姓名
void show(); //显示姓名
};
class Student:public Person{ private:
int m_id; //学号
double m_a, m_b, m_c; //三门课成绩double m_Avg; //平均成绩
public:
Student(string name = "", int id = ' ', double a = 0,double b = 0,double c = 0);//构造函数
void show(); //显示姓名、学号、三门课成绩、平均成绩(要求输出时保留两位小数)
double getAvg();//返回平均成绩};
/* 你的答案嵌入在这里*/
int main(){
Student *s1 = new Student("Zhanghua",11,80,90,100); s1->show();
cout<<"The average score of "<< s1->getName()<< " is "<<s1->getAvg(); // (要求输出时保留两位小数)
delete s1;
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
| 教师提交
代码 编译器: GXX
Person::Person(string name ) {
m_name=name; }s tring Person::getName() //返回姓名{
return m_name; }
void Person::show() {
cout<<m_name; }
Student::Student(string name , int id, double a,double b,double c ):Person(name)
{
m_id=id; m_a=a; m_b=b; m_c=c;
m_Avg=(a+b+c)/3.0; }v oid Student::show() //显示姓名、学号、三门课成绩、平均成绩(要求输出时保留两
位小数) {
Person::show();
cout<<" "<<m_a<<" "<<m_b<<" "<<m_c<<" "<<fixed<<setprecision(2) <<m_Avg<<endl;
}
double Student::getAvg() {
return m_Avg; }
| 参考答案
答案 编译器: GXX
return 0; }
33
34
Zhanghua 80 90 100 90.00
The average score of Zhanghua is 90.00
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 18/27
6-6 随机题目池 6 (1 选 1) 每题 5 分
6-6-1 Circle 类用于描述一个圆:
包含一个数据成员:圆的半径,默认为0
包含成员函数 getArea ,用于获取圆的面积, 取3.14
两个圆可以相加,相加的操作规定为:两个圆的半径相加请完善程序。
函数接口定义:
输入样例:
输入两个圆的半径。例如:
输出样例:
输出 c3 的面积。例如:
| 教师提交
代码 | 编译器: GXX class Circle{ |
double r; public:
Circle(double _r=0) {
r=_r; }d ouble getArea() {
return 3.14*r*r;
π
#include <iostream> using namespace std;
// 请将答案填在这里
int main() { double r1, r2;
cin >> r1 >> r2; // 输入两个圆的半径
Circle c1(r1), c2(r2), c3; // 创建两个圆cout << c3.getArea() << endl;
c3 = c1 + c2;
cout << c3.getArea() << endl; return 0;
}
const Circle operator+(const Circle& c) {
return Circle(r+c.r);
} };
| 参考答案
答案 编译器: GXX
6-7 随机题目池 7 (1 选 1) 每题 5 分
6-7-1 | Shape 类用于描述形状,要求如下:包含两个数据成员:形状的名称、形状的颜色 |
构造函数,按规定格式输出形状的名称析构函数,按规定格式输出形状的名称成员函数 getName ,返回该形状的名称成员函数 getColor ,返回该形状的颜色
成员函数 getArea ,返回该形状的面积,默认返回0
成员函数 getPerimeter ,返回该形状的周长,默认返回0
成员函数 draw ,用于绘制图形,按规定格式输出形状的颜色请完善 Shape 的定义。
裁判测试程序样例:
#include <iostream> #include <string> using namespace std;
// 请将答案填写在这里
void display(Shape *p) {
cout << "name: " << p->getName() << endl << "area: " << p->getArea() << endl
<< "perimeter: " << p->getPerimeter() << endl; } i nt main() { Shape *p;
string color;
cin >> color; // 输入形状的颜色
// 测试Shape类
p = new Shape("1-Shape", color); display(p);
p->draw(); delete p;
123456789
输入样例:
输入形状的颜色:
输出样例:
第1行是构造函数的输出;第2、3、4行是 display 函数的输出;第5行是 draw 函数的输出;第6行是析构函数的输出:
| 教师提交
return 0; }
25
26
red
create Shape: 1-Shape
name: 1-Shape
area: 0
perimeter: 0 draw Shape, color: red
destroy Shape: 1-Shape
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 21/27
代码 编译器: GXX
class Shape{ protected:
string name,color; public:
Shape(string _name, string _color) {
name=_name; color=_color;
cout<<"create Shape: "<<name<<endl;
}~ Shape() {
cout<<"destroy Shape: "<<name<<endl; }s tring getName() {
return name; }s tring getColor() {
return color; }d ouble getArea() {
return 0; }d ouble getPerimeter() {
return 0; }v oid draw() {
cout<<"draw Shape, color: "<<color<<endl;
} };
| 参考答案
答案 编译器: GXX
6-8 随机题目池 8 (1 选 1) 每题 5 分
6-8-1 该题的 Shape 类与上一题一样。
Shape 类用于描述形状,要求如下:
包含两个数据成员:形状的名称、形状的颜色
构造函数,按规定格式输出形状的名称析构函数,按规定格式输出形状的名称成员函数 getName ,返回该形状的名称成员函数 getColor ,返回该形状的颜色
成员函数 getArea ,返回该形状的面积,默认返回0
成员函数 getPerimeter ,返回该形状的周长,默认返回0成员函数 draw ,用于绘制图形,按规定格式输出形状的颜色
Square 类用于描述正方形,继承自 Shape 类
成员函数 draw ,用于绘制图形,按规定格式输出正方形的颜色、边长
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 22/27
Rect 类用于描述长方形,继承自 Shape 类
成员函数 draw ,用于绘制图形,如果宽、高相等,按规定格式输出边长,否则按规定格式输出宽、高
请完善 Shape 、 Square 、 Rect 三个类的定义。
裁判测试程序样例:
#include <iostream> #include <string> using namespace std;
// 请将代码填写在这里
void display(Shape *p) {
cout << "name: " << p->getName() << endl << "area: " << p->getArea() << endl
<< "perimeter: " << p->getPerimeter() << endl; } i nt main() { Shape *p;
int choice; int length; int width, height; string color;
cin >> choice; // 输入测试序号cin >> color; // 输入形状的颜色
switch (choice) { case 1:
// 测试Shape类
p = new Shape("1-Shape", color); display(p);
p->draw(); delete p;
break; case 2:
// 测试Square类
cin >> length; // 正方形的边长
p = new Square("2-Square", color, length);
display(p); p->draw(); delete p;
break; case 3:
// 测试Rect类
cin >> width >> height; // 长方形的宽和高
p = new Rect("3-Rect", color, width, height);
display(p); p->draw(); delete p;
break; default:
break; }
123456789
测试1: Shape类
输入序号1、形状的颜色:
输出样例:
第1行是构造函数的输出;第2、3、4行是 display 函数的输出;第5行是 draw 函数的输出;第6行是析构函数的输出:
测试2: Square类
输入测试序号2、正方形的颜色、边长:
输出样例:
第1、2行是构造函数的输出;第3、4、5行是 display 函数的输出;第6行是 draw 函数的输出;第7、8行是析构函数的输出:
测试3:Rect类(宽、高不相等的情况)
输入测试序号3、长方形的颜色、宽、高。例如:
输出样例:
return 0; }
49
50
51
1r ed
create Shape: 1-Shape
name: 1-Shape
area: 0
perimeter: 0 draw Shape, color: red
destroy Shape: 1-Shape
2r ed 3 c
reate Shape: 2-Square
create Square: 2-Square
name: 2-Square
area: 9
perimeter: 12
draw Square, color: red, length: 3
destroy Square: 2-Square destroy Shape: 2-Square
3r
ed
3 4
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
第1、2行是构造函数的输出;第3、4、5行是 display 函数的输出;第6行是 draw 函数的输出;第7、8行是析构函数的输出。例如:
测试4:Rect类(宽、高相等的情况)
输入测试序号3、长方形的颜色、宽、高。例如:
输出样例:
第1、2行是构造函数的输出;第3、4、5行是 display 函数的输出;第6行是 draw 函数的输出;第7、8行是析构函数的输出。例如:
| 教师提交
代码 编译器: GXX
class Shape{ protected:
string name,color; public:
Shape(string _name, string _color) {
name=_name; color=_color;
cout<<"create Shape: "<<name<<endl; }v irtual ~Shape() {
cout<<"destroy Shape: "<<name<<endl; }s tring getName() {
return name; }s tring getColor() {
return color;
create Shape: 3-Rect
create Rect: 3-Rect
name: 3-Rect
area: 12
perimeter: 14
draw Rect, color: red, width: 3, height: 4
destroy Rect: 3-Rect destroy Shape: 3-Rect
3r
ed
3 3
create Shape: 3-Rect
create Rect: 3-Rect
name: 3-Rect
area: 9
perimeter: 12
draw Square, color: red, length: 3
destroy Rect: 3-Rect destroy Shape: 3-Rect
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 25/27
}v irtual double getArea()
{
return 0; }v irtual double getPerimeter() {
return 0; }v irtual void draw() {
cout<<"draw Shape, color: "<<color<<endl;
} };
class Square:public Shape {
int length; public:
Square(string _name, string _color, int l):Shape(_name,_color) {
length=l;
cout<<"create Square: "<<name<<endl; }
double getArea() {
return length*length; }d ouble getPerimeter() {
return length*4; }v oid draw() {
cout<<"draw Square, color: "<<color<<", length: " <<length<<endl;
}~ Square() {
cout<<"destroy Square: "<<name<<endl;
} };
class Rect:public Shape {
int width, height; public:
Rect(string _name, string _color, int w,int h):Shape(_name,_color) {
width=w; height=h;
cout<<"create Rect: "<<name<<endl; }
double getArea() {
return width*height; }d ouble getPerimeter() {
return 2*(width+height); }v oid draw() {
if(width==height)
cout<<"draw Square, color: "<<color<<", length: "<<width<<endl; else
6/6/24, 5:54 PM PTA | 程序设计类实验辅助教学平台
https://pintia.cn/problem-sets/1793236790085091328/paper/type/answer 26/27
cout<<"draw Rect, color: "<<color<<", width: "<<width<<", height: "<<height<<endl;
}~ Rect() {
cout<<"destroy Rect: "<<name<<endl;
} };