
Варианты углубленного уровня
Вариант №11:
Создайте реализацию АТД “очередь” на основе усовершенствованного циклического массива, который автоматически увеличивает размер вдвое при переполнении, подобно вектору. Все остальные характеристики циклического массива должны быть сохранены. Продемонстрируйте работоспособность решения при помощи тестовой программы.
Вариант №12:
В дисковом файле, путь к которому передается первым аргументом командной строки, содержатся записи о людях по 1 строке на человека в следующем формате:
<фамилия> <возраст>
Вторым аргументом командной строки передается число, означающее граничный возраст. Выведите на экран фамилии и возраст всех людей, которые старше граничного возраста. Постарайтесь обработать все возможные ошибки, такие как несуществующий файл, некорректный формат или возраст.
Вариант №13:
В дисковом файле, путь к которому передается первым аргументом командой строки, содержатся строки с произвольным текстом. Напишите программу, которая читает строки из указанного файла и в конце выводит последовательность самых длинных строк, в порядке их появления в файле. Пояснение:
пусть очередная строка, извлеченная из файла, содержит N символов, и все предыдущие строки содержали менее N-символов
если среди следующих строк не найдется таких, длина которых равна или больше N, то в конце программы выдастся данная единственная строка
если среди следующих строк найдутся такие, длина которых равна N, однако строк с длиной больше N не найдется, в конце программы выдадутся все строки, имеющие длину N
если среди следующих строк найдется строка, длина которой M, при чем M > N, следует взять в качестве нового N значение M и применить аналогичные критерии ко всем остальным строкам в файле
Вариант №14:
В двух дисковых файлах, пути к котором передается первым и вторым аргументами командной строки соответственно, содержатся записи о перечислениях на банковские счета, по одной записи на строку в текстовом формате:
<НОМЕР_ИЗ_ЦИФР> <СУММА_ДЕЙСТВИТЕЛЬНОЕ_ЧИСЛО>
В третьем аргументе командной строки содержится имя результирующего файла, в который программа должна записать объединение двух первых, при этом платежи на те же самые счета должны быть представлены однократно по сумме всех объединенных. Программа должна сообщать об ошибочных ситуациях, таких как проблемы с открытием файлов или некорректный формат.
Варианты амбициозного уровня
Вариант №15:
Реализуйте АТД “дек” (очередь с двумя концами) на основе сегментированного массива - несколько блоков фиксированной длины, хранящие данные, и служебный блок-директория, содержащий указатели на блоки данных. Обработайте все возможные ошибки.
Сегментированный массив моделируется следующим образом:
struct IntegerDeque
{
// Количество ячеек в массиве-директории
int m_directorySize;
// Количество ячеек в каждом блоке данных
int m_blockSize;
// Массив-директория: указатели на блоки данных
int ** m_pDirectory;
// Индексы верхней и нижней позиции из занятых ячеек в директории
int m_frontBlockIndex, m_backBlockIndex;
// Количество занятых элементов в первом и последнем блоках
int m_frontUsed, m_backUsed;
};
Графически данную структуру можно изобразить следующим образом:
Должны поддерживаться следующие операции:
CLEAR ( DEQUE )
IS_EMPTY( DEQUE ) : bool
PUSH_FRONT( DEQUE, VALUE )
POP_FRONT( DEQUE )
FRONT ( DEQUE ) : VALUE
PUSH_BACK ( DEQUE, VALUE )
POP_BACK( DEQUE )
BACK ( DEQUE ) : VALUE
Необходимо проверить корректность работы всех операций при помощи тестовой программы, максимально покрывающей все возможные случаи.
Вариант №16:
Имеется стандартная колода карт для игры “пьяница” (4 масти - пики, трефы, бубны, черви - карты от 6 до туза). Программа должна создать двух виртуальных игроков и случайным образом распределить карты между ними. На каждом ходу игроки берут карту сверху колоды:
если карта одного игрока больше карты другого по старшинству, тот, чья карта больше, забирает карту другого игрока, и кладет обе карты под низ своей колоды
исключение - карта 6 считается старше карты ТУЗ
если карты одинаковы по старшинству:
от каждого игрока берется еще две карты
независимо от соотношения первых дополнительных карт, сравниваются вторые дополнительные карты
если одна из вторых дополнительных карт старше, обладающей ей игрок забирает все участвовавшие в розыгрыше карты и кладет под низ своей колоды
если карты одинаковы по старшинству, процесс с двумя дополнительными картами продолжается
игра завершается когда, один из игроков остается без карт либо сделано 5000 ходов
Напишите эмуляцию данной популярной игры в памяти программы, записывая в произвольном (но читабельном!) текстовом формате журнал ходов и количество карт каждого из игроков после каждого хода в дисковый файл, имя которого указано в первом и единственном аргументе командной строки. Подсказка: для удобства реализации используйте кольцевые связные списки.