Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача на шифрование текста

Автор: Pistoletka 18.09.2016 18:37

Подскажите, где ошибка? При перестановке по заданному порядку выходит сообщение о том, что "Ошибка времени выполнения: Индекс находился вне границ массива".
Задача. Открытый текст: "ШИФРОВАНИЕ_ПЕРЕСТАНОВКОЙ".
Ключ (правило перестановки): группы из 8 букв с порядковыми номерами
1, 2, ..., 8 переставить в порядок 3-8-1-5-2-7-6-4.
Шифртекст: "ФНШОИАВР_СИЕЕЕРПННТВАОКО".

Program shifr;
const n=30;
var
a:array[1..n] of integer;
len:integer;
s, r:string;
i, j, v:integer;
p, key:integer;
Begin
write('Введите текст для шифрования: ');
read(s);
writeln('-------------------------------------------------');
write('Введите количество цифр в ключе: ');
readln(key);
len:= length(s);
while len mod key<>0 do
begin
s:=s+' ';
inc(len)
end;
writeln('Введите ключ из ',key,' цифр: ');
repeat
v:=0;
for i:=1 to key do
begin
read(p);
a[i]:=p
end;
for i:=1 to key-1 do
for j:=i+1 to key do
if a[i]=a[j] then inc(v);
if v<>0 then
begin
writeln ('Ошибка! Символы ключа не уникальны!');
write('Введите ключ из ',key,' цифр: ');
end
until v=0;
while v<>len do
begin
for i:=1 to key do
r[i+v]:=s[a[i]+v];
v:=v+key
end;
writeln('--------------------------------------------------');
write('Зашифрованный текст: ');
for i:=1 to len do
write(r[i]);
writeln;
End.

Автор: Федосеев Павел 19.09.2016 0:39

Смотрите:
1. Ввод строки readln(s)
2. Перед циклом шифрования while - там где присвоение r[...] сделайте r:=s; Это связано с тем, что в современных версиях Pascal внутренняя организация строки сложнее и требует выделения памяти или присвоением или при вводе.

Я упростил программу для отладки в среде FreePascal.

program shifr;

const
n = 8;
var
a: array[1..n] of integer = (3, 8, 1, 5, 2, 7, 6, 4);
len: integer;
s, r: string;
i, j, v: integer;
p, key: integer;
begin
Write('Введите текст для шифрования: ');
//readln(s);
s := 'шифрование_перестановкой';
writeln('-------------------------------------------------');
Write('Введите количество цифр в ключе: ');
//readln(key);
key := 8;
len := length(s);
while len mod key <> 0 do
begin
s := s + ' ';
Inc(len);
end;
writeln('Введите ключ из ', key, ' цифр: ');
repeat
v := 0;
//for i := 1 to key do
// Read(a[i]);
//readln;
for i := 1 to key - 1 do
for j := i + 1 to key do
if a[i] = a[j] then
Inc(v);
if v <> 0 then
begin
writeln('Ошибка! Символы ключа не уникальны!');
Write('Введите ключ из ', key, ' цифр: ');
end
until v = 0;
r := s;
while v <> len do
begin
for i := 1 to key do
r[i + v] := s[a[i] + v];
v := v + key;
end;
writeln('--------------------------------------------------');
Write('Зашифрованный текст: ');
writeln®;
end.

Автор: Pistoletka 19.09.2016 2:11

Цитата(Федосеев Павел @ 18.09.2016 20:39) *

Смотрите:
1. Ввод строки readln(s)
2. Перед циклом шифрования while - там где присвоение r[...] сделайте r:=s; Это связано с тем, что в современных версиях Pascal внутренняя организация строки сложнее и требует выделения памяти или присвоением или при вводе.

Я упростил программу для отладки в среде FreePascal.
program shifr;

const
n = 8;
var
a: array[1..n] of integer = (3, 8, 1, 5, 2, 7, 6, 4);
len: integer;
s, r: string;
i, j, v: integer;
p, key: integer;
begin
Write('Введите текст для шифрования: ');
//readln(s);
s := 'шифрование_перестановкой';
writeln('-------------------------------------------------');
Write('Введите количество цифр в ключе: ');
//readln(key);
key := 8;
len := length(s);
while len mod key <> 0 do
begin
s := s + ' ';
Inc(len);
end;
writeln('Введите ключ из ', key, ' цифр: ');
repeat
v := 0;
//for i := 1 to key do
// Read(a[i]);
//readln;
for i := 1 to key - 1 do
for j := i + 1 to key do
if a[i] = a[j] then
Inc(v);
if v <> 0 then
begin
writeln('Ошибка! Символы ключа не уникальны!');
Write('Введите ключ из ', key, ' цифр: ');
end
until v = 0;
r := s;
while v <> len do
begin
for i := 1 to key do
r[i + v] := s[a[i] + v];
v := v + key;
end;
writeln('--------------------------------------------------');
Write('Зашифрованный текст: ');
writeln®;
end.



Благодарю вас за помощь! А не могли бы вы посмотреть еще одну задачу с кодом? В упор не вижу проблему..

Автор: Федосеев Павел 19.09.2016 3:11

Да - не могу
Нет - не могу

smile.gif

Даже не знаю, как ответить.

Задавайте в ещё одной теме. Правда, я завтра уезжаю на несколько дней. Но может кто и откликнется.