Xwab
Форумыnavigate_nextДругие языки программирования

Шифр Виженера на Pascal'е
Сообщения
klesh

Добрый день. Вот рылся в старых файлах и нашел программу для шифрования и дешифрирования по методу Виженера на Pascal ABC писал еще пару лет назад для автомата по экзамену в колледже. Писал сам так как в то время рабочий на просторах инета я не нашел. Код легкий и с комментариями разобраться в нем не составит труда. Писал с нулевыми знаниями по паскалю (это первый и единственный скрит на нем). Вылаживаю может кому тоже он поможет получить зачет или хорошую оценку

24 Ноя 2012, 10:28
Istsam

исходник сюда дай качать лнь

24 Ноя 2012, 11:16
COOLBOY007

Istsam, Исходник пишет:
"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

24 Ноя 2012, 18:02
Виктор

Раньше goto было вполне хорошей процедурой. Сейчас же её недолюбливают. Сам раньше её пользовался

24 Ноя 2012, 18:06
TOOZ

Где то я видел крутой комикс с goto
добавлено спустя 35 секунд:
http://imgs.xkcd.com/comics/goto.png

24 Ноя 2012, 18:07
Lexan

меня больше испугали названия переменных и ошибки в сообщениях:
arrey_table, cipher (цифер? шифер? О_о), Англизкий, будите, Дешифроватор, алфовит и тд.

24 Ноя 2012, 20:40
klesh

Писал за вечер перед экзаменом поэтому как то сильно на орфографию и т.д. не обращал внимание) если вгрызаться то да там много недочетов и сам код можно было бы сделать гораздо лучше и компактней ток мне тогда этого не надо было) цель была что бы все работало и легко объяснялось учителю)

24 Ноя 2012, 21:46
Febian

klesh пишет:
"цель была что бы все работало и легко объяснялось учителю)"

Ну и как твой arrey_table работал?  Или тот же arrey_str.

25 Ноя 2012, 0:55
klesh

Febian, XD если не знаешь о чем пишешь зачем глупости писать XD это названия массивов орфографические ошибки в названиях переменных не влияют на работоспособность кода. И хотя бы запустил бы данный код проверил бы что он не работает и тогда писал бы уже )))


__________
посл.ред. 25 Ноя 2012, 13:22; всего 1 раз 25 Ноя 2012, 13:19
Febian

klesh, ковырять паскаль противно. Поэтому что на глаза попалось, то и указал. // Не думал, что сей ЯП на столько примитивен(

25 Ноя 2012, 13:22
Ответить на тему