c++图形题练习程序

一.练习题背景

这题是作者再一家公司实习的时候,实习期间的一个考核题目,感觉还是比较有价值的。希望能给还在努力的学弟学妹们一些启发。

题目大致就是要求用继承和多态来实现圆、三角形和长方形的面积和周长求解。这步的大致思路是这样的,你需要将整体的图形类抽象出来,提取出它们共有的一些特性。比如说都是计算周长和面积,那这部分就再父类抽象出来,子类复现就行。

二.程序展示

以下是一个基于 C++ 的几何图形类练习程序,实现了形状基类及其派生类(圆、三角形、长方形),并计算不同形状的面积和与周长和:

#include <iostream>
#include <cmath> // 用于三角形面积计算(海伦公式)
using namespace std;
#define M_PI 3.14

// 形状基类
class Shape {
public:
    // 纯虚函数:计算面积和周长(基类不实现,由派生类重写)
    virtual double area() const = 0;
    virtual double perimeter() const = 0;
    // 虚函数:输出形状信息(派生类可重写)
    virtual void print() const = 0;
};

// 圆类(派生自Shape)
class Circle : public Shape {
private:
    double radius; // 半径
public:
    // 构造函数
    Circle(double r) : radius(r) {}

    // 计算面积:πr²
    double area() const override {
        return M_PI * radius * radius;
    }

    // 计算周长:2πr
    double perimeter() const override {
        return 2 * M_PI * radius;
    }

    // 输出圆的信息
    void print() const override {
        cout << "圆:半径=" << radius
            << ",面积=" << area()
            << ",周长=" << perimeter() << endl;
    }
};

// 长方形类(派生自Shape)
class Rectangle : public Shape {
private:
    double length;  // 长
    double width;   // 宽
public:
    // 构造函数
    Rectangle(double l, double w) : length(l), width(w) {}

    // 计算面积:长×宽
    double area() const override {
        return length * width;
    }

    // 计算周长:2×(长+宽)
    double perimeter() const override {
        return 2 * (length + width);
    }

    // 输出长方形信息
    void print() const override {
        cout << "长方形:长=" << length << ",宽=" << width
            << ",面积=" << area()
            << ",周长=" << perimeter() << endl;
    }
};

// 三角形类(派生自Shape)
class Triangle : public Shape {
private:
    double a, b, c; // 三边长
public:
    // 构造函数(简单判断三角形合法性)
    Triangle(double x, double y, double z) : a(x), b(y), c(z) {
        if (a + b <= c || a + c <= b || b + c <= a) {
            cout << "警告:三边无法构成三角形!" << endl;
        }
    }

    // 计算面积(海伦公式)
    double area() const override {
        double s = (a + b + c) / 2; // 半周长
        return sqrt(s * (s - a) * (s - b) * (s - c));
    }

    // 计算周长:三边之和
    double perimeter() const override {
        return a + b + c;
    }

    // 输出三角形信息
    void print() const override {
        cout << "三角形:三边长=" << a << "," << b << "," << c
            << ",面积=" << area()
            << ",周长=" << perimeter() << endl;
    }
};

int main() {
    // 定义三个不同派生类对象(示例数据)
    Shape* shape1 = new Circle(5.0);       // 半径为5的圆
    Shape* shape2 = new Rectangle(4.0, 6.0); // 长4、宽6的长方形
    Shape* shape3 = new Triangle(3.0, 4.0, 5.0); // 直角三角形(3,4,5)

    // 输出各形状信息
    cout << "各形状信息:" << endl;
    shape1->print();
    shape2->print();
    shape3->print();

    // 计算面积之和与周长之和
    double totalArea = shape1->area() + shape2->area() + shape3->area();
    double totalPerimeter = shape1->perimeter() + shape2->perimeter() + shape3->perimeter();

    // 输出总和
    cout << "\n面积之和:" << totalArea << endl;
    cout << "周长之和:" << totalPerimeter << endl;

    // 释放动态内存
    delete shape1;
    delete shape2;
    delete shape3;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值