Добрый день. Вот рылся в старых файлах и нашел программу для шифрования и дешифрирования по методу Виженера на Pascal ABC писал еще пару лет назад для автомата по экзамену в колледже. Писал сам так как в то время рабочий на просторах инета я не нашел. Код легкий и с комментариями разобраться в нем не составит труда. Писал с нулевыми знаниями по паскалю (это первый и единственный скрит на нем). Вылаживаю может кому тоже он поможет получить зачет или хорошую оценку
24 Ноя 2012, 10:28Istsam, Исходник пишет:
"program Viginer;
const
nabor_en : string = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz';
nabor_ru : string = 'абвгждеёжизийклмнопрстуфхцчшщъыьэюяабвгждеёжизийклмнопрстуфхцчшщъыьэюя';
kol_en : integer = 26;
kol_ru : integer = 35;
var
arrey_table : array[1..35,1..35] of string;
text, key, text_key, text_cipher, text_decipher, arrey_str, nabor : string;
i, j, cifra, vihod, otvet, x, y, length_text, num, kol : integer;
label
index, cipher_index, decipher, index_2, vihod_end, cipher;
begin
{-------------------------
| Главное меню программы |
-------------------------}
index: { Главное меню программы }
writeln('Вас привествуюет программа для шифрования и дешифрования по методу Виженера от Зимина Александра группа 47 ТО');
writeln('Выьерите язык с которым будите работать:');
writeln('1 - Русский');
writeln('2 - Англизкий');
read(otvet);
if ( otvet = 1 ) then begin kol := kol_ru; nabor := nabor_ru end else
if ( otvet = 2 ) then begin kol := kol_en; nabor := nabor_en end else
goto index;
writeln('Если вы желаете зашифровать то введите 1 если дешифровать то введите 2. Если вы желаете покинуть программу введите 3.');
index_2: { Повтор ввода выбора действий при ошибки }
read(otvet);
if ( otvet = 1 ) then goto cipher else
if ( otvet = 2 ) then goto decipher else
if ( otvet = 3 ) then goto vihod_end else begin
writeln ('Неверная команда');
goto index_2;
end;
{------------
| Шифрование |
-------------}
cipher: { Шифрование методом печати нужных данных }
writeln ('Введите текст который нужно зашифровать:');
read(text);
writeln ('Введите ключ:');
read(key);
{ Создание таблицы Виженера }
for i := 1 to kol do begin
for j := 1 to kol do begin
if ( i > 1 ) then cifra := j+i-1 else cifra := j;
arrey_table[i,j] := nabor[cifra];
end;
end;
{ Заполнение строки ключ }
length_text := Length(text);
j := 0;
for i := 1 to length_text do begin
if ( j = Length(key) ) then j := 1 else j := j+1;
text_key := text_key + key[j];
end;
{ Производим шифрование }
text_cipher := '';
for i := 1 to length_text do begin
if ( text[i] = ' ' ) then text_cipher := text_cipher + '&'
else begin
for j := 1 to kol do
if ( nabor[j] = text[i] ) then x := j;
for j := 1 to kol do
if ( nabor[j] = text_key[i] ) then y := j;
text_cipher := text_cipher + arrey_table[x,y];
end;
end;
{ Вывод результата }
writeln();
writeln('РЕЗУЛЬТАТ');
writeln('Ключ: ' , key);
writeln('Начальный текст:');
writeln(text);
writeln('Зашифрованный текст:');
writeln(text_cipher);
writeln('Команды: повторить - 1, вернуться в главное меню - 2, выйти из программы - 3');
read(otvet);
if ( otvet = 1 ) then goto cipher else
if ( otvet = 2 ) then goto index else
if ( otvet = 3 ) then goto vihod_end else begin
writeln ('Неверная команда');
goto index;
end;
{---------------
| Дешифрование |
---------------}
decipher: { Дешифроватор }
writeln('Введите текст для дешифрации:');
read(text);
writeln('Введите ключ:');
read(key);
{ Заполнение строки ключ }
length_text := Length(text);
j := 0;
for i := 1 to length_text do begin
if ( j = Length(key) ) then j := 1 else j := j+1;
text_key := text_key + key[j];
end;
{ Производим дешифрование }
text_decipher := '';
for i := 1 to length_text do begin
if ( text[i] = '&' ) then text_decipher := text_decipher + ' '
else begin
{ Вычисляем номер буквы в алфовите }
for j := 1 to kol do
if ( nabor[j] = text_key[i] ) then y := j;
{ Создаем нужную строку из таблицы Виженера }
arrey_str := '';
num := y;
for j := 1 to kol do begin
cifra := j+num-1;
arrey_str := arrey_str + nabor[cifra];
end;
{ Вычисляем номер нашего символа в созданной строке }
for j := 1 to kol do
if ( arrey_str[j] = text[i] ) then x := j;
{ По вычесленному номеру выбираем букву из оригинального алфовита }
text_decipher := text_decipher + nabor[x];
end;
end;
{ Вывод результата }
writeln();
writeln('РЕЗУЛЬТАТ');
writeln('Ключ: ' , key);
writeln('Начальный текст:');
writeln(text);
writeln('Расшифрованный текст:');
writeln( text_decipher);
writeln('Команды: повторить - 1, вернуться в главное меню - 2, выйти из программы - 3');
read(otvet);
if ( otvet = 1 ) then goto decipher else
if ( otvet = 2 ) then goto index else
if ( otvet = 3 ) then goto vihod_end else begin
writeln ('Неверная команда');
goto index;
end;
vihod_end: { Выход из программы }
write('Спасибо за использование нашей программы нажмите ESC ');
end.
"
goto
Раньше goto было вполне хорошей процедурой. Сейчас же её недолюбливают. Сам раньше её пользовался
24 Ноя 2012, 18:06Где то я видел крутой комикс с goto
добавлено спустя 35 секунд:
http://imgs.xkcd.com/comics/goto.png
меня больше испугали названия переменных и ошибки в сообщениях:
arrey_table, cipher (цифер? шифер? О_о), Англизкий, будите, Дешифроватор, алфовит и тд.
Писал за вечер перед экзаменом поэтому как то сильно на орфографию и т.д. не обращал внимание) если вгрызаться то да там много недочетов и сам код можно было бы сделать гораздо лучше и компактней ток мне тогда этого не надо было) цель была что бы все работало и легко объяснялось учителю)
24 Ноя 2012, 21:46klesh пишет:
"цель была что бы все работало и легко объяснялось учителю)"
Ну и как твой arrey_table работал? Или тот же arrey_str.
Febian, XD если не знаешь о чем пишешь зачем глупости писать XD это названия массивов орфографические ошибки в названиях переменных не влияют на работоспособность кода. И хотя бы запустил бы данный код проверил бы что он не работает и тогда писал бы уже )))
klesh, ковырять паскаль противно. Поэтому что на глаза попалось, то и указал. // Не думал, что сей ЯП на столько примитивен(
25 Ноя 2012, 13:22