IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Сортировка псевдослучайным перемешиванием, Нужен код программы
Денис 1988
сообщение 22.09.2011 20:26
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


Всем доброго здравия, нужна программка,на Turbo Pascal. Надо реализовать программу шифратор текста и использованием перемешанного алфавита. Грубо говоря есть алфавит,мы выводим его на экран и вводим предложение/слово, далее следует перемешивание алфавита и шифрация нашего предложения/слова в соответствии с перемешанным алфавитом. Далее в той же программе,реализовать программу дешифратор, с использованием перемешанного алфавите в качестве ключа..как бы первая часть программы не вызывает затруднений,но все равно хотелось бы увидеть ваши мысли по этому поводу, так как у каждого разная фантазия-мышление) Вся проблема в реализации дешифровки..Желательно написать программу более примитивным чтоли языком..ибо на таком уровне я смекаю ,что к чему..Желательно к вечеру пятницы,получить уже хоть какой-нибудь материал.

Заранее спасибо.
С уважением,Денис
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 22.09.2011 20:42
Сообщение #2


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Как мешать алфавит? И шифрация слова в соответствии с алфавитом - значит, каждой букве слова сопоставляется буква из нового алфавита из той позиции, на которой стояла буква слова в старом-незамешанном ?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 23.09.2011 9:20
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Заводим тип-алвафит:


type ab = 'A'..'Z'; // сюда любой диапазон можно задать


название такое от слова "alphabet", сокращено, так как его надо будет часто писать

Заводим два вспомогательных массива для шифровки и дешифровки:


NormToShuffled, ShuffledToNorm: array [ab] of ab;



Составляем перемешанный массив:


for c := Low(ab) to High(ab) do NormToShuffled[c] := c;
for c := High(ab) downto succ(Low(ab)) do begin // цикл вниз от последнего символа (включительно) до первого (невключительно)
d := ab(random(integer©-integer(Low(ab))+1)+Low(ab)); // случайный символ от Low(ab) до c включительно
tmp := NormToShuffled[c]; // меняем местами элементы на c и на d местах
NormToShuffled[c] := NormToShuffled[d];
NormToShuffled[d] := tmp;
end;



Как с его помощью шифровать - понятно?
Для составления аналогичного массив для дешифрации пишем так:


for c := Low(ab) to High(ab) do
ShuffledToNorm[NormToShuffled[c]] := c;



Как это работает - сам разберись.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Денис 1988
сообщение 23.09.2011 9:49
Сообщение #4





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


спасибо за труд...но..это как бы не по моей основной специальности и я часть кода честно говоря не особо втыкаю...я такого не изучал,не встречался с таким еще...а перемешивание алфавита ну вот если только так :

var
Key,Yek,s: string;
i,j,AlphaLen: integer;
c: char;
begin
Randomize;
Key:= 'abcdefghijklmnopqrstuvwxyz';
AlphaLen:= Length(Key);
for i:=AlphaLen to 2 do begin //вот тут жалуется и не всегда правильно или корректно срабатывает
j:= Random(i)+1;
c:= Key[i];
Key[i]:= Key[j];
Key[j]:= c
end;
WriteLn('Перемешанный алфавит: ',Key);

.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 23.09.2011 9:52
Сообщение #5


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


to это перебор вверх. Если начальное значение больше конечного, то цикл for не сработает ни разу.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Денис 1988
сообщение 23.09.2011 12:14
Сообщение #6





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


то есть имеет смысл сделать downto?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 23.09.2011 12:40
Сообщение #7


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


да


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Денис 1988
сообщение 23.09.2011 19:54
Сообщение #8





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


хорошо,с рандомным перемешиванием алфавита разобрались,а дальше чего куда и как,помогите дописать код..ибо предложенное тут мне не понятно-темный лес, я же говорил не по основной специальности)почти самоучка)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 25.09.2011 8:41
Сообщение #9


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Денис 1988 @ 23.09.2011 10:49) *
спасибо за труд...но..это как бы не по моей основной специальности и я часть кода честно говоря не особо втыкаю...я такого не изучал,не встречался с таким еще...а перемешивание алфавита ну вот если только так :

var
Key,Yek,s: string;
i,j,AlphaLen: integer;
c: char;
begin
Randomize;
Key:= 'abcdefghijklmnopqrstuvwxyz';
AlphaLen:= Length(Key);
for i:=AlphaLen to 2 do begin //вот тут жалуется и не всегда правильно или корректно срабатывает
j:= Random(i)+1;
c:= Key[i];
Key[i]:= Key[j];
Key[j]:= c
end;
WriteLn('Перемешанный алфавит: ',Key);

