Задания по курсу 'Объектно-ориентированное программирование'
Программирование на языке 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:База данных