OOP

Repository with OOP materials and templates of projects by "Programming Base" (2nd term)

Ранее выданные работы

ДЗ0. Реализация творческой работы "Футбол" с подготовкой презентации и защитой выполненного проекта.

ПР0. Решение задач на Stepik на время.

Deadline: на занятии в терминал-классе.

OOP-Projects

Project CTime

Описание ПР1 и ДЗ1

ПР1. В соответствии с файлом TC №3 GITHUB (Materials) выложить свой первый код. Deadline: 5 марта в терминал-классе.

ДЗ1.

Шаг 1. Завершить разработку класса CTime (Время).

Шаг 2. Создать pull request и получить ревью от двух одногруппников - запросить после этого ревью от меня (@UsovaMA).

Шаг 3. По аналогии создать и разработать класс CDate (Дата) в другой ветке разработки (создавать новую ветку следует находясь в главной ветке!).

Шаг 4. Создать еще один pull request и получить ревью от двух одногруппников - запросить после этого ревью от меня (@UsovaMA).

Требования:

  • код должен быть реализован на С++ с соблюдением концепций ООП,
  • в процессе работы качественно вести историю в коммитах. Deadline: 1 неделя (до 12 марта).

Project CString

Описание ПР2

ПР2. Реализовать класс Строка, используя выложенный шаблон

Как работать с задачей:

  • создать очередную рабочую ветку (находясь в ветке main),
  • скачать файлы-заготовки по ссылкам, создать проект с ними (создать проект, перейти в папку проекта - там будут 3 конфигурационных файла - положить там скаченные файлы, подхватить их в MVS: ПКМ по проекту - Добавить - Существующий элемент),
  • запустить, разобраться с тем, что в проекту уже реализовано.

Далее:

  • раскомментировать очередную функцию из объявления класса в файле string.h,
  • реализовать её в файле string.cpp,
  • написать пару строк кода проверки её работы в файле main.cpp,
  • оформить комментарий к реализованной функции.

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

  • осуществить корректное выставление спецификаторов const (функция не меняет объект this), noexcept (в функции нет исключений) для методов,
  • в процессе реализации оформлять корректно "документацию кода",
  • создавать историю коммитов для github (например, добавлена рализация всех конструкторов, реализованы все варианты функций вставки, ... функций поиска и т.д.),
  • весь написанный функционал должен быть исчерпывающе проверен в функции main(),
  • в конце терминал-класса сделать push всего реализованного за занятие в репозиторий.

Deadline: 12 марта в терминал-классе начать работу, завершить разработку за 1 неделю (до 19 марта).

Project CArchive

Описание ДЗ2

ДЗ2. Реализовать переосмысление работы «Архив» из 1-го семестра. Использовать шаблон

Как работать с задачей:

  • создать очередную рабочую ветку (находясь в ветке main),
  • скачать файлы-заготовки по ссылкам,
  • собрать проект с файлами шаблона,
  • запустить и посмотреть как он работает (в текущем шаблоне реализована только вставка (п.1) на заданную позицию (п.3) одного элемента (п.1) в качестве примера как грамотно разделять обязанности между функциями и вызывать их в меню с отловом исключений),
  • разобраться как работают те элементы, которые уже написаны в качестве примера.