.
Уважаемый Денис 1988, нехорошо это.. Берешь чужой код с другого форума, никаких оговорок не делаешь - хочешь, чтоб приняли за твое, что ли? Да еще и с ошибками копируешь..

Цитата(Денис 1988 @ 23.09.2011 20:54) *
хорошо,с рандомным перемешиванием алфавита разобрались,а дальше чего куда и как,помогите дописать код..ибо предложенное тут мне не понятно-темный лес, я же говорил не по основной специальности)почти самоучка)
хорошо, самоучка (жму руку, я тоже), я облегчу тебе работу. Там, откуда ты взял тот код, появилась недавно другая версия, которая использует один и тот же ключ для шифрования и расшифровки (то есть не использует переменную Yek). Вот тебе этот код. Постарайся скопировать его без ошибок..
// encrypting with random permutations
var
Key,s: string;
i,j,AlphaLen: integer;
c: char;

procedure InCrypt(var s: string; k: string);
var
i: integer;
begin
for i:=1 to Length(s) do
if s[i] in ['a'..'z'] then s[i]:= k[Ord(s[i])-Ord('a')+1]
end;


procedure DeCrypt(var s: string; k: string);
var
i: integer;
begin
for i:=1 to Length(s) do
if s[i] in ['a'..'z'] then s[i]:= Chr(Pos(s[i],k)+Ord('a')-1)
end;


begin
// create a random encryption key
Key:= 'abcdefghijklmnopqrstuvwxyz';
AlphaLen:= Length(Key);
for i:=AlphaLen downto 2 do begin
j:= Random(i)+1;
c:= Key[i];
Key[i]:= Key[j];
Key[j]:= c
end;
WriteLn('Encrypyion Key: ',Key);

// enter text here
s:= 'now, is the winter of our discontent made glorious summer by this sun of york!';
Writeln('Clear text:');
Writeln(s);

// encrypting
InCrypt(s,Key);
Writeln('Encrypted text:');
Writeln(s);

// decrypting
DeCrypt(s,Key);
Writeln('Decrypted text:');
Writeln(s);

Readln
end.



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Денис 1988
сообщение 25.09.2011 13:40
Сообщение #10





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


ой видимо не тот код выложил...да я там просматривал,но там через процедуры..я оттуда взял перемешивание-да ,не скрою..но меня смутил downto сейчас выложу то что у меня было в коде.Извините ошибься

uses crt ;
var K,s,Alf,Enc,Dec:String;
i,j,l,p:integer;
c:char;
begin clrscr;
for i:=97 to 122 do Alf:=Alf+Chr(i);
writeln('alfavit: ',Alf);
Randomize;
K:=Alf;
p:=Length(K);
for i:=p downto 2 do begin
j:=Random(i)+1;
c:=K[i];
K[i]:=K[j];
K[j]:=c
end;
writeln('Key: ',K);
writeln('Vedite stroku: ');
readln(s)

.


энк и дек-нужны для шифра/дешифра но как их использовать не понятно..процедуры я правда еще пока не осилил,А перемешивание-наглядный хороший готовый пример...потому и воспользовался им,извините если это противоречит правилам
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 26.09.2011 9:15
Сообщение #11


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> for i:=1 to Length(s) do
> if s[i] in ['a'..'z'] then s[i]:= Chr(Pos(s[i],k)+Ord('a')-1)

> for
> Pos

Передайте на тот другой форум, что они индусы, и чтобы больше так не делали.

Добавлено через 1 мин.
> энк и дек-нужны для шифра/дешифра но как их использовать не понятно..

что тут непонятного - циклом проходишь по строке, меняя S[i] на Key[S[i]], это тяжело что ли?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 26.09.2011 11:51
Сообщение #12


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(TarasBer @ 26.09.2011 10:15) *
> for i:=1 to Length(s) do
> if s[i] in ['a'..'z'] then s[i]:= Chr(Pos(s[i],k)+Ord('a')-1)

> for
> Pos

Передайте на тот другой форум, что они индусы, и чтобы больше так не делали.

Тарас, поясни, плз.. не въезжаю.. что тут не так?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 26.09.2011 11:56
Сообщение #13


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Если Pos уже научился работать за O(1), то ничего, тогда извините.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 15:04
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"