Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2010, 21:36   #1
0479
Форумчанин
 
Аватар для 0479
 
Регистрация: 27.09.2009
Сообщений: 153
По умолчанию Шифрование файла алфавитом

Задан массив, элементами которого являются буквы англоязычного алфавита. Получить новый
массив, в котором буквы перестановлены случайным образом, и используя его зашифровать
текстовый файл.
Буквы англоязычного алфавита рассматриваем как массив.
Обозначим этот массив как A(52). Каждый элемент массива – A(I). Где I – это номер символа в
массиве, I изменяется от 1 до 52.
A(I)=''a,b,c,d,e..."
Перемешаем исходный алфавит и получим например
B(I)=''d,f,g,h,o..."
Используем массив B(52) как ключ для шифрования.
Текст для шифрования возьмем произвольно, например, «студент». Определяем номер первой
буквы текста в исходном алфавите: a=A(1). В зашифрованный файл первой буквой записываем
букву с тем же номером из перемешанного алфавита, а то есть B(1)=A(1)=d
То есть например в этом случае последовательность abd шифруется как dfh Исходный код приведён ниже.Только проблема в том что шифруется только первый символ текста из файла.(Чтобы записать текст надо создать файл file1.txt на диске c).Возможно ошибка где то в последнем вложенном цикле .

const alh1:array [0..51] of char=('a','b','c','d','e','f','g',' h','i','j','k', 'l',
'm','n','o','p','q','r','s','t','u' ,'v','w','x','y ','z','A','B','C','D'
,'E','F','G','H','I','J','K','L','M ','N','O','P',' Q','R',
'S','T','U','V','W','X','Y','Z');
var d,i,km,mk,j,dlina,nk:integer;
f11:array [0..50] of char;
f1:text;
alh2:array [0..53] of char;
newtext:array [0..250] of char;
text:array [0..50] of string;
buf:char;
begin
Randomize;
while i<52 do
begin
alh2[i]:=alh1[i];
i:=i+1;
end;
for i:=1 to 1 do writeln(alh1);
while i<52 do
begin
km:=i;
mk:=random(51);
buf:=alh2[km];
alh2[km]:= alh2[mk];
alh2[mk]:=buf;
i:=i+1;
end;
for i:=1 to 1 do begin
writeln(alh2);
end;
assign(f1,'c:/file1.txt');
reset(f1);
readln(f1,f11);
writeln(f11);
dlina:=length(f11);
while j<=dlina
do begin
while nk<=52
do begin
if f11[j]=alh1[nk]
then begin newtext[j]:=alh2[nk];
end;
nk:=nk+1;
end;
j:=j+1;
end;
writeln(newtext);
readln;
end.
0479 вне форума Ответить с цитированием
Старый 13.09.2010, 22:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

код жуткий...
из того, что бросилось в глаза!
1) почему массив Alh1 от 0 до 51, а массив Alh2 от 0 до 53?!
2) при таком описании f11:array [0..50] of char;
вот эта строчка dlina:=length(f11);
ВСЕГДА вернёт 51 (ибо такова длина Вашего массива символов!!)
Вместо этого используйте обычную var f11 : string;

главная ошибка. В цикле Вы забываете сбрасывать nk - поиск всегда начинается со следующего символа (от найденного)!!
на надо так:
Код:
    
   do begin
      nk := 0;
      while nk <= 52
3) И ещё.
Мой Вам совет на будущее!
Не забывайте обнулять переменные перед их использованием.

p.s. код надо обрамлять в тэги [СODE] ... тут Ваш код [/CODE]
это можно сделать с помощью кнопочки с решёточкой.

