Посмотрим на интерфейс таблицы SheetInterface.
В этом задании вам будет нужно реализовать только часть из этих
методов. Но для того, чтобы определиться со структурой данных, важно
учесть все требования к функционалу.
SetCell(Position, std::string)задаёт содержимое ячейки по индексуPosition. Если ячейка пуста, надо её создать. Нужно задать ячейке текст методомCell::Set(std::string);Cell* GetCell(Position pos)константный и неконстантный геттеры, которые возвращают указатель на ячейку, расположенную по индексуpos. Если ячейка пуста, возвращаютnullptr;void ClearCell(Position pos)очищает ячейку по индексу. Последующий вызовGetCell()для этой ячейки вернётnullptr. При этом может измениться размер минимальной печатной области. Если в примере выше удалить ячейку В5, минимальная печатная область поменяется и будет выглядеть так:
Size GetPrintableSize() определяет размер минимальной печатной области. Специально для него в файле common.h и определена структура Size. Она содержит количество строк и столбцов в минимальной печатной области.
Печать таблицы выводит в стандартный поток вывода std::ostream& минимальную прямоугольную печатную область. Ячейки из одной строки должны быть разделены табуляцией \t, в конце строки добавьте символ перевода строки \n.
-
void PrintText(std::ostream&)выводит текстовые представления ячеек:- для текстовых ячеек это текст, который пользователь задал в методе
Set(), то есть не очищенный от ведущих апострофов'; - для формульных это формула, очищенная от лишних скобок, как
Formula::GetExpression(), но с ведущим знаком “=”.
Обратите внимание, что в формуле 1+2*3 пропали лишние скобки, а в текстовых ячейках в третьей строке сохранились апострофы.
- для текстовых ячеек это текст, который пользователь задал в методе
Реализуйте структуру данных «Электронная таблица». Интерфейс таблицы SheetInterface вы найдёте в файле common.h.
common.h содержит интерфейсы классов FormulaInterface, CellInterface, объявление структур Size и Position, описание исключений и ошибок. Интерфейс SheetInterface не содержит методов удаления и вставки. Реализовывать их не нужно.
Для размера минимальной печатной области в файле common.h определена структура Size. В файле structures.cpp из решения первой задачи реализуйте operator= для этой структуры.
Вносите изменения только в файлы sheet.h, sheet.cpp и structures.cpp. В файле structures.cpp реализуйте Size::operator=().
Протестируем только файлы sheet.h и sheet.cpp. Мы не будем тестировать остальные файлы. Примеры тестов вы найдёте в файле main.cpp.
Мы будем проводить нагрузочные тесты: создавать/удалять большое количество ячеек много раз и проверять время работы и использование памяти.
Проверим, что минимальная видимая область находится корректно.
Также будем проверять все функции интерфейса SheetInterface.
Скопируйте содержимое файлов main.cpp и common.h ниже и вставьте в своё решение.
Разберёмся с ограничениями на производительность. Метод GetCell()
должен отрабатывать за константное время, в то время как ограничения на
время работы для вставки и удаления столбцов/строк самые либеральные.
Значит, операции произвольного доступа будут вызываться чаще, чем
операции вставки.
Наверно, имеет смысл использовать простую структуру данных вроде вектора векторов.