Варианты базового уровня
Вариант №1:
Реализуйте все операции АТД “отображение” для ключей и значений, являющихся целыми числами, на основе единственного объекта-вектора. Вектор должен хранить и ключи, и значения в внутренних ячейках в одном блоке в виде вложенной структуры:
struct IntegerMap
{
int m_nUsed;
int m_nAllocated;
struct Cell
{
int m_key;
int m_value;
};
Cell * m_pData;
};
Набор пар ключ-значение {1 ->10, 2 -> 20, 3 -> 30} будет иметь следующий вид:

Убедитесь в работоспособности реализации при помощи тестовой программы.
Модифицируйте алгоритм быстрой сортировки массива целых чисел таким образом, что опорный элемент (pivot) выбирался из трех элементов сортируемого интервала - первого, серединного и последнего. Необходимо сравнить элементы между собой и выбрать из них средний по значению. Этот прием должен уменьшать вероятность неудачных разбиений по опорному элементу. Замеряйте время выполнения алгоритма быстрой сортировки до и после модификации для различных наборов данных, поместите результаты в отчет в табличной форме.
Вариант №2:
Реализуйте все операции АТД “отображение”, у которого в качестве ключей используются строки, а в качестве значений - действительные числа (double). Реализация должна основываться на двух отдельных векторах для ключей и значений. Вносимые в отображение строки следует копировать при вставке, а при удалении данных строки следует корректно освобождать. Убедитесь в работоспособности реализации при помощи тестовой программы.
Реализуйте алгоритм сортировки слиянием для массива строк, при этом строки должны сравниваться без учета регистра (т.е., “hello” и “HELLO” следует считать одинаковыми строками). Убедитесь в работоспособности реализации на любом достаточно большом текстовом файле.
Вариант №3:
Реализуйте все операции АТД “отображение”, для ключей и значений, являющихся целыми числами, где допускается дупликация ключей. Иными словами, одному ключу может соответствовать несколько значений (такая структура называется “мультиотображением”). В основе реализации можно использовать отдельные векторы для ключей и значений. К стандартному набору операций АТД “отображение” следует добавить операцию, возвращающую количество значений, соответствующих указанному ключу: COUNT_KEY( map, key ) : int В операциях поиска и удаления по ключу следует использовать первую попадающуюся при обходе пару с указанным ключом. Если ключу соответствует N значений, то для полного его удаления из отображений следует вызывать операцию REMOVE_KEY ровно N раз. Убедитесь в работоспособности реализации при помощи тестовой программы.
Реализуйте алгоритм быстрой сортировки для массива строк, при этом строки должны сравниваться без учета регистра (т.е., “hello” и “HELLO” следует считать одинаковыми строками). В качестве опорного элемента используйте случайную позицию. Убедитесь в работоспособности реализации на любом достаточно большом текстовом файле.
Вариант №4:
В программе имеются в явном виде заданные данные о численности населения всех областей Украины (используйте любые данные, не обязательно вспоминать названия всех областей и вводить реальные данные о численности населения). Пользователь вводит в программу через консоль строку с названием области, а программа печатает данные о численности населения этой области. Если введенной области в памяти нет, программа печатает на экране соответствующее сообщение об ошибке.
Имеется структура, описывающая фамилии и инициалы людей:
struct PersonName {
char * m_lastName;
char m_initials[ 2 ];
};
Реализуйте один из простейших алгоритмов сортировки на ваш вкус (пузырьковая, выбором, вставками) для массива элементов, являющихся объектами данной структуры. При этом, первоочередным критерием для сравнения двух объектов должна являться фамилия, а при равенстве фамилии - разница в инициалах.
Вариант №5:
В программе имеются заданные в явном виде данные о ежемесячной выручке предприятия “Рога и Копыта” за предыдущий год деятельности. Пользователь вводит в программу порядковый номер месяца в году (январь-1, февраль-2,..., декабрь-12). Программа печатает данное о выручке в соответствующем введенному номеру месяцу. Если вводится неправильный номер, программа печатает соответствующее сообщение об ошибке.
Программа генерирует массив из N случайных целых чисел. Необходимо замерять и сравнить производительность двух фрагментов программы для различных N:
большое количество M вызовов линейного поиска случайного числа в этом массиве;
запуск быстрой сортировки массива + такое же большое количество M вызовов бинарного поиска случайного числа в этом же массиве.
Результаты измерений поместите в отчет в виде таблицы. Обязательно измерить время работы алгоритмов как для небольших N (5-10), так и для достаточно больших N (10-100 тысяч).
Вариант №6:
Пользователь вводит в программу текст произвольной длины, завершая ввод нажатием комбинации клавиш <Ctrl+Z>. Программа вычисляет длину каждой введенной строки и собирает статистику длины различных строк в объекте-отображении. Ключом в отображении является длина строки, а значением - количество строк с такой длиной. После завершения ввода программа печатает на экране собранную статистику. Например, пользователь ввел 4 строки:
aaa
bbbb
cc
ddd
Программа должна выдать следующий отчет (порядок не имеет значения):
2 line(s) with length 3
1 line(s) with length 2
1 line(s) with length 4
Реализуйте простейший алгоритм сортировки на ваш вкус (пузырьковая, выбором, вставками) для массива, содержащего указатели на объекты-множества целых чисел. При сравнении множеств следует, в первую очередь, руководствоваться минимальным значением, находящимся во множестве. При равенстве таких минимальных значений для двух множеств, первым по порядку должно идти множество с меньшим количеством элементов.
Вариант №7:
В программе имеются заданные в явном виде данные о товарах из магазина. Каждый товар имеет свой уникальный код в диапазоне от 1 до 100. Номера не обязательно идут подряд, также нет никакого требования о каком-либо порядке. Пользователь вводит в программу целое положительное число, означающее код, а программа печатает название соответствующего товара, если такой найден. Если товара с таким кодом нет, программа печатает сообщение об ошибке. Процесс повторяется циклически. Если введен код 0, программа завершается.
Модифицируйте алгоритм сортировки слиянием для массива целых чисел таким образом, чтобы можно было контролировать извне способ сортировки малого количества элементов. Общий алгоритм сортировки слиянием должен принимать дочерний алгоритм, такой как пузырьковая сортировка, вставками или выбором, в виде указателя на функцию. Если передан нулевой указатель на функцию, разбиение должно продолжиться до элементарных случаев с N=1 или N=2, где никакой алгоритм не потребуется. Сравните производительность 4 режимов слияния (на нижнем уровне базовый алгоритм, пузырьковая сортировка, сортировка выбором или вставками) на одном и том же достаточно большом наборе случайных чисел (например, 500 000 элементов). Поместите результаты измерений в отчет.
Вариант №8:
Представьте небольшую гостиницу, в которой имеется 20 номеров. Некоторые могут быть свободны, некоторые заняты постояльцами. Напишите программу, имитирующую учет информации о постояльцах номеров. Изначально гостиница пуста. Если пользователь вводит число 1, за ним следует число, означающее номер, и программа печатает занят ли данный номер. Если пользователь вводит число 2, за ним также следует число, означающее номер, и программа делает свободный номер занятым. Если номер был уже занят, программа печатает сообщение об ошибке. Если пользователь вводит число 3, за ним также следует число, означающее номер, и программа освобождает занятый номер. Если номер не был занят, программа печатает сообщение об ошибке. Процесс повторяется циклически до ввода числа 4, после которого программа завершается. В командах 1-3, если введен неправильный номер, программа печатает сообщение об ошибке.
Пользователь вводит в программу последовательность положительных целых чисел в произвольном порядке, завершая ввод нулем либо отрицательным числом. Программа отвечает на вопрос существует ли такая перестановка введенных чисел, чтобы из исходного набора получилась арифметическая прогрессия.
Вариант №9:
Реализуйте все операции АТД “множество” для строковых ключей на основе упорядоченных по алфавиту односвязных списков. Помещаемые во множество строки следует копировать при вставке, корректно освобождать при удалении. Убедитесь в работоспособности реализации при помощи тестовой программы.
Имеется массив элементов-точек в трехмерном пространстве:
struct Point3D
{
double m_x, m_y, m_z;
};
Взяв за основу любой из полюбившихся алгоритмов сортировки, напишите программу, которая упорядочивает массив точек по возрастанию расстояния точки до начала координат и выводит его на экран.
Вариант №10:
Дополните реализацию АТД “множество” для целых чисел на основе односвязных списков следующими операциями:
IS_SUBSET ( set1, set2 ) : bool- возвращает true, если первое множество является подмножеством второго множества.
EQUAL ( set1, set2 ) : bool- возвращает true, если два множества состоят из одних и тех же элементов.
MIN_KEY ( set ) : value- возвращает ключ с минимальным значением.
MAX_KEY ( set ) : value- возвращает ключ с максимальным значением.
Убедитесь в работоспособности функций при помощи тестовой программы.
В программе имеется заданное в явном виде множество из 20 фамилий, упорядоченных по алфавиту. Фамилии могут повторяться. Пользователь вводит строку, означающую фамилию. Программа ищет введенную фамилию во множестве и печатает количество записей с такой фамилией. Если записей не обнаружено, программа печатает число 0. Обязательное условие - программа в худшем случае должна сделать не более 5 сравнений фамилий!
