Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.06.2013, 00:53
ИдиПейЧай ИдиПейЧай вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
Печаль не могу сообразить

Здравствуйте. Помогите реализовать пожалуйста.
Нужно в переменную процедуры string записывать новые данные каждый раз после ее завершения.
В ней должен быть набор из 8 символов цифр 0-9 букв a-z

aaaaaaaa
aaaaaaab
aaaaaaac
.............

Как такое можно реализовать?
Ответить с цитированием
  #2  
Старый 02.06.2013, 00:56
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Переменная - понятно.
Переменная процедуры - более-менее, видимо локальная.
Переменная процедуры string - беспорядочный набор слов.

Опиши, что вообще нужно, нормальным языком.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 02.06.2013, 01:05
ИдиПейЧай ИдиПейЧай вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

нужно использовать процедур несколько раз, начинать когда переменная имеет значение aaaaaaaa последний когда переменная принимает значение 9999999.
Ответить с цитированием
  #4  
Старый 02.06.2013, 01:31
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Ну так сделать передаваемую строку параметром процедуры, вызов сделать в цикле и на каждой итерации изменять строку.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 02.06.2013, 20:42
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от ИдиПейЧай
Здравствуйте. Помогите реализовать пожалуйста.
Нужно в переменную процедуры string записывать новые данные каждый раз после ее завершения.
В ней должен быть набор из 8 символов цифр 0-9 букв a-z

aaaaaaaa
aaaaaaab
aaaaaaac
.............

Как такое можно реализовать?
Если я тебя правильно понял, то тебе нужно реализовать обычный инкремент восьмиразрядного тридцатишестиричного числа (т.е. в системе счисления 36). В общем случае это делается примерно так:
Код:
const
  Digits: AnsiString = 'abcdefghijklmnopqrstuvwxyz0123456789'; // В этой строке находятся используемые
                                                               // "цифры" в порядке возрастания

procedure Increment(var Number: AnsiString);
var
  i, p: Integer;
begin
  i := Length(Number);
  while i > 0 do
  begin
    p := Pos(Number[i], Digits);
    if p = 0 then raise Exception.Create('Встретилась неизвестная цифра');
    Inc(p);
    if p > Length(Digits) then
    begin
      Number[i] := Digits[1];
      Dec(i);
    end else
    begin
      Number[i] := Digits[p];
      Exit;
    end;
  end;
end;

// Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
const
  NumberLen = 8; // Количество "цифр" в "числе"
var
  s, First: AnsiString;
begin
  First := StringOfChar(Digits[1], NumberLen); // Первое "число" вроде такого "aaaaaaaa"
  s := First;
  repeat
    Caption:=s;
    Increment(s);
  until s = First; // Пока не вернёмся к первому "числу"
end;
Если константе Digits задать значение '0123456789', то получим инкрементирование обычных десятичных чисел, если задать '0123456789ABCDEF' то инкрементирование шестнадцатеричных чисел, если задать '01' то инкрементирование двоичных чисел и т.д.
Правда так как эта процедура предназначена для общего случая, то она не сильно шустрая. Если же важна скорость, то для твоего случая (36-ричного) можно соптимизировать её примерно так:
Код:
procedure Increment(var Number: AnsiString);
var
  i: Integer;
begin
  i := Length(Number);
  while i > 0 do
  begin
    case Number[i] of
      'a'..'y', '0'..'8': Number[i] := Succ(Number[i]);
      'z': Number[i] := '0';
      '9':
        begin
          Number[i] := 'a';
          Dec(i);
          Continue;
        end;
    else
      raise Exception.Create('Встретилась неизвестная цифра');
    end;
    Break;
  end;
end;
Есть так же возможности соптимизировать инкремент и для общего случая. Правда я не знаю нужно ли тебе это, поэтому описывать это не буду.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
ИдиПейЧай (03.06.2013)
  #6  
Старый 02.06.2013, 21:58
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

poli-smen, напоминает типичный брутфорс
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 03.06.2013, 02:20
ИдиПейЧай ИдиПейЧай вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Если я тебя правильно понял, то тебе нужно реализовать обычный инкремент восьмиразрядного тридцатишестиричного числа (т.е. в системе счисления 36). В общем случае это делается примерно так:
Код:
const
  Digits: AnsiString = 'abcdefghijklmnopqrstuvwxyz0123456789'; // В этой строке находятся используемые
                                                               // "цифры" в порядке возрастания

procedure Increment(var Number: AnsiString);
var
  i, p: Integer;
begin
  i := Length(Number);
  while i > 0 do
  begin
    p := Pos(Number[i], Digits);
    if p = 0 then raise Exception.Create('Встретилась неизвестная цифра');
    Inc(p);
    if p > Length(Digits) then
    begin
      Number[i] := Digits[1];
      Dec(i);
    end else
    begin
      Number[i] := Digits[p];
      Exit;
    end;
  end;
end;

// Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
const
  NumberLen = 8; // Количество "цифр" в "числе"
var
  s, First: AnsiString;
begin
  First := StringOfChar(Digits[1], NumberLen); // Первое "число" вроде такого "aaaaaaaa"
  s := First;
  repeat
    Caption:=s;
    Increment(s);
  until s = First; // Пока не вернёмся к первому "числу"
end;
Если константе Digits задать значение '0123456789', то получим инкрементирование обычных десятичных чисел, если задать '0123456789ABCDEF' то инкрементирование шестнадцатеричных чисел, если задать '01' то инкрементирование двоичных чисел и т.д.
Правда так как эта процедура предназначена для общего случая, то она не сильно шустрая. Если же важна скорость, то для твоего случая (36-ричного) можно соптимизировать её примерно так:
Код:
procedure Increment(var Number: AnsiString);
var
  i: Integer;
begin
  i := Length(Number);
  while i > 0 do
  begin
    case Number[i] of
      'a'..'y', '0'..'8': Number[i] := Succ(Number[i]);
      'z': Number[i] := '0';
      '9':
        begin
          Number[i] := 'a';
          Dec(i);
          Continue;
        end;
    else
      raise Exception.Create('Встретилась неизвестная цифра');
    end;
    Break;
  end;
end;
Есть так же возможности соптимизировать инкремент и для общего случая. Правда я не знаю нужно ли тебе это, поэтому описывать это не буду.

спасибо большое
Ответить с цитированием
  #8  
Старый 03.06.2013, 11:39
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от PhoeniX
poli-smen, напоминает типичный брутфорс
Ну да, для брутфорса тоже можно использовать. Особенно оптимизированный вариант.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter