Vladimir_S |
25.09.2012 12:53 |
Вложений: 1
Цитата:
Сообщение от gabriela007
(Сообщение 796040)
сказали сегодня что еще и раскодировка нужна((((в задание только кодировка была....вот насчет второго даже идей нет(((
|
Ладно, держите. Правда, я там малость и кодирующую часть переделал. Обнаружилось, что если количество символов в исходном тексте не кратно длине блока, то при кодировке/декодировке последний символ может пропасть. А потому в этой ситуации исходный текст дополняется пробелами до получения кратности. Что, кстати, сильно упрощает дальнейшую работу с текстом.
Код:
Uses
SysUtils,windows;
Var
n,kolsimvolov,i,j,k,l,akey,Code : Integer;
text,textkey,textunkey,key,key1,S : String;
p:boolean;
Begin
SetConsoleOutputCP(1251);
Write('Enter the number of symbols per block: ');
Readln(n);
Repeat
Write('Enter the key: ');
Readln(key);
If Length(key)<>n then writeln('Key must contain ',n,' symbols!');
p:=true;
i:=0;
repeat
inc(i);
j:=i;
repeat
inc(j);
if j<=Length(key) then
if (key[i]=key[j]) then p:=false;
until Not(p) or (j=Length(key));
until i=Length(key)-1;
If Not(p) then writeln('All key symbols must be different!');
Until (Length(key)=n) and p;
Write('Enter the text: ');
Readln(text);
kolsimvolov:=Length(text);
If (kolsimvolov mod n)>0 then
for k:=Length(text)+1 to ((Length(text) div n)+1)*n do
begin
text:=text+' ';
Inc(kolsimvolov);
end;
textkey:='';
For k:=0 to (kolsimvolov div n)-1 do
begin
i:=n*k;
For j:=1 to n do
begin
S:=key[j];
VAL(S,akey,Code);
textkey:=textkey + text[i+akey]
end;
end;
Writeln('Encoded text: '+textkey);
Repeat
Write('Enter the key: ');
Readln(key1);
If key1<> key then writeln('Wrong key!');
Until key1=key;
textunkey:='';
for l:=0 to (kolsimvolov div n)-1 do
begin
i:=l*n;
for j:=1 to n do
begin
k:=0;
repeat
Inc(k);
S:=key[k];
VAL(S,akey,Code);
until akey=j;
textunkey:=textunkey+textkey[i+k]
end;
end;
Writeln('Decoded text: '+textunkey);
Readln;
End.
|