Главная страница
Навигация по странице:

  • 1. Задание для работы

  • Код программы на языке C++

  • Результат работы программы на языке C ++

  • итоговый отчет 1. Лабораторная работа 2 Классы. Основы 12 Лабораторная работа 3 Классы. Инкапсуляция 16


    Скачать 129.17 Kb.
    НазваниеЛабораторная работа 2 Классы. Основы 12 Лабораторная работа 3 Классы. Инкапсуляция 16
    Дата14.01.2022
    Размер129.17 Kb.
    Формат файлаdocx
    Имя файлаитоговый отчет 1.docx
    ТипЛабораторная работа
    #331247
    страница5 из 5
    1   2   3   4   5

    Лабораторная работа №5
    Наследование. Полиморфизм



    Цель работы:приобретение практических навыков применения наследования и полиморфизма как основных принципов объектно-ориентированного программирования при разработке программ на языке C++, включая рассмотрение следующих вопросов:

    1. Одиночное наследование классов.

    2. Допустимые привидения типов при наследовании.

    3. Автоматическое приведение класса-наследника к базовому классу (аргумент функции, прямое присваивание).

    4. Модификаторы наследования.

    5. Ключевое слово virtual и полиморфизм методов.

    1. Задание для работы

    1. Построить иерархию классов: Shape (Фигура) -> Circle (Круг) -> Torus (Тор) –> Rectangle (Прямоугольник)

    2. Написать программу, которая:

    2.1. Считывает с консоли количество фигур.

    2.2. В цикле считывает параметры фигур. Сначала запрашивается тип фигуры и создается объект нужного класса. Затем у объекта вызывается метод read() и вводятся характеристики объекта (радиус для круга, расстояние от центра образующей окружности до оси вращения и радиус образующей окружности для тора, длины стороны для прямоугольника, и т.д.).

    2.3. Считанные объекты помещаются в массив.

    2.4. Производится поиск фигуры, имеющей максимальную площадь или площадь поверхности (для объемных фигур). Производится вывод найденной фигуры на экран.

    1. Код программы на языке C++

    В результате выполнения задания была разработана программа на языке C++, код которой приведен ниже:

    // файл Shape.h

    #pragma once

    #include "StdAfx.h"

    #include

    #include
    using namespace std;
    class Shape

    {

    private:

    virtual void calculate();
    protected:

    double S;

    string name;

    virtual ostream& print(ostream& out);
    public:

    Shape(string NAME = "undefined");

    virtual Shape();
    virtual void read();

    double get_area();

    string get_name();
    friend ostream& operator<<(ostream& out, Shape& item);

    };
    // файл Shape.cpp

    #include "StdAfx.h"

    #include "Shape.h"
    Shape::Shape(string NAME) : name (NAME), S(0)

    {

    cout << "Сработал конструктор класса Shape для фигуры " << name <<

    endl;

    }
    Shape::Shape()

    {

    cout << "Сработал деструктор класса Shape для фигуры " << name <<

    endl;

    }
    void Shape::read()

    {

    cout << "Введите параметры фигуры " << name << ":" << endl;

    }
    double Shape::get_area()

    {

    return S;

    }
    string Shape::get_name()

    {

    return name;

    }
    void Shape::calculate()

    {

    }

    ostream& Shape::print(ostream& out)

    {

    out << "Фигура " << name << " имеет следующие параметры: " << endl;

    out << "Площадь = " << S << endl;

    return out;

    }
    ostream& operator<<(ostream& out, Shape& item)

    {

    return item.print(out);

    }

    // файл circle.h

    #pragma once

    #include "StdAfx.h"

    #include "shape.h"
    class Circle : public Shape

    {

    private:

    virtual void calculate();

    protected:

    double r;

    ostream& print(ostream& out);

    public:

    Circle(string name = "Круг", double R=0);

    virtual Circle();

    virtual void read();

    };

    // файл Circle.cpp

    #include "StdAfx.h"

    #define _USE_MATH_DEFINES

    #include

    #include "circle.h"
    Circle::Circle(string NAME, double R) : Shape(NAME), r(R)

    {

    cout << "Сработал конструктор класса Circle для фигуры " << name << endl;

    }
    Circle::Circle()

    {

    cout << "Сработал деструктор класса Circle для фигуры " << name << endl;

    }
    void Circle::read()

    {

    Shape::read();

    cout << "Радиус: ";

    cin >> r;

    calculate();

    }
    void Circle::calculate()

    {

    S = M_PI * r * r;

    }
    ostream& Circle::print(ostream& out)

    {

    Shape::print(out);

    out << "Радиус = " << r << endl;

    return out;

    }

    // файл torus.h

    #pragma once

    #include "StdAfx.h"

    #include "circle.h"
    class Torus : public Circle

    {

    private:

    void calculate();

    protected:

    double r, R;

    ostream& print(ostream& out);

    public:

    Torus(string name = "Тор", double r = 0, double R=0);

    virtual Torus();

    void read();

    };

    // файл Torus.cpp

    #include "StdAfx.h"

    #include "torus.h"
    Torus::Torus(string NAME, double R, double r) : Circle(NAME, R)

    {

    cout << "Сработал конструктор класса Sphere для фигуры " << name << endl;

    }
    Torus::Torus()

    {

    cout << "Сработал деструктор класса Sphere для фигуры " << name << endl;

    }
    void Torus::read()

    {

    cout << "Внешний радиус: ";

    cin >> r;

    cout << "Внутренний радиус: ";

    cin >> R;

    calculate();

    }
    void Torus::calculate()

    {

    S = 2 * 3.14 * 3.14 * R * r * r;

    }
    ostream& Torus::print(ostream& out)

    {

    Shape::print(out);

    out << "Расстояние от центра образующей окружности r = " << r << endl;

    out << "Радиус образующей окружности R = " << R << endl;

    return out;

    }

    // файл Rectangle.h

    #pragma once

    #include "StdAfx.h"

    #include "Shape.h"
    class Rectangle : public Shape

    {

    private:

    void calculate();

    protected:

    double length;

    double width;

    ostream& print(ostream& out);

    public:

    Rectangle(string name = "Прямоугольник", double LENGTH = 0, double WIDTH = 0);

    Rectangle();

    void read();

    };

    // файл Rectangle.cpp

    #include "StdAfx.h"

    #include "rectangle.h"
    Rectangle::Rectangle(string NAME, double LENGTH, double WIDTH) : Shape(NAME), length(LENGTH), width(WIDTH)

    {

    cout << "Сработал конструктор класса Rectangle для фигуры " << name << endl;

    }
    Rectangle::Rectangle()

    {

    cout << "Сработал деструктор класса Rectangle для фигуры " << name << endl;

    }
    void Rectangle::read()

    {

    Shape::read();

    cout << "Длина: ";

    cin >> length;

    cout << "Ширина: ";

    cin >> width;

    calculate();

    }
    void Rectangle::calculate()

    {

    S = length * width;

    }
    ostream& Rectangle::print(ostream& out)

    {

    Shape::print(out);

    out << "Длина = " << length << endl;

    out << "Ширина = " << width << endl;

    return out;

    }
    // файл main.cpp

    #include "StdAfx.h"

    #include "shape.h"

    #include "torus.h"

    #include "circle.h"

    #include "rectangle.h"

    #include
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])

    {

    setlocale(LC_ALL, "Russian");

    cout << "Введите количество фигур: ";

    int n;

    cin >> n;

    if (n <= 0)

    {

    cout << "Количество фигур должно быть >= 0" << endl;

    system("pause");

    return 0;

    }

    Shape **arr = new Shape*[n];

    int choose;

    cout << "Выберите фигуру:" << endl;

    cout << "1 - Прямоугольник\n";

    cout << "2 - Тор\n";

    cout << "3 - Окружность\n";

    for (int i = 0; i < n; i++)

    {

    cout << "Выберите фигуру. Для этого введите цифру, соответствующую её типу." << endl;

    cout << "Введите тип фигуры №" << i + 1 << ":";

    cin >> choose;

    switch (choose)

    {

    case 1:

    arr[i] = new Rectangle;

    break;

    case 2:

    arr[i] = new Torus;

    break;

    case 3:

    arr[i] = new Circle ;

    break;

    default:

    cout << "Ошибка\n";

    break;

    }

    arr[i]->read();

    cout << *(arr[i]) << endl;

    }

    int max_Si = 0;

    for (int i = 0; i < n; i++)

    if (arr[i]->get_area() > arr[max_Si]->get_area())

    max_Si = i;

    cout << "Самую большую площадь имеет фигура " << arr[max_Si]->get_name() << " :\n";

    cout << *arr[max_Si] << endl;
    for (int i = 0; i < n; i++)

    delete arr[i];

    delete[] arr;

    system("pause");

    return 0;

    }


    1. Результат работы программы на языке C++

    Введите количество фигур: 3

    Выберите фигуру:

    1 - Прямоугольник

    2 - Тор

    3 - Окружность

    Выберите фигуру. Для этого введите цифру, соответствующую её типу.

    Введите тип фигуры №1:1

    Сработал конструктор класса Shape для фигуры Прямоугольник

    Сработал конструктор класса Rectangle для фигуры Прямоугольник

    Введите параметры фигуры Прямоугольник:

    Длина: 2

    Ширина: 4

    Фигура Прямоугольник имеет следующие параметры:

    Площадь = 8

    Длина = 2

    Ширина = 4
    Выберите фигуру. Для этого введите цифру, соответствующую её типу.

    Введите тип фигуры №2:2

    Сработал конструктор класса Shape для фигуры Тор

    Сработал конструктор класса Circle для фигуры Тор

    Сработал конструктор класса Sphere для фигуры Тор

    Внешний радиус: 1

    Внутренний радиус: 2

    Фигура Тор имеет следующие параметры:

    Площадь = 39.4384

    Расстояние от центра образующей окружности r = 1

    Радиус образующей окружности R = 2
    Выберите фигуру. Для этого введите цифру, соответствующую её типу.

    Введите тип фигуры №3:3

    Сработал конструктор класса Shape для фигуры Круг

    Сработал конструктор класса Circle для фигуры Круг

    Введите параметры фигуры Круг:

    Радиус: 4

    Фигура Круг имеет следующие параметры:

    Площадь = 50.2655

    Радиус = 4
    Самую большую площадь имеет фигура Круг :

    Фигура Круг имеет следующие параметры:

    Площадь = 50.2655

    Радиус = 4
    Сработал деструктор класса Rectangle для фигуры Прямоугольник

    Сработал деструктор класса Shape для фигуры Прямоугольник

    Сработал деструктор класса Sphere для фигуры Тор

    Сработал деструктор класса Circle для фигуры Тор

    Сработал деструктор класса Shape для фигуры Тор

    Сработал деструктор класса Circle для фигуры Круг

    Сработал деструктор класса Shape для фигуры Круг

    Для продолжения нажмите любую клавишу . . .
    1   2   3   4   5


    написать администратору сайта