课后习题(2)

发布时间 2023-04-18 20:25:14作者: 石铁生

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

输入格式:

请在这里写输入格式。例如:输入在一行中给出9个大于0的数,用空格分隔,分别代表圆的半径,正方形的边长,矩形的宽和高,梯形的上底、下底和高,三角形的底和高。

输出格式:

请在这里描述输出格式。例如:输出所有图形的面积和,小数点后保留3位有效数字。

输入样例:

在这里给出一组输入。例如:

12.6 3.5 4.5 8.4 2.0 4.5 3.2 4.5 8.4
 

输出样例:

在这里给出相应的输出。例如:

total of all areas = 578.109
设计思路:
1.定义一个基类Shape,衍生出子类Circle(圆形)、Square(正方形)、Rectangle( 长方形)、Trapezoid (梯形)和Triangle (三角形)包含构造函数和一个求面积的虚函数。
2.在主函数中定义一个基类指针数组,使它的每一个元素指向一个派生类对象。宏定义一个PI值为3.1415926.
流程图:

 代码实现:

#include<iostream>
using namespace std;
#define PI 3.1415926
class Shape {//基类
public:
    virtual double area() = 0;
};
class Circle :public Shape//圆面积
{
private:
    double radius;
public:
    Circle(double a)
    {
        radius = a;
    }
    virtual double area()
    {
        return PI * radius * radius;
    }
};
class Square :public Shape//正方形面积
{
private:
    double x;
public:
    Square(double a)
    {
        x = a;
    }
    virtual double area()
    {
        return x * x;
    }
};
class Rectangle : public Shape//长方形面积
{
private:
    double l, w;
public:
    Rectangle(double a, double b)
    {
        l = a;
        w = b;
    }
    virtual double area()
    {
        return l* w;
    }
};
class Trapezoid :public Shape//梯形面积
{
private:
    double d1, d2, h;
public:
    Trapezoid(double a, double b, double c)
    {
        d1 = a;
        d2 = b;
        h = c;
    }
    virtual double area()
    {
        return (d1 + d2) * h / 2;
    }
};
class Triangle :public Shape//三角形面积
{
private:
    double d, h;
public:
    Triangle(double a, double b)
    {
        d = a;
        h = b;
    }
    virtual double area()
    {
        return d * h / 2;
    }
};
int main()
{
    double x1, x2, x3, x4, x5, x6, x7, x8, x9;
    cin >> x1 >> x2 >> x3 >> x4 >> x5 >> x6 >> x7 >> x8 >> x9;
    Shape* shape[5] = { new Circle(x1),new Square(x2),new Rectangle(x3,x4),new Trapezoid(x5,x6,x7),new Triangle(x8,x9) };
    double s;
    s = shape[0]->area() + shape[1]->area() + shape[2]->area() + shape[3]->area() + shape[4]->area();
    cout << "total of all areas = " << s;
    return 0;
}

声明抽象基类Shape,由它派生出三个类,圆形Circle,矩形Rectangle,三角形Triangle,用一个函数输出三个面积。

输入格式:

在一行中依次输入5个数,圆的半径,长方形的高和宽,三角形的高和底,中间用空格分隔

输出格式:

圆的面积,长方形的面积,三角形的面积,小数点后保留2位有效数字,每个面积占一行。

输入样例:

在这里给出一组输入。例如:

3 3 4 3 4
 

输出样例:

在这里给出相应的输出。例如:

28.27
12.00
6.00
设计思路:
1.声明抽象基类Shape,由它派生出三个类,圆形Circle,矩形Rectangle,三角形Triangle。
2.定义一个有五个值的函数,调用圆,矩形,三角形面积。
3.输入五个值,用于计算各个面积。
3.输出结果。
流程图:

 代码实现:

#include<iostream>
#include<iomanip>
using namespace std;
#define PI 3.1415926
class Shape {
public:
    virtual void area() = 0;
};
class Circle :public Shape
{
private:
    double radius;
public:
    Circle(double a)
    {
        radius = a;
    }
    virtual void area()
    {
        cout<< fixed << setprecision(2) << PI * radius * radius<<endl;
    }
};
class Rectangle : public Shape
{
private:
    double l, w;
public:
    Rectangle(double a, double b)
    {
        l = a;
        w = b;
    }
    virtual void area()
    {
        cout<<fixed<<setprecision(2)<<l* w<<endl;
    }
};

class Triangle :public Shape
{
private:
    double d, h;
public:
    Triangle(double a, double b)
    {
        d = a;
        h = b;
    }
    virtual void area()
    {
        cout<<fixed<<setprecision(2)<< d * h / 2<<endl;
    }
};
void Area(double x1, double x2, double x3, double x4, double x5)
{
    Shape* shape[3] = { new Circle(x1),new Rectangle(x2,x3),new Triangle(x4,x5) };
    shape[0]->area();
    shape[1]->area();
    shape[2]->area();
}
int main()
{
    double a1, a2, a3, a4, a5;
    cin >> a1 >> a2 >> a3 >> a4 >> a5;
    Area(a1, a2, a3, a4, a5);
    return 0;
}