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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 07.04.2014, 12:20   #1
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию не получается выйти из цикла

Код:
  SoH:= LEditSelectionOfHashes.Text;
  Slovo:= UTF8ToAnsi(LEditText.Text);
  Alp:= UTF8ToAnsi(LEditChange.Text);
  n:= Length(Text);
  q:= Length(Alp);
пробовал и так и сяк застревает на
Код:
Slovo[i]:= Alp[j];
Writeln(f, Slovo[i]);
через repeat
Код:
procedure TForm1.Change1;
begin
  HashOfTheText:= (MD5Print(MD5String(Slovo)));
 repeat
   begin
    For i:= 1 to n do
    begin
        For j:= 1 to q do
        begin
           begin
            Slovo[i]:= Alp[j];
            Writeln(f, Slovo[i]);
           end;
        end;
    end;
   end;
 until HashOfTheText = SoH;
 CloseFile(f);
end;
через while
Код:
procedure TForm1.Change1;
begin
  HashOfTheText:= (MD5Print(MD5String(Slovo)));
 while HashOfTheText <> SoH do
    begin
    For i:= 1 to n do
    begin
        For j:= 1 to q do
        begin
           begin
            Slovo[i]:= Alp[j];
            Writeln(f, Slovo[i]);
           end;
        end;
    end;
   end;
 CloseFile(f);
end;
Вложения
Тип файла: rar ComparingHashes.rar (310.1 Кб, 7 просмотров)
Taner вне форума
Старый 07.04.2014, 13:24   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы шутите?!
У Вас в цикле (хоть while, хоть repeat until) условие выхода из цикла (HashOfTheText = SoH) не изменяется!!

HashOfTheText или SoH чудом должны поменяться внутри цикла?!

Hint
если я правильно понял, то Вам нужно внести строчку:
Код:
HashOfTheText:= (MD5Print(MD5String(Slovo)));
внутрь цикла:

Код:
    For i:= 1 to n do
    begin
        For j:= 1 to q do
        begin
            Slovo[i]:= Alp[j];
            Writeln(f, Slovo[i]);
            HashOfTheText:= (MD5Print(MD5String(Slovo)));
            if HashOfTheText = SoH then Break;
        end;
        if HashOfTheText = SoH then Break;
    end;
    CloseFile(f);

Последний раз редактировалось Serge_Bliznykov; 07.04.2014 в 13:29.
Serge_Bliznykov вне форума
Старый 07.04.2014, 15:36   #3
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы шутите?!
У Вас в цикле (хоть while, хоть repeat until) условие выхода из цикла (HashOfTheText = SoH) не изменяется!!
Вот тут немного не понял, вроде бы разное условие или я не там читаю?
Код:
repeat
...
until HashOfTheText = SoH;
Код:
while HashOfTheText <> SoH do
сейчас попробую внутрь цикла внести, спасибо, но кажется я так уже делал
Taner вне форума
Старый 08.04.2014, 13:18   #4
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию

Вот перебор для 1 буквы
Код:
procedure TForm1.perebor;
begin
for i:=1 to 10 do
  begin
  s:=AnsiToUtf8(WordBook[i]);
  for k := 1 to (UTF8Length(Slovo)-1) do
    begin
    posit := 0;
      repeat
      p := UTF8Pos(UTF8Copy(Slovo, k, 1), s, posit + 1);
      if p > 0 then
        begin
        T := s;
        UTF8Delete(T, p, 1);
        UTF8Insert(UTF8Copy(Alp, k, 1), T, p);
        for k1 := 2 to UTF8Length(Slovo) do
          begin
          posit := 0;
            repeat
            p := UTF8Pos(UTF8Copy(Slovo, k1, 1), s, posit + 1);
            if p > 0 then
              begin
              T1 := t;
              UTF8Delete(T1, p, 1);
              UTF8Insert(UTF8Copy(Alp, k1, 1), T1, p);
              s1:=MD5Print(MD5String(t1));
              if s1=SoH then mmResult.Lines.Add(t1);
              posit := p;
              end;
            until p = 0;
          end;
        posit := p;
        end;
      until p = 0;
    end;
  end;