Далее:

  • раскомментировать очередную функцию из объявления класса в файле archive.h,
  • реализовать её в этом же файле (обратите внимание, объявление и реализация шаблонных классов и функций должны быть в одном файле!),
  • если это один из основных алгоритмов (вставка, поиск, удаление, замена) или другое действие существующее в меню (например, очистка архива) - найти её место в меню в файле main.cpp, реализовать для её работы отдельно в InputSystem и OutputSystem общение с пользователем для ввода значений для этих алгоритмов или вывода результатов,
  • проверить работоспособность после добавления очередного пункта меню.

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

  • код должен быть реализован на С++ с соблюдением концепций ООП,
  • осуществлять качественное разделение кода на функции:
  1. одна функция - одно действие,
  2. функции интерфейса (ввода/вывода информации в нужном формате) должны быть реализованы отдельно аналогично примеру с insert в именном пространстве InputSystem/OutputSystem, в функциях класса-архива НЕ может быть общения с пользователем и вывода сообщений на экран - это обязанности интерфейса (исключение: функция print(), которая выводит содежимое хранилища на экран),
  • осуществить корректное выставление спецификаторов const (функция не меняет объект this), noexcept (в функции нет исключений), static (функция становится явно статической - https://www.geeksforgeeks.org/what-are-static-functions-in-c/), inline (при компиляции код этой функции будет вставляться на месте вызовов),
  • должно быть продемонстрировано использование перечислений, именных пространств и шаблонных функций в соответствии с примером,
  • должно быть продемонстрировано корректное использование указателей и ссылок (старайтесь повсеместно переходить на использование ссылок, если это коненчно не массив, который передаётся традиционно по указателю),
  • должна быть использована механика исключений (throw) и их обработки (try .. catch), исключения должны быть написаны как минимум везде, где возможны некорректные входные данные,
  • оформить документацию кода,
  • создать качественную историю коммитов для github,
  • реализовать полноценное приложение в main().

Требования к выводу в меню:

  1. Меню должно быть понятным и качественно оформленным.
  2. После выполнения любого поиска выводить информацию в понятном виде (функция должна быть реализована в именном пространстве OutputSystem):
Matches found: 3, 5, 6, 7, 13
42441, 112, 24, 333, 426, 333, 333, 333, 335, 426, 42427,
                ^         ^    ^    ^               
24, 335, 333, 42427
         ^

Даже если это поиск одного элемента, его также нужно выделить в потоке информации. Советую создать вспомогательную функцию, подсчитывающую количество цифр в числе, а также поиспользовать уже написанные, getCursor, setCursor.

Прочее:

Допускается добавление нового (не продуманного в шаблоне) служебного функционала.

Deadline: 2 недели (до 26 марта).

Тонкости реализации и описание алгоритмов

Представление в памяти и создание архива по умолчанию

По умолчанию под архив выделается некоторое фиксированное количество ячеек памяти и считается, что в архиве нет элементов { } (т.е. состояние всех ячеек empty)

_capacity = 15; _size = 0; _deleted = 0;

_data:

image

_states:

image

Вставка

При вставке элемента он занимает некоторую ячейку состояние ячейки помечается как busy. Например, после вставки в конец элементов 12, 34, 56:

_capacity = 15; _size = 3; _deleted = 0;

_data:

image

_states:

image

Удаление

При удалении элемента из конца _size уменьшается на 1, а статус меняется на empty, во всех остальных случаях удаления статус элемента меняется на deleted и больше ничего не совершается. Например, пусть был архив { 12, 34, 56, 647, 89, 985 }. Удалили элементы с индексом 2 (значение 56) и 5 (значение 985). В результате на экране должно быть { 12, 34, 647, 89 }, но фактически в переменных происходит следующее:

_capacity = 15; _size = 5; _deleted = 1;

_data:

image

_states:

image

то есть так как элемент 985 был последним его ячейка пометилась как свободная и размер архива уменьшился, в то время как значение 56 просто пометилось удалённым и будет пропускаться при выводе на экран архива.

Перепаковка (перераспределние памяти)
  1. Не хватает памяти для вставки.

Если при попытке добавить элемент архив заполнен (метод full() вернул true, т.е. _capacity == _size):

  • архив перестраивается с учетом удалённых элементов

ДО

_data:

image

_states:

image

ПОСЛЕ

_data:

image

_states:

image

  • если удалённых элементов нет, то происходит расширение памяти

ДО

_data:

image

_states:

image

ПОСЛЕ

_data:

image

_states:

image

  1. Если количество удалённых элементов после очередного удаления становится, например, 40% от _size, то следует перестроить массив аналогично первому случаю исключив удаленные элементы.

Project CFraction

Описание ПР3

ПР3. Реализовать класс Дробь.

class Fraction {
    int numerator;       // числитель
    int denominator;     // заменатель
 public:
    ...
};

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

  • поля класса:
    • числитель,
    • заменатель;
  • обязательные методы класса:
    • 4 основных конструктора (по умолчанию, инициализации, копирования, преобразования из вашей строки, т.е. CString), деструктор (при необходимости),
    • внутренняя перегрузка оператора присваивания = (обязательно с проверкой на самоприсваивание),
    • перегрузка операторов сравнения ==, !=, >, <, >=, <= с целочисленным значением (int),
    • перегрузка операторов сравнения ==, !=, >, <, >=, <= с другой дробью (СFraction),
    • перегрузка арифметических операторов +, -, +=, *, /, -=, *=, /= с целочисленным значением (int),
    • перегрузка арифметических операторов +, -, +=, *, /, -=, *=, /= с другой дробью (СFraction),
    • внешняя перегрузка операторов ввода >> и вывода <<,
    • метод void simplify(); максимально сокращающий дробь;

P.S.: если не сказано, какой тип перегрузки нужен, следует определиться с ним самостоятельно, однако обратите внимание, что при перегрузке операторов, работающих с другим типом требуется две перегрузки (когда int справа от оператора и когда int слева от оператора), которые можно реализовать как раз как внешние:

friend Fraction operator+(const Fraction& frac, int value);
friend Fraction operator+(int value, const Fraction& frac);

Тогда как при перегрузке внутренним способом int сможет стоять только справа от операции.

  • осуществить корректное выставление спецификаторов const (функция не меняет объект this), noexcept (в функции нет исключений) для методов,
  • в процессе реализации оформлять корректно "документацию кода",
  • создавать историю коммитов для github (например, добавлена рализация всех конструкторов, реализованы все варианты функций вставки, ... функций поиска и т.д.),
  • весь написанный функционал должен быть исчерпывающе проверен в функции main(),
  • в конце терминал-класса сделать push всего реализованного за занятие в репозиторий.

Deadline: 19 марта в терминал-классе начать работу, завершить разработку за 1 неделю (до 26 марта).