- •Раздел 1. Специальный раздел
- •1.1. Исследовательская часть
- •1.1.1. Постановка задачи
- •1.1.2. Предварительные нир
- •1.3. Информационные потребности пользователя
- •1.1.4. Требования, предъявляемые системе
- •1.2. Конструкторская часть
- •1.2.1. Структура входных и выходных данных
- •1.2.2. Общая схема работы модуля
- •1.2.3. Выбор платформы проектирования и его обоснование
- •1.2.4. Проектирование архитектуры модуля
- •1.2.5. Конфигурация технических средств
- •1.2.6. Алгоритмы работы модуля
- •1.2.7. Методика тестирования
- •1.2.8. Результаты экспериментальной проверки
- •2.1. Проектирование на языке uml
- •2.1.1. Концепция Unified Modeling Language
- •2.1.2. Виды диаграмм uml
- •2.1.3. Связь с объектно-ориентированными языками
- •2.2. Идеология stl в применении к архитектуре модуля
- •2.2.2. Контейнеры stl
- •2.2.3. Алгоритмы stl
- •2.2.4. Потоки
- •2.4.1. Умные указатели
- •2.3. Специализированный инструментарий
- •2.4.2. Типы тестов
- •2.4.3. Планирование модульных тестов
- •2.4.4. Примеры тестирования
- •2.4.5. Методы “грубой силы” и их применение при отладке программы
- •3.1. Цели определения себестоимости и цены модуля
- •3.2. Методы определения себестоимости
- •3.3. Расчет себестоимости vfs
- •3.4. Методы расчета цены
- •3.4.1. Расчет цены по стоимости изготовления
- •3.4.2. Расчет цены на основе роялти
- •3.4.3. Расчет цены на тиражируемый продукт
- •3.5. Расчет цены vfs
- •3.6. Выводы
- •4.2.1. Психофизиологические факторы
- •4.2.2. Электромагнитные излучения
- •4.2.3. Освещение рабочего места
- •4.2.4 Электробезопасность
- •4.2.5 Микроклимат
- •4.2.6. Зашумленность
- •4.3. Инженерный расчет освещенности машинного зала
- •4.4. Экологическая безопасность
- •4.5. Пожарная безопасность
- •4.6. Выводы
- •Список литературы
2.2.3. Алгоритмы stl
Библиотека STLсодержит развитые средства по управлению контейнерами. Благодаря использованию идеологии итераторов, эти средства не зависят от типа используемого контейнера. Они используют только тип итератора и основываются на операциях, которые он предоставляет.
Синтаксически алгоритмы STLоформлены как шаблонные функции, шаблонными параметрами которых являются типы итераторов. Фактически, большинство алгоритмов призвано избавить программиста от написания большого количества циклов с проходами по контейнерам.
Ниже приведены некоторые особенно популярные алгоритмы STL, которые я использовал при разработкеVFS.
copy– осуществляет копирование из последовательности, заданной итераторами [First;Last) (используются стандартное математические обозначение полуоткрытого интервала), в последовательность, начинающуюся итераторомDest. Возвращает итератор на элемент, следующий за последним скопированным элементом.
fill– заполняет диапазон [First;Last) значениемVal. Все контейнеры имеют специальный конструктор с аналогичным функционалом.
find – ищет в диапазоне [First;Last) значениеVal. Возвращает итератор на первое встретившееся значение. Если значение не найдено, возвращает итераторLast. У этого алгоритма есть мощные расширения, использующие поиск в подпоследовательностях.
for_each– для каждого элемента из диапазона [First;Last), вызывает функтор, передавая ему в качестве параметра текущий элемент (полученным разыменовыванием итератора).
replace– заменяет в диапазоне [First;Last) все элементы, для которых унарный предикат истинен, значениемVal.
sort– осуществляет сортировку элементов в диапазоне [First;Last). Передаваемый бинарный предикат имеет смысл оператора сравнения «<». В случае, если сортируемые объекты поддерживают сравнение с использованием оператора «<», можно воспользоваться упрощённой формой.
Применительно к использованию контейнеров нужно упомянуть такие мощные средства, как функторы и предикаты.
Функтор(functor, также называются объектами-функциями) – объект любого класса, для которого определён оператор вызова функции «()». Следуя определению, любая функция является функтором.
Перегрузка оператора «()» в классе позволяет одновременно решить две задачи:
1) сохранить простую и интуитивно понятную концепцию вызова функции; это особенно важно при использовании шаблонов функций, например из числа стандартных алгоритмов STL;
2) предоставить функции накапливать сведения от вызова к вызову без использования глобальной области видимости.
Предикат(predicate) – это функтор, возвращающий логическое (bool) значение. Различают унарные (принимающие один параметр) и бинарные (принимающие два однотипных параметра) предикаты.
Предикаты активно используются в STL. Практически все стандартные алгоритмы и контейнеры, сравнивающие элементы, позволяют задать произвольный предикат в качестве оператора сравнения (по умолчанию для элементов используются операторы «==» и «<», в зависимости от алгоритма).
2.2.4. Потоки
В языке C++ отсутствуют встроенные средства ввода/вывода. Они предоставляются программисту различными библиотеками, в том числеSTL. ВSTLреализован гибкий объектно-ориентированный подход, названный «потоки» (streams).
Центральным понятием библиотеки iostreamявляется поток (stream). Поток можно представить себе как источник и/или приёмник последовательности байт. Переопределяя операции записи и чтения потока («сдвиг»), можно заставить поток быть источником и/или приёмником объектов некого класса.
Примечательно, что несмотря на большую гибкость, базовый интерфейс всех потоков предельно прост: он включает в себя возможность последовательно читать байты данных (для потоков ввода istream) и последовательно записывать их (для потоков выводаostream). При этом для потоков допускается буферизованный вывод (т.е. ситуация, когда оправленные на вывод данные временно хранятся в некотором буфере). Для незамедлительной отправки данных все потоки вывода поддерживают методflush. Подобная универсальность выгодно отличает библиотекуiostreamот альтернативных решений.
Использование потоков ввода/вывода распадается на две стадии: формирование и закрытие потока и собственно ввод/вывод.
Ввод/вывод в потоки осуществляется с помощью перегруженных операторов сдвига «<<» (вывод) и «>>» (ввод). Как указывалось выше, программист имеет возможность перегрузить эти операторы для своих классов обеспечив простой и удобный способ взаимодействия их с внешним миром. При этом необходимо иметь о потоке самые общие сведения:
1) тип потока (ввода, вывода, ввода/вывода);
2) тип символов потока;
3) наличие или отсутствие буферизации;
Замечу, что упомянутые операторы осуществляют форматированный ввод/вывод. Используя такие низкоуровневые средства, как методы put,write,get,readи им подобные, можно посимвольно манипулировать потоками, но эти возможности, как правило, используются при написании высокоптимизированного кода.
В модуле VFSпотоки были использованы как одна из основных составных частей: согласно ТЗ, модуль обязан предоставлять данные любого файла как поток. Используя стандартные интерфейсы потоковSTLи их буферов, были реализованы потоки, осуществляющие архивирование/распаковку и шифрацию/дешифрацию «на лету».