perebor3;
end;
для двух еще длинее
Код:
procedure TForm1.perebor3;
begin
for i:=1 to 10 do
  begin
  s:=AnsiToUtf8(WordBook[i]);
  for k := 1 to (UTF8Length(Slovo)-2) do
    begin
    posit := 0;
      repeat
      p := UTF8Pos(UTF8Copy(Slovo, k, 1), s, posit + 1);
      if p > 0 then
        begin
        T := s;
        UTF8Delete(T, p, 1);
        UTF8Insert(UTF8Copy(Alp, k, 1), T, p);
        for k1 := 2 to (UTF8Length(Slovo)-1) do
          begin
          posit := 0;
            repeat
            p := UTF8Pos(UTF8Copy(Slovo, k1, 1), s, posit + 1);
            if p > 0 then
              begin
              T1 := t;
              UTF8Delete(T1, p, 1);
              UTF8Insert(UTF8Copy(Alp, k1, 1), T1, p);
              for k2 := 3 to UTF8Length(Slovo) do
                begin
                posit := 0;
                  repeat
                  p := UTF8Pos(UTF8Copy(Slovo, k2, 1), s, posit + 1);
                  if p > 0 then
                    begin
                    T2 := t1;
                    UTF8Delete(T2, p, 1);
                    UTF8Insert(UTF8Copy(Alp, k2, 1), T2, p);
                    s1:=MD5Print(MD5String(t2));
                    if s1=SoH then mmResult.Lines.Add(AnsiToUTF8(WordBook[i]) +' '+ (t2));
                    posit := p;
                    end;
                  until p = 0;
                end;
              posit := p;
              end;
            until p = 0;
          end;
        posit := p;
        end;
      until p = 0;
    end;
  end;
perebor4;
end;
итд
можно ли как-то минимизировать цикл?
вообще мне кажется что можно уложиться в строк 40 прекрасного цикла, но не могу придумать ничего
Вложения
Тип файла: rar pr.rar (315.8 Кб, 6 просмотров)
Taner вне форума
Старый 08.04.2014, 14:40   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А какая задача?
I'm learning to live...
Stilet вне форума
Старый 08.04.2014, 17:00   #6
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А какая задача?
Есть две программы, первая хеширует пороль(скину в ответе), причем уже с замененными буквами(пример будет ниже) , вторая(архив который был выше) использую словарик со словами с помощью полей текст( какие буквы заменяем) и замены( на какие буквы заменяем) должна вывести слово от которого был взят хеш.
Пример. допустим берем слово "Клей" меняем "к" на "п", "е" на "р" с помощью 1ой программы считаем хеш он равен "3b7779c79d73fba171a8a8242a2ca4 dd". Во второй программе мы в поле текст вводим "ке" в поле замены "пр" и в поле хеш "3b7779c79d73fba171a8a8242a2ca4 dd", она смотрит 1ое слово из словаря меняем "к" на "п" считает хеш если не равен продолжает, меняет все буквы "е" на "р" снова сравнивает хеши. И вот на слове "клей" он заменит первые буквы выйдет "плей" посчитает хеш он будет не равен введенному, затем заменит вторую букву выйдет "плрй" посчитает хеш и он будет равен введенному, это слово он и выведет.
Объяснил как мог
Вложения
Тип файла: rar Hashing.rar (305.3 Кб, 7 просмотров)
Taner вне форума
Старый 08.04.2014, 17:09   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Вот тут немного не понял, вроде бы разное условие или я не там читаю?
Условия разные, суть одна. Чтобы цикл закончился, нужно чтобы одна или обе переменные меняли свое значение. Вот for закончится автоматически, а в других видах цикла Вам никто ничего не обязан. Вы должны где-то самостоятельно менять проверяемые переменные. А вот условие в цикле уже будет отслеживать - исполнять новый круг или выйти за пределы цикла.
По большому тексту - у Вас рекурсия невооруженным глазом. Значится нужно оформить в процедурку и вызывать саму себя для избежания лишних ошибок. Опять же количество кода сократится...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 08.04.2014 в 17:12.
Utkin вне форума
Старый 09.04.2014, 21:43   #8
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Taner Посмотреть сообщение
Вот перебор для 1 буквы
Код:
procedure TForm1.perebor;
begin
for i:=1 to 10 do
  begin
  s:=AnsiToUtf8(WordBook[i]);
  for k := 1 to (UTF8Length(Slovo)-1) do
    begin
    posit := 0;
      repeat
      p := UTF8Pos(UTF8Copy(Slovo, k, 1), s, posit + 1);
      if p > 0 then
        begin
        T := s;
        UTF8Delete(T, p, 1);
        UTF8Insert(UTF8Copy(Alp, k, 1), T, p);
        for k1 := 2 to UTF8Length(Slovo) do
          begin
          posit := 0;
            repeat
            p := UTF8Pos(UTF8Copy(Slovo, k1, 1), s, posit + 1);
            if p > 0 then
              begin
              T1 := t;
              UTF8Delete(T1, p, 1);
              UTF8Insert(UTF8Copy(Alp, k1, 1), T1, p);
              s1:=MD5Print(MD5String(t1));
              if s1=SoH then mmResult.Lines.Add(t1);
              posit := p;
              end;
            until p = 0;
          end;
        posit := p;
        end;
      until p = 0;
    end;
  end;
