
- •Оглавление
- •Введение
- •Лабораторная работа №1. Реализация алгоритмов сортировки и поиска Задачи работы
- •Задание на лабораторную работу
- •Сортировка Шелла
- •Сортировка шейкером
- •Сортировка расческой (Comb sort)
- •Плавная сортировка (Smooth sort)
- •Метод Patience sorting
- •Лабораторная работа №2. Понятие контейнера данных. Основные типы контейнеров Задачи работы
- •Задание на лабораторную работу
- •Требования к отчетности по лабораторной работе
- •Предлагаемые этапы выполнения работы
- •Теоретический материал, необходимый для выполнения лабораторной работы Основные типы контейнеров Списки
- •Бинарные деревья поиска
- •Добавление элемента
- •Удаление элемента
- •Понятие сбалансированности дерева
- •Словари
- •Очереди с приоритетами
- •Очереди
- •Лабораторная работа №3. Использование стандартных контейнеров данных Задачи работы
- •Задание на лабораторную работу
- •Лабораторная работа №4. Использование стандартных реализаций алгоритмов stl Задачи работы
- •Задание на лабораторную работу
- •Кафедра компьютерной фотоники
Лабораторная работа №3. Использование стандартных контейнеров данных Задачи работы
Задачами данной лабораторной работы являются:
Контроль освоения студентами теоретического материала (знаний о функционировании стандартных контейнеров данных)
Развитие навыков работы с шаблонами.
Развитие навыков использования механизмов стандартной библиотеки при разработке программного обеспечения.
Формирование навыков решения прикладных задач разработки программного обеспечения.
Задание на лабораторную работу
Разработать программу на языке C++, реализующую функциональность в соответствии с вариантом задания.
Варианты задания:
Реализовать программу, хранящую совокупность многоугольников на плоскости и позволяющую организовать быстрый поиск многоугольников, попадающих в заданный прямоугольник
Необходимо обеспечить добавление многоугольника и поиск многоугольников, попадающих в прямоугольник.
Предложение: Храните один массив многоугольников и 4 массива или бинарных дерева номеров многоугольников, упорядоченных по самой левой, самой правой, самой верхней и самой нижней точке многоугольника.
Это позволит быстро отфильтровать многоугольники, лежащие заведомо выше, ниже, левее или правее данного прямоугольника, и только для оставшихся реализовывать медленные алгоритмы содержательной проверки пересечения прямоугольника.
Реализовать программу, хранящую совокупность отрезков на плоскости и поддерживающую добавление отрезка и быстрый поиск отрезков, попадающих прямоугольник
Предложение: Храните один массив отрезков и 4 массива или бинарных дерева номеров отрезков многоугольников, упорядоченных по самой левой, самой правой, самой верхней и самой нижней точке отрезка.
Это позволит быстро отфильтровать отрезки, лежащие заведомо выше, ниже, левее или правее данного прямоугольника, и только для оставшихся реализовывать медленные алгоритмы содержательной проверки пересечения прямоугольника.
Реализовать программу, хранящую множество шариков, летающих в комнате, поддерживающих добавление и удаление шарика и выдающей информацию о 5 ближайших столкновениях шарика со стенкой. Движение шарика равномерное и прямолинейное, удар упругий, возможностью столкновения шариков друг с другом пренебречь. При добавлении шарика указываются его положение, скорость и время начала полета.
В электронной картотеке библиотеки для каждой книги хранится номер зала, стеллажа и полки. При этом необходим быстрый поиск книги по фамилии автора (считаем, что автор один) и по слову из названия (падежами и т.д. пренебрегаем, считаем, что слово должно быть в названии точно таким же, как его вводит пользователь). Разработать программу электронной картотеки с операциями добавления книги и поиска.
Реализовать систему регистрации сделок на бирже. Для каждой сделки указывается, какой товар продан, в какой день, какое количество и по какой цене. Необходимо по запросу выводить среднюю цену на данный товар в данный день.
Реализовать систему, хранящую информацию о доходах налогоплательщиков (для каждого налогоплательщика указывается его заработок в каждом году). Система должна быть в состоянии дать отчет о доходах данного налогоплательщика в данные годы и отчет о среднем уровне дохода в каждом году.
Реализовать программу электронного магазина, поддерживающую три операции
Добавление информации о появлении в продаже очередной партии товара (указывается цена, количество и наименование).
Покупку партии товара.
Формирование отчета об имеющихся на складе товарах.
Реализовать программу, хранящую информацию о вкладчиках банка. Для каждого вкладчика указывается фамилия и номер паспорта, и для каждого из его вкладов – сумма, валюта и срок возврата. Поддерживать операции добавления и снятия вклада, отчета о всех вкладах и об отдельном вкладчике.
Реализовать программу, которая получает результаты измерений одной и той же меняющейся величины 10 датчиками. Если больше 3 значений подряд, приходящих с одного датчика не соответствуют значениям с остальных – объявить датчик испортившимся и более не учитывать. Операции
Добавить результат очередных измерений (10 чисел).
Вывести среднее значение величины по итогам последнего измерения.
Вывести информацию об исправных датчиках.
При голосовании приходят результаты в виде «На участке № такой-то такая-то партия получила столько-то голосов.» Система должна в любой момент выдать информацию о доступных результатах по данному участку и о суммарном количестве проголосовавших за партию.
Несколько датчиков установлены в разных местах планеты и присылают свои результаты измерения температуры (указывая номер датчика, температуру и время). Необходимо по запросу пользователя выводить отчет о любом датчике (все его измерения), или данные со всех датчиков, говорящие о температуре в заданном интервале времени.
Корабли присылают в каждый момент времени данные о своей скорости и направлении и свои координаты. Необходимо предупредить пользователя, если данные не согласованы (т.е. если изменение координат не соответствует скорости и направлению движения корабля). Землю считать плоской.
Завод по сборке автомобилей покупает комплекты комплектующих и производит автомобили из них. Необходимо хранить информацию о количестве комплектов на складе комплектующих и количестве готовых к отгрузке автомобилей. Основные действия – это покупка N комплектов комплектующих, производство N автомобилей, продажа N автомобилей, выдача отчета о количестве комплектующих и автомобилей на складах.
В базе данных животных в зоопарке хранится информация о виде животного, кличке и количестве потребляемой в день еды (сколько килограммов какого продукта необходимо в неделю). Необходимо формировать отчеты о потребностях данного животного, о потребностях всех животных данного вида и сообщать о суммарной потребности в данном продукте в неделю.
Подразделения фирмы, нуждающиеся в покупке компьютеров, вносят заказы в базу данных. Отдел закупок вносит информацию о ценах на соответствующее оборудование. Необходимо иметь возможность вывести всю информацию о потребностях каждого подразделения и о данном виде оборудования.
Предприятие хранит базу данных о сотрудниках. Фамилия, №паспорта, должность, зарплата. Основные операции – прием на работу, увольнение, перевод на другую должность, изменение зарплаты, отчет о всех сотрудниках, выдача информации о конкретном сотруднике.
Операционная система хранит базу данных процессов. Процесс имеет постоянный приоритет (константа, задается пользователем) и дополнительный приоритет (у каждого следующего процесса на 1 меньше, чем у предыдущего – чтобы те, кто дольше ждал, имели преимущество). Набор поддерживаемых операций:
Добавить процесс с данным именем и постоянным приоритетом
Выбрать из очереди процесс с наибольшим приоритетом (суммой постоянного и дополнительного). Он отработает и завершится.
Выбрать из очереди процесс с наибольшим приоритетом (суммой постоянного и дополнительного). Он отработает, после этого нужно снова поставить его в очередь (уже с новым дополнительным приоритетом).
Все операции должны работать за логарифмическое время.
Указание: priority_queue.
Достаточна разработка консольного приложения. Разработка Windows-приложения будет большим преимуществом выполнения работы, если студент достаточно подготовлен для создания Windows-приложений, иллюстрирующих работу системы.
Требования к отчетности по лабораторной работе
В качестве отчета по лабораторной работе студент предоставляет в электронном виде программу на языке C++, реализующую функциональность в соответствии с вариантом задания.
Предлагаемые этапы выполнения работы
Выбор наиболее подходящего стандартного контейнера данных (или группы контейнеров).
Выделение классов и функций, разрабатываемых в рамках программы.
Реализация классов и функций.
Отладка программы.
Теоретический материал, необходимый для выполнения лабораторной работы
Описание работы с классами в языке программирования C++
См. методические указания к лабораторной работе №2.
Основные контейнеры библиотеки STL
Контейнеры библиотеки STL подробно описаны в учебно-методическом пособии [1]. В STL воплощены все основные контейнеры – массив (std::vector), список (std::list), бинарное дерево поиска (std::set, std::multiset), словарь (std::map, std::multi_map), хэш-таблицы (std::hash_set, std::hash_multiset, std::hash_map , std::hash_multimap), двусторонняя очередь (std::deque), стеки и очереди (std::stack, std::queue), очереди с приоритетами (std::priority_queue)
Основные правила выбора контейнера для использования могут быть сформулированы следующим образом:
Если для задачи достаточно функциональности одного из контейнеров с жестко ограниченным набором операций (std::stack, std::queue, std::priority_queue) – используйте этот контейнер.
Если наиболее частая операция с контейнером – это поиск определенного значения (и выполнение тех или иных операций с ним) – целесообразно использование контейнеров, построенных на бинарном дереве (std::set, std::multiset, std::map, std::multi_map) или на хэш-таблице (std::hash_set, std::hash_multiset, std::hash_map , std::hash_multimap). Пожалуй, это наиболее частый случай.
Если Вы собираетесь выполнять операции, требующие доступа по индексу (сортировать массив по разным критериям, использовать индекс в массиве как идентификатор объекта, потому что в данной задаче он не меняется) – Вы можете использовать std::vector.
Если набор операций ограничивается добавлением элементов, и операциями над набором, реализуемыми стандартными механизмами STL (вызов функции для всех элементов, удаление всех соответствующих условию, …) – лучшим вариантом может быть std::list.