Задания по курсу 'Объектно-ориентированное программирование'
Программирование на языке C++
Задача №1:Большие числа
Цель. Познакомится с организацией класса на языке программирования С++. Освоить технику перегрузки операций.
Постановка задачи. Реализовать класс для работы с большими целыми числами,
синтаксически и семантически совместимый с встроенными целочисленными типами.
Под большими числами подразумеваются числа, неограниченные сверху и снизу никакими пределами.
Класс должен предоставлять весь комплекс функциональности, характерный для встроенных целочисленных типов данных
(int, long и так далее). В целях облегчения внутренней реализации класса,
можно не реализовывать следующие операции: деление, взятие остатка от деления, битовые операции и операции сдвига.
Следует предусмотреть тесную интеграцию вашего класса с встроенными целочисленными типами данных и строковыми константами.
А именно:
- Объект вашего класса должен иметь возможность быть инициализированным переменной/константой
любого встроенного целочисленной типа данных (как при создании объекта, так и при присваивании объекту
нового значения)
- Объект вашего класса должен иметь возможность быть инициализированным строковой константой
(как при создании объекта, так и при присваивании объекту нового значения)
- Переменная/константа любого встроенного целочисленного типа данных должна иметь возможность выступать в
качестве одного из операндовлюбойбинарной операции, поддерживаемой вашим классом.
- Строковая константа должна иметь возможность выступать в качестве одного из операндов любой бинарной операции,
поддерживаемой вашим классом.
- Объекты вашего класса должны иметь возможность взаимодействовать со стандартными потоками вывода
(потоками вывода, объявленными в стандартной библиотеки C++, такими как cout,
cerr, clog и другими). При этом можно игнорировать состояние флагов
форматирования потока и всегда выводить число как десятичное без знака
(в случае положительного числа) или со знаком (в случае отрицательного числа).
Примеры.
Замечания по реализации.
- Крайне рекомендуется использовать для внутреннего представления числа тип string
из стандартной библиотеки C++. Все другие решения ведут к усложнению задачи, что, при отсутствии должного
опыта работы на языке C++, ведет к значительному увеличению времени разработки задания и, особенно,
времени его сдачи.
- Нужно аргументировать любое использование стандартной библиотеки C++ и стандартной библиотеки C.
В большинстве случаев вам будет предложено отказаться от использования стандартной библиотеки C.
- Нельзя использовать расширения языка C++ специфичные для конкретного компилятора.
Вопросы.
- Различия между заголовочными файлами С++ и файлами с исходным кодом.
- Как нужно оформлять заголовочные файлы C++?
- Открытые и закрытые члены класса. Друзья класса.
- Что такое конструктор и деструктор? Правила именования конструкторов и деструкторов в C++.
- Что такое селекторы и модификаторы? Синтаксические различия между ними в языке C++.
- Передача параметров в методы/функции. Общие соображения о том, как нужно выбирать способ передачи
параметров для конкретного случая.
- Какие методы могут создаваться компилятором? Когда это происходит?
- Какие операции нельзя перегрузить?
- Какие операции можно перегрузить только как методы класса? Только как внешние функции?
- Как перегружаются унарные операции? Бинарные?
- Разумно ли использование класса, разработанного вами в этом задании, для интенсивных численных расчетов?
Обоснуйте свой ответ.
Дополнительные материалы.
- Как перегрузить операцию вставки данных в поток вывода для вашего класса...
- Как использовать тип string из стандартной библиотеки C++...
- Как преобразовать число в строку и наоборот средствами стандартной библиотеки C++...
Задача №2:Контейнеры - потоковая модель
Цель. Освоить технику работы с динамически выделяемой памятью. Научится строить простейшие контейнеры.
Познакомится с организацией потоковой модели.
Постановка задачи. Необходимо реализовать контейнер для хранения больших целых чисел,
с поддержкой техники ввода/вывода данных аля поток ввода/вывода.
Для представления больших целых чисел необходимо использовать класс, разработанный в предыдущем задании.
Разрабатываемый класс должен предоставлять следующую функциональность.
Как контейнер:
- Возможность узнать размер контейнера (метод size).
- Возможность вставить значение в любое место контейнера (метод insert). Место определяется по индексу.
Индекс 0 - вставить в начало контейнера; индекс N или -1 (где N - размер контейнера на
момент выполнения операции) - вставить в конец контейнера.
В случае недопустимого значения индекса необходимо выбросить исключение out_of_range.
- Возможность вставить в любое место контейнера набор значений, представленных других экземпляром (объектом)
вашего контейнера (метод insert).Место вставки первого элемента определяется по индексу,
аналогично предыдущему случаю. Порядок вставляемых элементов сохраняется.
В случае попытки вставить экземпляр контейнера "в себя" необходимо выбросить исключение logic_error
.
- Возможность удалить элемент контейнера по произвольному индексу (метод remove).
В случае недопустимого значения индекса необходимо выбросить исключение out_of_range.
Как поток ввода/вывода:
- Возможность вставить значение в текущий конец контейнера (оператор <<).
- Возможность вставить набор значений в текущий конец контейнера (оператор <<).
- Возможность извлечь значение из текущего концаконтейнера (оператор >>).
- Возможность извлечь все значения из текущего конца контейнера (оператор >>).
- Возможность определить состояние потока ввода - определить есть ли еще элементы - (оператор !).
- Возможность установить голову контейнера текущем концом контейнера (манипулятор begin).
- Возможность установить хвост контейнера текущем концом контейнера (манипулятор end).
- Возможность изменить текущий конец контейнера на противоположный (манипулятор swap).
Примеры.
Замечания по реализации.
- Контейнер должен быть реализован по схеме двусвязанного линейного списка.
- Вспомогательные типы данных (классы, структуры, перечисления), необходимые для реализации контейнера,
рекомендуется объявлять внутри основного класса. Эти типы данных не должны упоминаться в открытой части объявления
основного класса.
- Время, необходимое для выполнения любого манипулятора, не должно зависеть от количества элементов в контейнере.
- Необходимо минимизировать (в идеале исключить вообще) участки с повторяющимся кодом.
Вопросы.
Дополнительные материалы.
Задача №3:Универсальные числа
Задача №4:Вызов абстрактного (чисто виртуального) метода
Задача №5:Контейнеры - подход STL
Задача №6:Менеджер памяти
Задача №7:Линейная алгебра
Задача №8:База данных