perebor3;
end;
ну что можно как-то универсально цикл запилить, или лучше не трогать если работает?
Taner вне форума
Старый 10.04.2014, 11:01   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
ну что можно как-то универсально цикл запилить,
чтобы сделать все коротко и универсально (с произвольно задаваемой глубиной) надо все это оформить в рекурсивную процедуру.

Цитата:
или лучше не трогать если работает?
Но это не совсем тривиальная задача, учитывая ваш опыт.

примерное формальное, и не обязательно что правильное, преобразование в рекурсию, только как иллюстрация основных моментов.

Код:
procedure Scan(s: UTF8; p: integer; symbol: UTF8; level: integer; maxlevel: integer; var posit: integer);
var //ВСЕ используемые переменные должны локальными или параметрами чтобы Второй вызов не портил нам ничего!!!
// в качестве глобальных можем оставить только "константы" slovo Alp
   k1: integer;
  t: UTF8;
begin
   T := s;
if p>0 then begin     
   UTF8Delete(T, p, 1);
   UTF8Insert(symbol, T, p);
end;
if level<maxlevel then  begin // проверяем будем ли мы снова вызвать себя или... (продолжение комментария смотри на else !!!)
        for k1 := 1+level to UTF8Length(Slovo)-level do
          begin
          posit := 0;
            repeat
            p := UTF8Pos(UTF8Copy(Slovo, k1, 1), s, posit + 1);
            if p > 0 then
              begin
// вот здесь самое интересное(важное) мы снова вызываем себя уже с другими параметрами
   // было       Scan(AnsiToUTF8(workbook[i], 0, AnsitoUT8(' ')      , 0      , 3       , posit); 
                 Scan(t                     , p, UTF8Copy(alp, k1, 1), level+1, maxlevel, posit); 
// и главное при этом повышаем свой "текущий" уровень (level+1)
              end;
            until p = 0;
          end;
      posit:=p;
end
else begin  // ...или мы достигли последнего уровня и пора проверять 
  s1:=MD5PRint(MD5String(t);
  if s1 =SoH then mmresult.lines.add(t);
  posit:=p;
end;
end;
и использование на внешнем уровне
Код:
posit:=0;
for i:=1 to 10 do begin
  Scan(AnsiToUTF8(workbook[i], 0, AnsitoUT8(' '), 0, 3, posit);
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума
Старый 22.04.2014, 21:33   #10
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
чтобы сделать все коротко и универсально (с произвольно задаваемой глубиной) надо все это оформить в рекурсивную процедуру.
Сделал, спасибо
Вложения
Тип файла: rar ComparingHashesEng.rar (312.8 Кб, 6 просмотров)
Тип файла: rar Hashing.rar (306.4 Кб, 6 просмотров)
Taner вне форума
Закрытая тема


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу выйти из цикла while mustaman Общие вопросы Delphi 7 18.07.2013 14:51
C++ Как выйти из цикла при нажатии enter? Seede1 Помощь студентам 2 06.12.2011 14:50
Как выйти из цикла по нажатию горячей клавиши? suslik_ Помощь студентам 2 06.07.2011 16:20
Делфи выйти из цикла. S_Yevgeniy Помощь студентам 1 14.11.2009 09:41
Как выйти из бесконечного цикла! Эдуард Общие вопросы C/C++ 11 02.03.2008 19:15