Помогите пожалуйста немного переделать, программа работает, но нужно сделать так, что бы:
1) режим шифровки и расшифровки был независим от друга
2)при вводе строки кол-во символов должно быть кратно ключу , иначе нужно повторить ввод
__________________________________________________ _______
вот сама задача:
Написать программу в которой нужно реализовать режим шифровки расшифровки, и возможность дополнительного контроля ввода
Входными данными программы должны быть:
- для режима шифрования: строка текста и ключ, указывающий раз-
мер блока и порядок перестановки в пределах этого блока;
-для режима расшифровки: закрытый текст и ключ, указывающий
размер блока и порядок перестановки в пределах этого блока.
Выходными данными являются:
-для режима шифрования: закрытый текст;
-для режима расшифровки: открытый текст.
Используемые переменные:
– s, r – строки открытого и закрытого текста соответственно;
– len – длина текстовой строки;
– a – массив, содержащий числа, определяющие порядок перестановки;
– i, j, v – счетчики циклов и вспомогательная переменная целого типа;
– key – размер блока.
Пример : Открытый текст: "ШИФРОВАНИЕ_ПЕРЕСТАНОВКОЙ".
Ключ (правило перестановки): группы из 8 букв с порядковыми номерами
1, 2, ..., 8 переставить в порядок 3-8-1-5-2-7-6-4.
Шифртекст: "ФНШОИАВР_СИЕЕЕРПННТВАОКО".
Код:
program Project1;
{$APPTYPE CONSOLE}
uses
windows,
SysUtils;
const n=30;
var a,b:array[1..n] of integer;
s,s1,s2,r,ch:string;
i, j, p, key,k:integer;
m:set of byte;
c:char;
begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
r:='';
repeat
writeln('Выберите действие');
writeln('1-зашифровать текст');
writeln('2-расшифровать текст');
writeln('другое - выход');
readln(c);
case c of
'1':begin
writeln('Введите текст для шифрования: ');
readln(s);
repeat
write('Введите количество цифр в ключе от 2 до ',n,' key= ');
readln(ch);
val(ch,key,k);
until (k=0)and(key in [1..n]); //если число и в интервале 1..n
while length(s) mod key<>0 do s:=s+' ';
writeln('Введите ключ из неповторяющихся чисел от 1 до ',key,' : ');
m:=[];
for i:=1 to key do
begin
repeat
write('a[',i,']=');
readln(ch);
val(ch,p,k);
until(k=0)and(p in [1..key])and not(p in m);
a[i]:=p;
m:=m+[p];
end;
i:=1;
while i<=length(s)-key+1 do
begin
s1:=copy(s,i,key);
s2:='';
for j:=1 to key do
s2:=s2+s1[a[j]];
r:=r+s2;
i:=i+key;
end;
for i:=length(r) downto 1 do
if r[i]=' ' then delete(r,i,1);
writeln('Зашифрованный текст: ');
writeln(r);
write('Нажмите Enter');
readln;
end;
'2':begin
if r='' then writeln('Зашифрованный текст еще не создан, вернитесь к пункту 1')
else
begin
//создадим ключ для дешифровки
for i:=1 to key do
begin
for j:=1 to key do
if a[j]=i then b[i]:=j
end;
s:=r;
while length(s) mod key<>0 do s:=s+' ';
r:='';
i:=1;
while i<=length(s)-key+1 do
begin
s1:=copy(s,i,key);
s2:='';
for j:=1 to key do
s2:=s2+s1[b[j]];
r:=r+s2;
i:=i+key;
end;
for i:=length(r) downto 1 do
if r[i]=' ' then delete(r,i,1);
writeln('Расшифрованный текст');
writeln(r);
end;
write('Нажмите Enter');
readln;
end;
else
begin
writeln('Программа завершена');
exit;
end;
end;
until not(c in ['1','2']);
End.