每日打卡-29

leapssisbird / 2023-05-24 / 原文

一.问题描述

定义抽象基类Shape,由它派生出五个派生类:Circle(圆形)、Square(正方形)、Rectangle( 长方形)、Trapezoid (梯形)和Triangle (三角形),用虚函数分别计算各种图形的面积,输出它们的面积和。要求用基类指针数组,每一个数组元素指向一个派生类的对象。PI=3.14159f,单精度浮点数计算。

二.设计思路

三.流程图

四.伪代码 

1

五.代码实现 

#include<iostream>
#include<iomanip>
using namespace std;

class Shape
{
public:
	virtual double area() const = 0;
};

class Circle :public Shape
{
public:
	Circle(double r) :radius(r) { }
	virtual double area() const
	{
		return 3.14159 * radius * radius;
	}
protected:
	double radius;
};

class Square :public Shape
{
public:
	Square(double s) :side(s)
	{

	}
	virtual double area() const
	{
		return side * side;
	}
protected:
	double side;
};

class Rectangle :public Shape
{
public:
	Rectangle(double w, double h) :width(w), height(h)
	{

	}
	virtual double area() const
	{
		return width * height;
	}
protected:
	double width, height;
};

class Trapezoid :public Shape
{
public:
	Trapezoid(double t, double b, double h) :top(t), bottom(b), height(h)
	{

	}
	virtual double area() const
	{
		return 0.5 * (top + bottom) * height;
	}
protected:
	double top, bottom, height;

};

class Triangle :public Shape
{
public:
	Triangle(double w, double h) :width(w), height(h)
	{

	}
	virtual double area() const
	{
		return 0.5 * width * height;
	}
protected:
	double width, height;
};

int main()
{
	double a, b, c;
	cin >> a;
	Circle a1(a);
	cin >> a;
	Square a2(a);
	cin >> a >> b;
	Rectangle a3(a, b);
	cin >> a >> b >> c;
	Trapezoid a4(a, b, c);
	cin >> a >> b;
	Triangle a5(a, b);
	Shape* pt[5] =
	{
		&a1,&a2,&a3,&a4,&a5
	};
	double areas = 0.0;
	for (int i = 0; i < 5; i++)
	{
		areas = areas + pt[i]->area();
	}
	cout << fixed << setprecision(3) << areas << endl;
	return 0;
}