问题描述
题目描述
考虑一个简单的图形类层次结构,包括基类 Shape 和两个派生类 Rectangle 和 Circle。每个类都有一个用于计算面积的方法。你的任务是编写一个程序,根据输入数据创建一个图形对象,然后计算并输出其面积。
输入描述
输入包括多行,每行包含一个图形的描述。 描述的第一个单词是图形类型("rectangle"或"circle"),然后是与该图形相关的参数。 对于矩形,参数是宽度和高度,对于圆形,参数是半径。输入以单词"end"结束。
输出描述
对于每个图形描述,输出其类型和面积。使用两位小数点精度输出面积。
输入示例
rectangle 5 3
circle 2
end
输出示例
Rectangle area: 15.00
Circle area: 12.56
提示信息
长方形面积的计算 = 长 * 宽
圆形面积的计算 = 3.14 * 半径 * 半径
python解法
# Shape类
class Shape:
def __init__(self, shape_type):
self.type = shape_type
def calculate_area(self):
pass
# Rectangle类,包含width和height,并计算面积的方法
class Rectangle(Shape):
def __init__(self, width, height):
super().__init__("Rectangle")
self.width = width
self.height = height
def calculate_area(self):
return self.width * self.height
# Circle类,包含radius,计算面积的方法
class Circle(Shape):
def __init__(self, radius):
super().__init__("Circle")
self.radius = radius
def calculate_area(self):
return 3.14 * self.radius * self.radius
shapes = []
while True:
data = input().split()
shape_type = data[0]
# 处理输出
if shape_type == "end":
break
if shape_type == "rectangle":
# 获取输入的width和height,将之转换成整数
width, height = int(data[1]), int(data[2])
# 新建一个对象,append到列表中
shapes.append(Rectangle(width, height))
if shape_type == "circle":
# 获取输入的radius,将之转换成整数
radius = int(data[1])
# 新建一个对象,append到列表中
shapes.append(Circle(radius))
for shape in shapes:
# 不同类别的对象调用同一个方法,有不同的处理逻辑
print("{} area: {:.2f}".format(shape.type, shape.calculate_area()))
C++解法
#include <iostream>
#include <vector>
#include <string>
// 引入iomanip库文件,用于控制输出格式
#include <iomanip>
// Shape类
class Shape{
public:
// 定义计算面积和获取类型的纯虚函数
virtual double CalculateArea() const = 0;
virtual std::string GetType() const = 0;
};
// Rectangle类
class Rectangle : public Shape{
// 属性: 宽度和高度
private:
int width;
int height;
public:
// 初始化参数列表
Rectangle(int width, int height) : width(width), height(height){}
// 计算长方形面积,将整数转换为浮点数
double CalculateArea() const override{
return static_cast<double>(width*height);
}
// 获取图形的形状
std::string GetType() const override{
return "Rectangle";
}
};
class Circle : public Shape{
// 属性: 半径
private:
int radius;
public:
// 初始化参数列表
Circle(int radius) : radius(radius) {}
// 计算圆的面积
double CalculateArea() const override {
return 3.14 * radius * radius;
}
// 获取图形的形状
std::string GetType() const override{
return "Circle";
}
};
int main(){
// 定义一个容器,容纳shape对象
std::vector<Shape*> shapes;
while (true){
// 获取输入的type类型
std::string type;
std::cin >> type;
if (type == "end"){
break;
}
if (type == "rectangle"){
// 获取输入的宽度和高度
int width, height;
std::cin >> width >> height;
// 新建Rectangle对象
shapes.push_back(new Rectangle(width, height));
}
else if (type == "circle"){
// 获取输入的半径
int radius;
std::cin >> radius;
// 新建Radius对象
shapes.push_back(new Circle(radius));
}
}
// 输出结果,控制小数位数为两位
for (auto shape : shapes){
// shape对象调用同一个方法,有不同的处理逻辑
std::cout << shape->GetType() << " area: " <<std::fixed << std::setprecision(2) << shape->CalculateArea() << std::endl;
}
return 0;
}