вот, примерно так:
Код:
const alh1: array[0..51] of char =
  ('a', 'b', 'c', 'd', 'e', 'f',
   'g', 'h', 'i', 'j', 'k', 'l',
   'm', 'n', 'o', 'p', 'q', 'r', 's',
   't', 'u', 'v', 'w', 'x', 'y', 'z',
   'A', 'B', 'C', 'D',
   'E', 'F', 'G', 'H', 'I', 'J', 'K',
   'L', 'M', 'N', 'O', 'P', 'Q', 'R',
   'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
var i, mk, j, dlina, nk: integer;
  f11: string;
  f1: text;
  alh2: array[0..51] of char;
  newtext: string;
  buf: char;
begin
  Randomize;
  for i:=0 to 51 do  alh2[i] := alh1[i];
  writeln(alh1);

  i:=0;
  while i < 52 do
  begin
    mk := random(51);
    buf := alh2[i];
    alh2[i] := alh2[mk];
    alh2[mk] := buf;
    i := i + 1;
  end;
  writeln(alh2);

  assign(f1, 'c:\file1.txt');
  reset(f1);
  readln(f1, f11);
  close(f1);

  writeln(f11);
  dlina := length(f11);
  newtext := '';
  j := 1;
  while j <= dlina
    do begin
    nk := 0;
    while nk <= 52
      do begin
      if f11[j] = alh1[nk]
        then begin newtext := newtext + alh2[nk];
      end;
      nk := nk + 1;
    end;
    j := j + 1;
  end;
  writeln(newtext);
  readln;
end.

Последний раз редактировалось Serge_Bliznykov; 13.09.2010 в 22:17.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.09.2010, 22:50   #3
0479
Форумчанин
 
Аватар для 0479
 
Регистрация: 27.09.2009
Сообщений: 153
По умолчанию

Спасибо за помощь.Но есть ещё один вопрос.Почему вот при таком коде не идёт запись зашифрованного текста файл file2.txt создаётся пустым.

Код:
const alh1: array[0..51] of char =
  ('a', 'b', 'c', 'd', 'e', 'f',
   'g', 'h', 'i', 'j', 'k', 'l',
   'm', 'n', 'o', 'p', 'q', 'r', 's',
   't', 'u', 'v', 'w', 'x', 'y', 'z',
   'A', 'B', 'C', 'D',
   'E', 'F', 'G', 'H', 'I', 'J', 'K',
   'L', 'M', 'N', 'O', 'P', 'Q', 'R',
   'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
var i, mk, j, dlina, nk: integer;
  f11: string;
  f1,f2: text;
  alh2: array[0..51] of char;
  newtext: string;
  buf: char;
begin
  Randomize;
  for i:=0 to 51 do  alh2[i] := alh1[i];
  writeln(alh1);

  i:=0;
  while i < 52 do
  begin
    mk := random(51);
    buf := alh2[i];
    alh2[i] := alh2[mk];
    alh2[mk] := buf;
    i := i + 1;
  end;
  writeln(alh2);

  assign(f1, 'c:\file1.txt');
  reset(f1);
  readln(f1, f11);
  close(f1);

  writeln(f11);
  dlina := length(f11);
  newtext := '';
  j := 1;
  while j <= dlina
    do begin
    nk := 0;
    while nk <= 52
      do begin
      if f11[j] = alh1[nk]
        then begin newtext := newtext + alh2[nk];
      end;
      nk := nk + 1;
    end;
    j := j + 1;
  end;
    assign(f2, 'c:\file2.txt');
    rewrite(f2);
    writeln(f2,newtext);

  writeln(newtext);
  readln;
end.

Последний раз редактировалось 0479; 13.09.2010 в 23:08.
0479 вне форума Ответить с цитированием
Старый 13.09.2010, 23:11   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

обратите внимание, после чтения файла f1 появилась команда Close(f1) - обратили?

Так вот, ОБЯЗАТЕЛЬНО нужно закрывать открытый Вами файл.
т.е. после записи в файл f2 закройте его:
Код:
    rewrite(f2);
    writeln(f2,newtext);
    close(f2);
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование файла (Assembler) phantom4eg Фриланс 3 12.04.2010 10:50
шифрование файла (Assembler) phantom4eg Помощь студентам 2 10.04.2010 16:36
Шифрование файла. dip Помощь студентам 1 04.12.2009 10:17
шифрование и дешифрование файла Анастасия123456789 Помощь студентам 1 05.05.2009 15:47
Шифрование текстового файла pomoshnic Паскаль, Turbo Pascal, PascalABC.NET 5 14.02.2009 18:21