Задания на олимпиаду по программированию

advertisement
Задания
на Олимпиаду по программированию (заочный тур)
факультета дизайна и компьютерных технологий (для студентов и для школьников)
Общие замечания. Программы могут быть разработаны на Delphi, C++ Builder или с
помощью любой другой среды разработки. Необходимо для проверки прислать исходный
текст и откомпилированное приложение (в архиве по причине небольшой квоты учетной
записи) по адресу dimitrie@chuvsu.ru.
1. Разработать программу, которая:
а) открывает файл с текстом размером до 200 кбайт;
б) ищет в тексте файла одинаковые последовательности символов длиной по 3 и 4
символа и составляет словарь таких последовательностей;
в) присваивает каждой найденной последовательности уникальный номер, который
кодируется двумя символами;
г) создает новый файл, где содержится словарь и текст исходного файла, в котором
найденные последовательности заменены символами с кодами их номеров в словаре.
Кодирующие символы, если они уже были в исходном файле, необходимо заменить на
специальные кодирующие символы на усмотрение разработчика.
Примечания. Данная программа нужна для знакомства с некоторыми принципами сжатия
информации. Для хранения длинных строк в Delphi предусмотрен тип AnsiString.
2. Разработать программу, которая шифрует и расшифровывает файлы. Шифрование
производится по следующему алгоритму:
а) открывает файл неограниченного размера для изменения блоками по 128 байт;
б) каждый блок файла изменяет следующим образом:
- делит блок на участки по 4 байта (всего 32 участка);
- для каждого участка выполняются следующие преобразования:
 циклический сдвиг 2 и 4 символов на число разрядов, равное коду 1 символа;
 сложение 2 и 4 символов по модулю 2 с 3 символом;
 циклический сдвиг 1 и 3 символов на число разрядов, равное коду полученного 2
символа;
 сложение 1 и 3 символов по модулю 2 с полученным 4 символом.
в) закрывает файл.
Алгоритм расшифровывания логически следует из алгоритма шифрования.
Примечания. Сложение по модулю 2 – это операция XOR. Циклический сдвиг символа на
n разрядов влево означает, что n раз повторяется следующее: все двоичные разряды байта,
содержащего символ, перемещаются на один разряд влево, а самый левый разряд
перемещается на место самого правого. В Delphi функции работы с файлами описаны на
сайте www.chuvsu.ru/~fak_diz, в заданиях для заочников по сетевым операционным
системам (лабораторные работы).
3. Разработать программу, которая циклически сдвигает двумерный массив (10 строк, 12
столбцов) построчно, используя рекурсию (вызов подпрограммы в этой же
подпрограмме), но не используя подпрограмм (функций или процедур). Другими словами,
это «распроцедуривание», или «встраивание функции в тело основной программы» для
рекурсии – одно из средств ускорения работы программы. Глубина рекурсии – 10.
Рекурсивный циклический сдвиг массива происходит следующим образом: берется
элемент первого столбца первой строки, для него вызывается рекурсия такая: берется
элемент первого столбца второй строки, и т.д. до последней строки, затем последняя
строка циклически сдвигается на 1 элемент, затем еще на 1 элемент и т. д. по количеству
столбцов. Затем происходит возврат на предпоследнюю строку, ее сдвиг на 1 элемент и
снова работа с последней строкой. И так для всех столбцов предпоследней строки. Затем
возврат еще на одну строку (пред-предпоследнюю) и сдвиг ее на 1 и снова такая же работа
с предпоследней строкой, и т.д.
Примечание. Чтобы не использовать подпрограмм, можно использовать массив, хранящий
номера вызывающих рекурсию столбцов. Программа представляет собой перебор всех
комбинаций размещений строк.
Download