3 - Классы в C++. Работа с файлами, массивами объектов и алгоритмами обработки данных (Часть 2)

Лабораторная работа 3 для студентов курса “Программирование на основе классов и шаблонов” 2 семестра кафедры ИУ5 МГТУ им Н.Э. Баумана.

Содержание

Цель работы

Цель данной лабораторной работы заключается в освоении навыков:


Начало работы

Зайдите в свою локальную директорию с репозиторием для выполнения лабораторных работ. Заберите ветку с соответствующей лабораторной работой из общего репозитория:

git pull upstream

или

git pull upstream lab_3

Переключитесь на ветку с текущей лабораторной работой:

git checkout lab_3

Свяжите ветку локального репозитория с вашим удаленным репозиторием:

git push --set-upstream origin lab_3

Задание

  1. Используя класс, разработанный в предыдущей лабораторной работе, расширьте программу следующими возможностями:

  2. Реализуйте сохранение массива объектов в текстовый файл.

  3. Реализуйте загрузку массива объектов из текстового файла.

  4. Реализуйте добавление нового объекта в массив.

  5. Реализуйте удаление объекта из массива по заданному критерию (например, по имени или идентификатору).

  6. Реализуйте сортировку массива объектов по одному из полей класса.

  7. (Для сильных студентов) Реализуйте поиск объекта по заданному параметру.

  8. (Для сильных студентов) Реализуйте редактирование данных выбранного объекта.


Указания по выполнению лабораторной работы

Общие советы


Рекомендуемая структура меню программы

  1. Загрузка данных из файла
  2. Сохранение данных в файл
  3. Добавление объекта
  4. Удаление объекта
  5. Сортировка массива
  6. Поиск объекта (дополнительно)
  7. Редактирование объекта (дополнительно)
  8. Вывод массива на экран
  9. Выход

Требования к реализации


Пример программы, использующей класс Planet

#include <iostream>
#include <fstream>

class Planet {
private:
char* name;
double mass;

public:
// Конструкторы и деструктор
Planet() noexcept;
explicit Planet(const char* name, double mass);
Planet(const Planet& other);
Planet(Planet&& other) noexcept;
~Planet();

// Операторы присваивания (copy-and-swap)
Planet& operator=(Planet other) noexcept;

// Методы доступа
const char* getName() const;
double getMass() const;
void setName(const char* name);
void setMass(double mass);

// Перегрузка потокового ввода-вывода
friend std::ostream& operator<<(std::ostream& os, const Planet& p);
friend std::istream& operator>>(std::istream& is, Planet& p);
};
#include <iostream>
#include "Planet.h"

namespace{
	constexpr int previewSize = 10;
}

void showMenu();
void loadFromFile(Planet* planets, int& size);
void saveToFile(const Planet* planets, int size);
void addPlanet(Planet* planets, int& size);
void removePlanet(Planet* planets, int& size);
void sortPlanets(Planet* planets, int size);

// Дополнительные задания (для сильных студентов)
int findPlanet(const Planet* planets, int size);
void editPlanet(Planet* planets, int size);

int startApp() {
	Planet* planets = new Planet[preview Size];
	int size = 0;
	int choice = 1;

	while (choice != 9){
	showMenu();
	std::cin >> choice;

	switch (choice) {
		case 1:
			loadFromFile(planets, size);
			break;
		case 2:
			saveToFile(planets, size);
			break;
		case 3:
			addPlanet(planets, size);
			break;
		case 4:
			removePlanet(planets, size);
			break;
		case 5:
			sortPlanets(planets, size);
			break;
		case 6:
			findPlanet(planets, size); // дополнительно
			break;
		case 7:
			editPlanet(planets, size); // дополнительно
			break;
		case 8:
			// вывод массива
		break;
	}
}

return 0;
}

Требования к отчёту

Отчёт по лабораторной работе должен содержать:


Контрольные вопросы

  1. Какие классы используются для работы с файлами в C++?
  2. В чём отличие текстового и бинарного файла?
  3. Как сохранить объект пользовательского типа в файл?
  4. Какие способы сортировки массивов вы знаете?
  5. Как выполняется удаление элемента из массива объектов?
  6. Что такое линейный поиск?
  7. Как обеспечить корректное редактирование объекта в массиве?
  8. Какие ошибки могут возникать при работе с файлами?
  9. Что такое explicit в C++?
  10. Как работает noexcept в c++?
  11. Идиома Copy-and-Swap в С++