Задания на Олимпиаду по программированию (заочный тур) факультета дизайна и компьютерных технологий (для студентов и для школьников) Общие замечания. Программы могут быть разработаны на Delphi, C++ Builder или с помощью любой другой среды разработки. Необходимо для проверки прислать исходный текст и откомпилированное приложение (в архиве по причине небольшой квоты учетной записи) по адресу [email protected]. 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 и снова такая же работа с предпоследней строкой, и т.д. Примечание. Чтобы не использовать подпрограмм, можно использовать массив, хранящий номера вызывающих рекурсию столбцов. Программа представляет собой перебор всех комбинаций размещений строк.