* C for Dummies * Aleph * 2000-07-10 * 002 * -----[00]----------[Quote of Day]----------------------------------------- У Д. Пойа, в одной из его популярных книг ("Математика и правдоподобные рассуждения"), есть чудная притча, которая так мне нравится, что я не поленился разыскать книгу и привести ее полностью: Логик, математик, физик и инженер. ================================== - Взгляни на этого математика, - сказал логик. - Он замечает, что первые 99 чисел меньше сотни, и отсюда с помощью того, что он называет индукцией, заключает, что все числа меньше сотни. - Физик верит, - сказал математик, - что 60 делится на все числа. Он замечает, что 60 делится на 1, 2, 3, 4, 5 и 6. Он проверяет несколько других чисел, например 10, 20 и 30, взятых, как он говорит, наугад. Так как 60 делится и на них, то он считает экспериментальные данные достаточными. - Да, но взгляни на инженера, - возразил физик. - Инженер подозревает, что все нечетные числа - простые. Во всяком случае, 1 можно рассматривать как простое число, доказывает он. Затем идут 3, 5 и 7, все несомненно простые. Затем идет 9 - досадный случай; 9, по-видимому, не является простым числом. Но 11 и 13, конечно, простые. Возвратимся к 9, - говорит он, - я заключаю, что 9 должно быть ошибкой эксперимента. -----[01]----------[Hot News]--------------------------------------------- Документация по С. Справа в скобках указан размер файла. Все файлы упакованы Rar и, затем, повторно Zip - XOOM не позволяет upload Rar-архивов, а я не использую ничего другого. Краткий справочник по С. Удобно иметь под рукой. (rus) http://members.xoom.com/c4dummies/files/bolski.zip ( 32,554) Выучи сам С за 21 день. (eng) http://members.xoom.com/c4dummies/files/c21.zip (641,861) Шутливый текст. С-Библия. (eng) http://members.xoom.com/c4dummies/files/cbible.zip ( 1,975) Разрозненная документация. (rus) http://members.xoom.com/c4dummies/files/cbook.zip ( 94,207) http://members.xoom.com/c4dummies/files/cdox.zip ( 27,283) http://members.xoom.com/c4dummies/files/mixed.zip (140,666) Обрывок книги Кернигана. (rus) http://members.xoom.com/c4dummies/files/kernigan.zip (202,002) Справочный файл по MSC. Отличия от TC незначительны. (rus) http://members.xoom.com/c4dummies/files/mschelp.zip (120,849) Справочные файлы по С в формате NortonGuide и вьюверы для них (rus/eng) http://members.xoom.com/c4dummies/files/ngclanguage.zip ( 92,103) http://members.xoom.com/c4dummies/files/ngmicrosoftc.zip (122,309) http://members.xoom.com/c4dummies/files/ngviewer.zip ( 89,864) Обрывок книги Шилдта. Множество ошибок и опечаток. (rus) http://members.xoom.com/c4dummies/files/shildt.zip (170,289) Книга Стивенса (ведет колонку в Dr.Dobbs Journal) Не свободна от опечаток. (rus) http://members.xoom.com/c4dummies/files/stievens.zip (163,280) Описание среды TC 2.0 (rus) http://members.xoom.com/c4dummies/files/tc20.zip (331,660) Обучалка по TC 2.0 (eng) http://members.xoom.com/c4dummies/files/tctutor.zip (318,924 Несмотря на значительный общий объем, рекомендую скачать и изучить все. Архивер Rar (и множество других полезных вещей) можно найти здесь: ftp://ntutil.quarta.ru/ ftp://ntutil.quarta.ru/WinUtil/Rar/rarx271.exe (264 Kb) ftp://ntutil.quarta.ru/WinUtil/Rar/wrar271ru.exe (670 Kb) или прямо на сайте автора: Url: ftp://ftp.netlab.sk/public/rarsoft/rar/wrar271.exe (602,282) -----[02]----------[Topic]------------------------------------------------ Операции по модулю. Представление отрицательных чисел. Операции сдвига. -----[03]----------[Body]------------------------------------------------- Операции по модулю ------------------ Еще несколько слов об операциях по модулю и шифровании. Те из Вас, кто пользовался старыми версиями Netscape Messenger (в новых эта функция отсутствует) или превосходным текстовым редактором EditPad (Windows NotePad replacement) EditPad Classic 3.5.2: Url: http://www.jgsoft.com/zips/EditPadClassic.zip size: 314737 EditPad Lite 4.0.0 beta 3: Url: http://www.jgsoft.com/zips/EditPadLite.zip size: 365273 возможно, обращали внимание на пункт меню ROT-13. Вот как выглядит в EditPad фраза "The quick brown fox jumps over the lazy dog." после выбора пункта меню 'Convert | ROT-13': "Gur dhvpx oebja sbk whzcf bire gur ynml qbt." Повторный выбор этого пункта возвращает все назад. Очевидно, перед нами примитивный шифр. Используется он с тем, чтобы сделать передаваемое по E-Mail сообщение "неразборчивым" для любопытных глаз. Это, конечно, не "строгая криптография", но, все же, больше, чем ничего. А что при этом происходит? Попробуем разгадать. Все буквы алфавита у нас есть. Составим таблицу подстановок. Table 1 (Natural Order) +----+-----------------+-----------------+ | | Plain Text | Cipher Text | | ## +------+----------+------+----------+ | | Char | Binary | Char | Binary | +----+------+----------+------+----------+ | 00 | T | 01010100 | G | 01000111 | | 01 | h | 01101000 | u | 01110101 | | 02 | e | 01100101 | r | 01110010 | | 03 | q | 01110001 | d | 01100100 | | 04 | u | 01110101 | h | 01101000 | | 05 | i | 01101001 | v | 01110110 | | 06 | c | 01100011 | p | 01110000 | | 07 | k | 01101011 | x | 01111000 | | 08 | b | 01100010 | o | 01101111 | | 09 | r | 01110010 | e | 01100101 | | 10 | o | 01101111 | b | 01100010 | | 11 | w | 01110111 | j | 01101010 | | 12 | n | 01101110 | a | 01100001 | | 13 | f | 01100110 | s | 01110011 | | 14 | o | 01101111 | b | 01100010 | | 15 | x | 01111000 | k | 01101011 | | 16 | j | 01101010 | w | 01110111 | | 17 | u | 01110101 | h | 01101000 | | 18 | m | 01101101 | z | 01111010 | | 19 | p | 01110000 | c | 01100011 | | 20 | s | 01110011 | f | 01100110 | | 21 | o | 01101111 | b | 01100010 | | 22 | v | 01110110 | i | 01101001 | | 23 | e | 01100101 | r | 01110010 | | 24 | r | 01110010 | e | 01100101 | | 25 | t | 01110100 | g | 01100111 | | 26 | h | 01101000 | u | 01110101 | | 27 | e | 01100101 | r | 01110010 | | 28 | l | 01101100 | y | 01111001 | | 29 | a | 01100001 | n | 01101110 | | 30 | z | 01111010 | m | 01101101 | | 31 | y | 01111001 | l | 01101100 | | 32 | d | 01100100 | q | 01110001 | | 33 | o | 01101111 | b | 01100010 | | 34 | g | 01100111 | t | 01110100 | +----+------+----------+------+----------+ Таблица 1 выглядит не слишком удобной: некоторые буквы повторяются по несколько раз и, кроме того, кажется естественным расставить их в алфавитном порядке. Если Ваш текстовый редактор не поддерживает сортировку текста, обзаведитесь чем-либо профессиональным. (EditPad, к сожалению, не поддерживает). Составим Таблицу 2, в которой исключим дубли. Table 2 (Unique + Alphabet Sorting) +----+-----------------+-----------------+ | | Plain Text | Cipher Text | | ## +------+----------+-----------------+ | | Char | Binary | Char | Binary | +----+------+----------+-----------------+ | 00 | T | 01010100 | G | 01000111 | | 01 | a | 01100001 | n | 01101110 | | 02 | b | 01100010 | o | 01101111 | | 03 | c | 01100011 | p | 01110000 | | 04 | d | 01100100 | q | 01110001 | | 05 | e | 01100101 | r | 01110010 | | 06 | e | 01100101 | r | 01110010 | | 07 | f | 01100110 | s | 01110011 | | 08 | g | 01100111 | t | 01110100 | | 09 | h | 01101000 | u | 01110101 | | 10 | i | 01101001 | v | 01110110 | | 11 | j | 01101010 | w | 01110111 | | 12 | k | 01101011 | x | 01111000 | | 13 | l | 01101100 | y | 01111001 | | 14 | m | 01101101 | z | 01111010 | | 15 | n | 01101110 | a | 01100001 | | 16 | o | 01101111 | b | 01100010 | | 17 | p | 01110000 | c | 01100011 | | 18 | q | 01110001 | d | 01100100 | | 19 | r | 01110010 | e | 01100101 | | 20 | s | 01110011 | f | 01100110 | | 21 | t | 01110100 | g | 01100111 | | 22 | u | 01110101 | h | 01101000 | | 23 | v | 01110110 | i | 01101001 | | 24 | w | 01110111 | j | 01101010 | | 25 | x | 01111000 | k | 01101011 | | 26 | y | 01111001 | l | 01101100 | | 27 | z | 01111010 | m | 01101101 | +----+------+----------+------+----------+ Легко заметить, что 3 старших бита не принимают участия в игре - они одинаковы в обоих столбцах. Отбросим старшие биты и дополним таблицу числовыми значениями букв. (Я также исключил единственную заглавную букву 'T', так как у нас есть ее строчный вариант - 't'). Table 3 (Truncated) +----+-------------------------+-------------------------+ | | Plain Text | Cipher Text | | ## +------+----------+-------+------+----------+-------+ | | Char | Binary | Value | Char | Binary | Value | +----+------+----------+-------+------+----------+-------+ | 00 | a | 00001 | 01 | n | 01110 | 14 | | 01 | b | 00010 | 02 | o | 01111 | 15 | | 02 | c | 00011 | 03 | p | 10000 | 16 | | 03 | d | 00100 | 04 | q | 10001 | 17 | | 04 | e | 00101 | 05 | r | 10010 | 18 | | 05 | f | 00110 | 06 | s | 10011 | 19 | | 06 | g | 00111 | 07 | t | 10100 | 20 | | 07 | h | 01000 | 08 | u | 10101 | 21 | | 08 | i | 01001 | 09 | v | 10110 | 22 | | 09 | j | 01010 | 10 | w | 10111 | 23 | | 10 | k | 01011 | 11 | x | 11000 | 24 | | 11 | l | 01100 | 12 | y | 11001 | 25 | | 12 | m | 01101 | 13 | z | 11010 | 26 | | 13 | n | 01110 | 14 | a | 00001 | 01 | | 14 | o | 01111 | 15 | b | 00010 | 02 | | 15 | p | 10000 | 16 | c | 00011 | 03 | | 16 | q | 10001 | 17 | d | 00100 | 04 | | 17 | r | 10010 | 18 | e | 00101 | 05 | | 18 | s | 10011 | 19 | f | 00110 | 06 | | 19 | t | 10100 | 20 | g | 00111 | 07 | | 20 | u | 10101 | 21 | h | 01000 | 08 | | 21 | v | 10110 | 22 | i | 01001 | 09 | | 22 | w | 10111 | 23 | j | 01010 | 10 | | 23 | x | 11000 | 24 | k | 01011 | 11 | | 24 | y | 11001 | 25 | l | 01100 | 12 | | 25 | z | 11010 | 26 | m | 01101 | 13 | +----+------+----------+-------+------+----------+-------+ Wow ! Надеюсь, Вы узнали код Цезаря. За 2000+ лет изменилась только константа сдвига - вместо оригинального числа 3 использовано число 13. Если Вы полагаете, что число 13 выбрано из мистических или нумерологических соображений, то это не так. Все гораздо проще. В английском (латинском) алфавите 26 букв. Если расположить их на циферблате, то сдвиг на 13 будет означать поворот (ROTation) ровно на половину круга. Повторное преобразование ROT-13 добавит еще половину круга и, таким образом, мы получим полный поворот, т.е. оригинальный текст. Благодаря замечательным "круговым" свойствам операций по модулю, одно и тоже преобразование (ROT-13) используется как для зашифровки, так и для дешифровки текста. Часто, окружность связанную с вычислениями по модулю представляют как окружность единичного радиуса на комплексной плоскости (циферблат), а числовые отметки на ней (числа от 0 до N-1, где N - модуль), трактуют как комплексные корни степени N из единицы. При этом само преобразование одного элемента в другой имеет простой геометрический смысл поворота вектора на комплексной плоскости или, алгебраически, умножения на оператор поворота. Разумеется, поворот не обязательно выполняется на половину окружности. Например, при вычислениях с комплексными числами, i (электрики используют другую букву - j, чтобы не путать с силой тока) - это оператор поворота на 90 градусов. В теории электрических машин широко используются операторы Парка. В трехфазных электрических цепях они эквивалентны повороту на 0, 120 и 240 градусов. Рассматривая код Цезаря, мы также можем ввести оператор поворота '@' (я выбрал для него такое обозначение, чтобы не путать с латинскими буквами) на 3/26 полного круга (не различая прописные и строчные буквы). Тогда, можно записать: @ * A -> D @ * B -> E @ * C -> F @ * D -> G @ * E -> H @ * F -> I @ * G -> J @ * H -> K @ * I -> L Или D = @ * A E = @ * B F = @ * C G = @ * D = @ * @ * A H = @ * E = @ * @ * B I = @ * F = @ * @ * C J = @ * G = @ * @ * D = @ * @ * @ * A K = @ * H = @ * @ * E = @ * @ * @ * B L = @ * I = @ * @ * F = @ * @ * @ * C Используя символ ^ для обозначения возведения в степень (Не путайте с синтаксисом языка C - там нет операции возведения в степень), это же можно записать немного короче: A = @^0 * A B = @^0 * B C = @^0 * C D = @^0 * D = @^1 * A E = @^0 * E = @^1 * B F = @^0 * F = @^1 * C G = @^0 * G = @^1 * D = @^2 * A H = @^0 * H = @^1 * E = @^2 * B I = @^0 * I = @^1 * F = @^2 * C J = @^0 * J = @^1 * G = @^2 * D = @^3 * A K = @^0 * K = @^1 * H = @^2 * E = @^3 * B L = @^0 * L = @^1 * I = @^2 * F = @^3 * C Каждое умножение на оператор '@' приводит к 'повороту' буквы на 3 позиции 'вперед' на циферблате, а деление на оператор '@', наоборот 'поворачивает' букву на 3 позиции 'назад' на циферблате. Netscape Messenger, в числе прочих, поддерживает 4 кириллические кодировки: DOS, KOI8-R, Win-1251 и ISO-8859-5. Мы не будем рассматривать кодировку DOS, устроенную несколько не так, как остальные, и ограничимся только тремя оставшимися. Исключая из рассмотрения букву 'E:', ограничимся 32-символьным алфавитом (снова не различая прописные и строчные буквы). Возможно, Вам доводилось получать "нечитаемые" письма - результат нескольких последовательных перекодировок. С позиций криптоанализа, перекодировка, например, Win-1251 -> KOI8-R есть ни что иное, как вариант кода Цезаря, где для каждой буквы использована собственная константа сдвига. Последовательное применение (произведение) нескольких перекодировок делает текст совершенно нераспознаваемым. Однако, в силу цикличности подстановки, для любой буквы существует весьма ограниченное число возможностей (меток на циферблате). Тривиальный случай - 1. На циферблате только одна отметка, буква не сдвигается (переходит сама в себя). Это тождественная подстановка. Экстремальный случай - 32. На циферблате все возможные отметки (все символы алфавита, не обязательно по порядку). Тогда, очевидно, за некоторое число шагов, равное наименьшему общему кратному всех констант сдвига (для всех букв сообщения), мы совершим полный оборот и получим исходное сообщение. Например, Вы получили письмо, ошибочно дважды перекодированное по схеме Win-1251 -> KOI8-R. Чтобы прочитать оригинальное сообщение, необходимо дважды выполнить обратное преобразование (деление на оператор поворота) KOI8-R -> Win-1251. Или (N - 2) раз (где N - наименьшее общее кратное) выполнить прямое преобразование (умножение на оператор поворота) Win-1251 -> KOI8-R. В какую бы сторону Вы не двигались по окружности, Вы неизбежно вернетесь в исходную точку. Другой важный и интересный пример вычислений по модулю - генерация последовательностей случайных чисел. На самом деле, псевдослучайных, так как длина последовательности ограничена (обычно, 2^32), а сами числа и их порядок жестко определяются начальными установками. Среди библиотечных функций C есть и генератор случайных чисел (не очень хорошего качества) и позднее мы рассмотрим методы генерации псевдослучайных последовательностей и напишем собственный. Пока же только замечу, что они очень похожи на рассмотренные нами перекодировки, только применяемые не к буквам, а к битам. Представление отрицательных чисел --------------------------------- Всем известно, как представляются отрицательные числа в десятичной системе счисления - к ним просто приписывается спереди знак '-' (минус). Знак '+' для положительных чисел, обычно, опускается. Никто не мешает поступить нам аналогичным образом в любой другой системе счисления, просто приписав знак перед числом. При использовании двоичной системы счисления принято соглашение, что при знаковых операциях старший (самый левый) бит числа рассматривается как знак. Аналогично десятичной системе, 0 (отсутствие знака) обозначает положительное число, а 1 - наличие знака '-', то есть, отрицательное число. На приведенной ниже схеме, для представления числа использован 8-разрядный регистр (байт), старший бит которого отведен под знаковый разряд (S): --------------------------------- | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | --------------------------------- | S | x | x | x | x | x | x | x | --------------------------------- Если S = 0, число положительно, если S = 1 - отрицательно. Системы по отрицательному и комплексному основанию избавлены от необходимости подобных соглашений, так как положительные и отрицательные числа представлены в них однородным образом, без использования специального знакового разряда, как, например, в популярной мнимо-четверичной (quater-imaginary) системе счисления (по основанию 2i), особенно удобной для работы с комплексными числами. Интересно, что хотя мнимые (imaginary) числа были введены еще знаменитым греческим геометром и изобретателем Героном Александрийским (Hero of Alexandria, 62), которому принадлежат и формула Герона и изобретение паровой турбины, они почти игнорировались математиками до середины XIX столетия. Существуют и другие подходы. В уже упоминавшейся книге Д. Кнут "Искусство программирования для ЭВМ", т. 2, гл. 4 "Арифметика", рассматривается уравновешенная троичная система счисления (по основанию 3), в которой вместо цифр 0, 1 и 2 (как можно было ожидать), используются 'триты' - '-1', '0', '+1'. Каждый трит - это отдельный разряд (подобно биту). Смена знака числа осуществляется просто взаимной заменой тритов '-1' и '+1'. К сожалению, при разработке первых электронных компьютеров, на элементной базе того времени, уравновешенная троичная система проиграла двоичной в качестве альтернативы десятичной системе счисления и, по историческим причинам, действия с отрицательными числами выполняются сложнее, чем это могло быть в ином случае. Разумеется, вычитание может быть выполнено обычным "школьным" способом - с заемом (borrow), но это усложняет арифметическое устройство, которое должно поддерживать не только перенос при сложении (carry), но и заем при вычитании. Чтобы избежать этого, отрицательные числа представляют некоторым специальным образом, так чтобы заменить вычитание сложением и обойтись одними только переносами, без заемов. При этом, по-прежнему, для хранения знака используется старший бит, но само число записывается по другому. Рассмотрим простое тождество: A - A = A + (-A) = 0 A - некоторое положительное число, а -A - оно же, но с обратным знаком. Взамен вычитания двух положительных чисел, мы используем сложение положительного и отрицательного числа. Отсюда мы можем немедленно получить необходимое представление отрицательного числа - оно должно быть таким, чтобы при сложении с положительным самим собой получался нуль. Возьмем, к примеру, положительное двоичное число 01111111 = 127 --------------------------------- | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | --------------------------------- | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | --------------------------------- Как должно выглядеть -127 в двоичном виде ? Расположим эти два числа одно под другим и выполним обычное сложение. Неизвестные биты второго слагаемого обозначены через X. 0 1 1 1 1 1 1 1 + x7 x6 x5 x4 x3 x2 x1 x0 ------------------------------ 0 0 0 0 0 0 0 0 Выпишем систему уравнений, с учетом переноса из младших разрядов при сложении. Возникающий перенос будем обозначать через C (Carry). Для младшего (нулевого) разряда: 1 + x0 = 0 Вспомним таблицу сложения двоичных чисел: ------------- | + | 0 | 1 | ------------- | 0 | 0 | 1 | ------------- | 1 | 1 | * | ------------- Есть только одно решение этого уравнения: x0 = 1. При этом возникает перенос в следующий разряд. 0 1 1 1 1 1 1 1 + x7 x6 x5 x4 x3 x2 x1 1 ------------------------------ 0 0 0 0 0 0 0 0 Для первого разряда: 1 + x1 + C = 0 Очевидное решение этого уравнения x1 = 0 + перенос в следующий разряд. 0 1 1 1 1 1 1 1 + x7 x6 x5 x4 x3 x2 0 1 ------------------------------ 0 0 0 0 0 0 0 0 Легко заметить, что для неизвестных битов x2 - x6 мы имеем в точности ту же самую ситуацию, что и для бита x1, так что немедленно можем установить значения еще нескольких неизвестных битов: 0 1 1 1 1 1 1 1 + x7 0 0 0 0 0 0 1 ------------------------------ 0 0 0 0 0 0 0 0 Теперь у нас остался только один неизвестный бит - x7. Уравнение для него выглядит так: 0 + x7 + С = 0 Чтобы "погасить" перенос C из шестого разряда, x7 обязано быть не нулевым. Итак, мы нашли все неизвестные: 0 1 1 1 1 1 1 1 + 1 0 0 0 0 0 0 1 ------------------------------ 0 0 0 0 0 0 0 0 Заметьте, что в старшем (седьмом) разряде возник перенос, который был потерян из-за ограниченности разрядной сетки, но если бы мы использовали регистр большей разрядности, он был бы передан дальше. На самом деле, конечно, перенос не теряется. Обычно, процессор имеет дополнительный регистр флагов, в который и передается информация о переполнении разрядной сетки. При этом в регистре флагов взводится специальный флаг переноса - Carry Flag - сигнализирующий о произошедшем переполнении, так что программа или OS могут правильно обработать ситуацию. Выпишем полученный результат: 01111111 = 127 10000001 = -127 Мы рассмотрели, как находится отрицательное число -127, но легко понять, что это общая схема: Для получения отрицательного числа необходимо инвертировать все биты исходного числа и прибавить единицу в младший разряд. Число, получаемое инвертированием всех битов исходного, называется обратным (ничего неожиданного), а число, получаемое прибавлением единицы к обратному, называется дополнительным. Гм. Вы еще не догадались, почему дополнительным и к чему дополнительным ? Если нет, посчитайте сумму битов дополнительного числа. -127 -> 10000001 --------------------------------- | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | --------------------------------- | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | --------------------------------- 1 * 2^7 + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 128 + 1 = 129 127 + 129 = 256 = 0 mod 256 Все очень просто, число -127 дополнительно к числу +127 по модулю, определяемому разрядностью регистра. В данном случае, регистр имеет 8 разрядов (байт) и мы получаем 2^8 = 256. Иными словами, вместо действительного вычитания двух положительных чисел, мы использовали математически эквивалентное сложение первого положительного числа и дополнительного по модулю ко второму положительному числу. Если Вам это показалось слишком сложным, значит Вы плохо думали над домашним заданием и кодами Цезаря. -----[04]----------[Homework]--------------------------------------------- Вопросы не обязательно основаны на материалах выпуска и, как это обычно и бывает в жизни, могут потребовать от Вас самостоятельного исследования. 1. К сожалению, текстовый редактор EditPad поддерживает шифрование ROT-13 только для латинского алфавита. Выбор этого пункта меню не оказывает влияния на текст, набранный кириллицей. Представьте, что Вы президент фирмы Hytrosoft Inc. (Хитрософт Инк.), получившей выгодный заказ на разработку текстового редактора с поддержкой кириллицы и со встроенными функциями шифрования. Вы решили воспользоваться кодом Цезаря (ROT-XX). Какую константу сдвига XX (оператор поворота) необходимо использовать для текста, набранного кириллицей (с учетом регистра - различая прописные и строчные буквы, но без учета буквы 'E:'). Зависит ли, и если да, то как, выбор этой константы от используемой кириллической кодировки: KOI8-R, Win-1251 и ISO-8859-5. Есть ли у Вас основания требовать дополнительную плату за поддержку шифрования всех трех кодировок. Ваша кириллическая ROT-XX должна работать точно также как ROT-13: первое применение ROT-XX зашифровывает текст, повторное - расшифровывает. 2. Найдите (теоретически или экспериментально) период (число отметок на циферблате) для одной (по Вашему выбору) из пар перекодировок: KOI8-R -> ISO-8859-5 ISO-8859-5 -> KOI8-R KOI8-R -> Win-1251 Win-1251 -> KOI8-R ISO-8859-5 -> Win-1251 Win-1251 -> ISO-8859-5 Иными словами, через сколько последовательных перекодировок, Вы вновь получите исходный текст ? TIP: Сопоставьте каждой букве алфавита ее числовой эквивалент (за вычетом постоянной составляющей: А - 0, Б - 1, В - 2 итд) 3. Учитывая конечное число всех "испорченных" перекодировок, можно ли утверждать, что любое письмо, подвергнувшееся произвольному числу вышеперечисленных кодировок в произвольном порядке, может быть восстановлено в оригинальном виде? Если нет, то почему? Если да, то каково максимальное число проб? -----[05]----------[Feedback]--------------------------------------------- Описания достоинств мнимо-четверичной системы счисления никто не прислал. Я Вам тоже ничего не скажу - домашние задания даются для того, чтобы их делали Вы, а не я. BTW, если Вы полагаете, что сможете выучить С лежа на диване и почитывая выпуски, то это неправильно. Есть лишь один способ выучить язык (и язык программирования в том числе) - это активно пользоваться им. Моя цель - только правильно расставить акценты в Вашей самостоятельной работе. -----[06]----------[Glossary]--------------------------------------------- BTW - abbr. - By The Way -----[07]----------[Junk]------------------------------------------------- К сожалению, до сих пор не удалось обзавестись приличным русским спеллером. В порядке эксперимента, этот выпуск проверен Hieroglyph 3.0. Валяется он у меня давно, но за, полной бесполезностью, никакого применения найти ему не удавалось. Url: http://www.adelaida.net/hieroglyph/hglyph30.exe size: 950747 Url: http://www.adelaida.net/hieroglyph/engspell.zip size: 309951 Url: http://www.adelaida.net/hieroglyph/russpell.zip size: 599633 -----[08]----------[Info]------------------------------------------------- Вопросы и замечания принимаются по адресу: aleph@canada.com Предыдущие выпуски доступны со страницы архива: http://www.subscribe.ru/archive/comp.prog.c4dummies/ -----[--]----------[The End]----------------------------------------------

© Gazlan 2009 * gazlan@yandex.ru

Hit Counter