+ еще кое-что важное. Эта программа оставит символы, не присутствующие в строке Alpha_Hor без изменения. То же самое касается и заглавных букв (хотя заглавные буквы можно внести в эту самую строку).
Код:
len = 26;
{Это символы для выбора столбца таблицы}
alpha_hor: string = 'abcdefghijklmnopqrstuvwxyz';
{Здесь будут символы для выбора строки таблицы}
alpha_ver: string = '';
var
{Это собственно таблица кодирования}
table: array[1 .. len, 1 .. len] of char;
{функция получает строку S и возвращает строку,
полученную из исходной сдвигом на N позиций}
function shift(s: string; n: integer): string;
begin
s := copy(s, length(s) - pred(n), n) + s;
delete(s, length(s) - pred(n), n); shift := s
end;
var
i, j, row, col: integer;
s: string; ch: char;
key: string;
is_russian: boolean;
f_in: file of char; f_out, f_key: text;
begin
{ Заполнение таблицы кодировки }
for i := 1 to len do
begin
{получаем строку символов для текущей строки таблицы}
s := shift(alpha_hor, pred(i));
for j := 1 to len do
table[i, j] := s[j];
{
не забываем первый символ заносить в "хранилище"
для выбора строк по кодируемой букве
}
alpha_ver := alpha_ver + s[1]
end;
{ связываем логические файлы программы с физическими файлами на диске }
{файл с фразой для кодирования - открываем для чтения}
assign(f_in, 'f_00in.txt');
{$i-} reset(f_in); {$i+}
{файл для сохранения результата - открываем для записи}
assign(f_out, 'f_00out.txt');
{$i-} rewrite(f_out); {$i+}
{
файл, содержащий ключевое слово - открываем для чтения,
считываем слово в строковую переменную и закрываем файл
}
assign(f_key, 'f_00key.txt');
{$i-} reset(f_key); {$i+}
readln(f_key, key);
close(f_key);
{счетчик закодированных символов}
i := 0;
{до конца кодируемого файла делаем следующее:}
while not eof(f_in) do
begin
{читаем очередной символ}
read(f_in, ch);
{находим по нему строку таблицы}
row := pos(ch, alpha_ver);
{
эта переменная содержит значение успеха предыдущей операции
(если True, то символ присутствует в таблице, иначе False)
}
is_russian := (row > 0);
if is_russian then
begin
{Если символ присутствует в таблице, его надо кодировать}
{увеличиваем счетчик закодированных символов}
inc(i);
{
находим столбец по значению ключевого символа
(операция mod используется, чтобы исключить выход
за пределы ключа, т.к. длина ключа обычно меньше
длины шифруемой последовательности)
}
col := pos(key[i mod (length(key))], alpha_hor);
{и заменяем простой символ на зашифрованный (из таблицы)}
ch := table[row, col];
end;
{
если символ надо было шифровать, он уже зашифрован,
если он не может быть зашифрован, он остался без изменений.
Пишем его в выходной файл
}
write(f_out, ch)
end;
{И закрываем оба файла: исходный и зашифрованный}
close(f_out);
close(f_in)
end.
Комментариев нет:
Отправить комментарий