Добавить меню выбора режима шифрование, расшифровка. Проверку цифр ( если отрицательное число-ошибка) - Pascal ABC
Формулировка задачи:
Добавить меню выбора режима шифрование, расшифровка. Проверку цифр ( если отрицательное число-ошибка).И если можно еще комментарии к программе
Решение задачи: «Добавить меню выбора режима шифрование, расшифровка. Проверку цифр ( если отрицательное число-ошибка)»
textual
Листинг программы
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
r:='';
repeat
cls;
writeln('Выберите действие');
writeln('1-зашифровать текст');
writeln('2-расшифровать текст');
writeln('другое - выход');
readln(c);
case c of
'1':begin
cls;
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
cls;
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
cls;
writeln('Программа завершена');
exit;
end;
end;
until not(c in ['1','2']);
End.
Объяснение кода листинга программы
- Создается переменная
nсо значением 30. - Создается массив
aиbсо 30 элементами типаinteger. - Создаются строки
s,s1,s2,r,ch. - Создается множество
mтипаset of byte. - Создается переменная
cтипаchar. - В цикле
repeatвыполняется следующее:- Выводится сообщение о выборе действия.
- Считывается значение
c.
- В блоке
caseвыполняется следующее:- Если
cравно '1', то:- Выводится сообщение о вводе текста для шифрования.
- Считывается значение
s. - Повторно запрашивается количество цифр в ключе от 2 до
n. - Считывается значение
ch. - Проверяется, что введенное значение
chявляется неповторяющимся числом от 1 доn. - Записывается значение
chв массивa. - Создается новый массив
mи записывается в него значениеch. - Увеличивается значение
iнаkey. - Пока длина
sне превышаетkeyиsне равна пустой строке, то: - Выводится подстрока
sначиная с индексаiи заканчивая индексомi+key. - Записывается значение
sвr. - Увеличивается значение
iнаkey.
- Если
cравно '2', то:- Выводится сообщение о вводе текста для расшифровки.
- Считывается значение
s. - Повторно запрашивается ключ для расшифровки.
- Создается новый массив
bи записывается в него значениеs. - Записывается значение
sвr. - Пока длина
sне превышаетkeyиsне равна пустой строке, то: - Выводится подстрока
sначиная с индексаiи заканчивая индексомi+key. - Записывается значение
sвr. - Увеличивается значение
iнаkey.
- Если
- В цикле
whileвыполняется следующее:- Если
rравно пустой строке, то выводится сообщение о том, что зашифрованный текст еще не создан, и пользователю предлагается вернуться к пункту 1. - Иначе, то:
- Выводится сообщение о расшифрованном тексте.
- Выводится расшифрованный текст.
- Выводится сообщение
Нажмите Enter. - Считывается символ
Enter.
- Если
- В блоке
forвыполняется следующее:- Если
r[i]равно пробелу, то удаляется этот символ из строкиr.
- Если
- Программа завершается.