Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на расшифрование текста
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Pistoletka
Проверьте код на ошибки. Не разберусь в чем проблема.
Открытый текст: ШИФРОВАНИЕ_ПЕРЕСТАНОВКОЙ.
Ключи: k1 5-3-1-2-4-6; k2 4-2-3-1.
Матрица из четырех столбцов и шести строк. Запись по строкам осуществляется в соответствии с ключом k1, а чте-
ние по столбцам – в соответствии с ключом k2
Шифртекст: "ПСНОРЙЕРВАИК_ЕАНФОИЕОТШВ".

Program rasshifr;
const n=10;
var
text, dtext:string;
c:char;
key1, key2:array[1..n] of integer;
textmatr:array[1..6,1..4] of string;
i, j, v, len:integer;
Begin
write('Введите текст для шифрования: ');
read(text);
writeln('-------------------------------------------------');
len:=length(text);
If len=24 then
begin
writeln('Введите первый ключ из 6 цифр: ');
repeat
v:=0;
for i:=1 to 6 do
begin
read©;
key1[i]:=c
end;
for i:=1 to 5 do
for j:=i+1 to 6 do
if key1[i]=key1[j] then inc(v);
if v<>0 then
begin
writeln ('Ошибка! Символы ключа не уникальны!');
writeln('Введите первый ключ из 6 цифр: ');
end
until v=0;
for j:=1 to 4 do
for i:=1 to 6 do
textmatr[i,key2[j]]:=dtext[(j-1)*6+i];
text:='';
for i:=1 to 6 do
for j:=1 to 4 do
text:=text+textmatr[key1[i],j];
writeln('Расшифрованный текст:',' ',text)
end
else writeln('Неверно')
End.
Федосеев Павел
Чтобы мне долго не гадать - в чём заключается проблема?
Pistoletka
Цитата(Федосеев Павел @ 22.09.2016 20:21) *

Чтобы мне долго не гадать - в чём заключается проблема?


key1[i]:=c
Нельзя преобразовать тип char к integer.
Федосеев Павел
Воспользуйтесь функцией val ссылка на описание
Или сразу считывайте key1[i] без промежуточной переменной c.
Или, если там будут только цифры (0...9), то key1[i]:=ord(c )-ord('0')
Pistoletka
Цитата(Федосеев Павел @ 26.09.2016 12:41) *

Воспользуйтесь функцией val ссылка на описание
Или сразу считывайте key1[i] без промежуточной переменной c.
Или, если там будут только цифры (0...9), то key1[i]:=ord(c )-ord('0')


Я переделала все в процедуру. Теперь проблема такая: не выводится расшифрованный текст.
program rasshifr;
const n=15;
type mas=array[1..n] of integer;
var
k, l: string;
len, key: integer;
Procedure rasshifr(var b:mas;s,r:string);
var i,j,v,p:integer;
begin
Write('Введите текст для расшифрования: ');
Read®;
Writeln('-------------------------------------------------');
Write('Введите количество цифр в ключе: ');
Readln(key);
len := length®;
while len mod key <> 0 do
begin
r := r + ' ';
len := len + 1;
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;
i := 1;
while (i <= key) and (a[i] >= 1) and (a[i] <= key) do
Inc(i);
if i <= key then
begin
writeln('Ошибка! Выход из диапазона!!');
writeln('Введите ключ из ', key, ' цифр: ');
Inc(v);
end;
until v = 0;

setLength(s, len); // Задает строку нужного размера len

while v <> len do
begin
for i := 1 to key do
s[i + v] := r[a[i] + v];
v := v + key
end;
writeln('--------------------------------------------------');
write('Расшифрованный текст: ');
for i := 1 to len do
write(s[i]);
writeln
end;
Begin
rasshifr(a,k,l);
End.
Федосеев Павел
Так оно даже не компилируется.

Как-то не чувствуете вы структуру программы. Интерфейс должен быть отделён от алгоритма обработки. Это означает, что ввод от пользователя должен быть в основной программе (или отдельной процедуре), далее вызов процедуры обработки (в которой только вычисления), далее в основной программе вывод результата.

Так делают, чтобы отлаживать обработку на тестовых данных, "зашитых" в программу в виде констант.

Исправляйте. Только поторопитесь - сегодня я ещё могу посещать форум, но на днях могу уехать в командировку.

------------------------------------

Что-то вы разные методы кодирования приводите в первом и пятом сообщениях...
Pistoletka
Цитата(Федосеев Павел @ 27.09.2016 19:36) *

Так оно даже не компилируется.

Как-то не чувствуете вы структуру программы. Интерфейс должен быть отделён от алгоритма обработки. Это означает, что ввод от пользователя должен быть в основной программе (или отдельной процедуре), далее вызов процедуры обработки (в которой только вычисления), далее в основной программе вывод результата.

Так делают, чтобы отлаживать обработку на тестовых данных, "зашитых" в программу в виде констант.

Исправляйте. Только поторопитесь - сегодня я ещё могу посещать форум, но на днях могу уехать в командировку.

------------------------------------

Что-то вы разные методы кодирования приводите в первом и пятом сообщениях...


Я ввела, но не выходит у меня никак с выводом результата. Совсем никак.
Федосеев Павел
Так. Смотрите - в начале темы вы привели программу, работающую с матрицей, а последняя программа работает через массив. Т.е. это абсолютно разные алгоритмы. А кроме того, у них разные тестовые примеры и я даже не знаю, что требуется вводить и что получить.

Таким образом я не понимаю о чём идёт речь во фразе: "Я ввела, но не выходит у меня никак с выводом результата. Совсем никак."

Плюс - последний ваш код даже не компилируется, там нечего вводить, т.к. не создаётся исполняемый файл.

Что нужно от вас:
1. Тестовый пример входных и выходных данных.
2. Компилирующийся исходник.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.