Разработать класс Reservoir (водоем).
Написать интерфейс для работы с классом. Реализовать
динамический массив объектов класса с возможностью
добавления, удаления объектов из массива. Реализовать
возможность записи информации об объектах массива
в текстовый файл, бинарный файл.
Используйте explicit конструктор и константные функциичлены (например, для отображения данных о водоёме и т.д.).
cpp
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
class Reservoir
{
public:
Reservoir(const std::string& name, double area, double volume, double maxDepth, double temperature)
: m_name(name), m_area(area), m_volume(volume), m_maxDepth(maxDepth), m_temperature(temperature)
{}
// Константные функции для отображения данных о водоеме
void displayReservoir() const
{
std::cout << "Название водоема: " << m_name << std::endl;
std::cout << "Площадь: " << m_area << " км^2" << std::endl;
std::cout << "Объем: " << m_volume << " км^3" << std::endl;
std::cout << "Максимальная глубина: " << m_maxDepth << " м" << std::endl;
std::cout << "Температура воды: " << m_temperature << " °C" << std::endl;
}
// Геттеры и сеттеры для доступа и изменения данных о водоеме
std::string getName() const { return m_name; }
void setName(const std::string& name) { m_name = name; }
double getArea() const { return m_area; }
void setArea(double area) { m_area = area; }
double getVolume() const { return m_volume; }
void setVolume(double volume) { m_volume = volume; }
double getMaxDepth() const { return m_maxDepth; }
void setMaxDepth(double maxDepth) { m_maxDepth = maxDepth; }
double getTemperature() const { return m_temperature; }
void setTemperature(double temperature) { m_temperature = temperature; }
private:
std::string m_name;
double m_area;
double m_volume;
double m_maxDepth;
double m_temperature;
};
// Интерфейс для работы с классом Reservoir
class ReservoirInterface
{
public:
// Добавление нового водоема в массив
virtual void addReservoir(const Reservoir& reservoir) = 0;
// Удаление водоема из массива по индексу
virtual void removeReservoir(int index) = 0;
// Запись информации обо всех водоемах в текстовый файл
virtual void saveReservoirsText(const std::string& fileName) const = 0;
// Запись информации обо всех водоемах в бинарный файл
virtual void saveReservoirsBinary(const std::string& fileName) const = 0;
};
// Реализация интерфейса ReservoirInterface
class ReservoirArray : public ReservoirInterface
{
public:
void addReservoir(const Reservoir& reservoir) override
{
m_reservoirs.push_back(reservoir);
}
void removeReservoir(int index) override
{
if (index >= 0 && index < m_reservoirs.size())
{
m_reservoirs.erase(m_reservoirs.begin() + index);
}
}
void saveReservoirsText(const std::string& fileName) const override
{
std::ofstream file(fileName);
if (file.is_open())
{
for (const Reservoir& reservoir : m_reservoirs)
{
file << "Название водоема: " << reservoir.getName() << std::endl;
file << "Площадь: " << reservoir.getArea() << " км^2" << std::endl;
file << "Объем: " << reservoir.getVolume() << " км^3" << std::endl;
file << "Максимальная глубина: " << reservoir.getMaxDepth() << " м" << std::endl;
file << "Температура воды: " << reservoir.getTemperature() << " °C" << std::endl;
file << std::endl;
}
file.close();
}
else
{
std::cout << "Ошибка открытия файла!" << std::endl;
}
}
void saveReservoirsBinary(const std::string& fileName) const override
{
std::ofstream file(fileName, std::ios::binary);
if (file.is_open())
{
for (const Reservoir& reservoir : m_reservoirs)
{
file.write(reinterpret_cast<const char*>(&reservoir), sizeof(reservoir));
}
file.close();
}
else
{
std::cout << "Ошибка открытия файла!" << std::endl;
}
}
private:
std::vector<Reservoir> m_reservoirs;
};
int main()
{
ReservoirArray array;
Reservoir reservoir1("Волга", 1000, 2000, 10, 20);
array.addReservoir(reservoir1);
Reservoir reservoir2("Онежское озеро", 200, 500, 30, 15);
array.addReservoir(reservoir2);
Reservoir reservoir3("Байкал", 500, 1000, 50, 10);
array.addReservoir(reservoir3);
array.removeReservoir(1);
array.saveReservoirsText("reservoirs.txt");
array.saveReservoirsBinary("reservoirs.bin");
return 0;
}
В данном примере класс Reservoir имеет конструктор с параметрами для инициализации данных о водоеме. Имеются геттеры и сеттеры для доступа и изменения данных. В классе также имеются методы для отображения данных о водоеме и для записи информации обо всех водоемах в текстовый и бинарный файлы.
Для работы с классом Reservoir используется интерфейс ReservoirInterface, который определяет абстрактные методы для добавления и удаления водоемов, а также для сохранения информации обо всех водоемах в файлах. Класс ReservoirArray реализует этот интерфейс и предоставляет функциональность для работы с массивом водоемов.
В методе main() создается объект класса ReservoirArray и добавляются несколько водоемов. Затем вызывается метод removeReservoir() для удаления одного из водоемов. После этого вызываются методы saveReservoirsText() и saveReservoirsBinary() для сохранения информации обо всех водоемах в текстовый и бинарный файлы соответственно.
Таким образом, предоставляя возможность добавления, удаления и сохранения водоемов в файлы, класс Reservoir и интерфейс ReservoirInterface позволяют удобно и эффективно управлять информацией о водоемах.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет