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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2009, 19:45   #1
AquaKlaster
Delphi,Python,PHP
Форумчанин
 
Аватар для AquaKlaster
 
Регистрация: 04.04.2009
Сообщений: 138
По умолчанию Перебор всех доступных значений!

как перебрать все доступные значения, например
aaa
aab
aac
aad
и тд
но не для 3х знаков а для n-го количества знаков(указыватся будет в программе) и не только букв перебор но и цыфр, букв, знаков "-" "_" "."
я просто понять не могу как это можно зделать.
если можно то напишите пример!
AquaKlaster вне форума Ответить с цитированием
Старый 04.08.2009, 20:11   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вот пример для трех символов букв русского алфавита и цифр. Вывод результата в текстовый файл. Немного поправите под себя. Главное таблицу символов ANSI изучите, а алгоритм несложный. Вообще это вроде называется в комбинаторике генерация размещений.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function incSymbol(const sym: char): char;
  begin
    case sym of
    '0'..'8','А'..'Ю': incSymbol:=char(Ord(sym)+1); 
    '9': incSymbol:='А';
    end;
 end;

function getNext(var comb: string): boolean;
  var i: byte;
  begin
  if comb='ЯЯЯ' then 
    Result:=false
  else
    begin
    Result:=true;
    i:=3; 
    while (comb[i]='Я') do
      begin
      comb[i]:='0';
      dec(i);
      end;
    comb[i]:=incSymbol(comb[i]);
    end;
  end;
procedure TForm1.Button1Click(Sender: TObject);
var f:textfile;
    com:string;
begin
assignfile(f,'rez.txt');
rewrite(f);
com:='000';
writeln(f,'000');
while getNext(com)=true do
writeln(f,com);
closefile(f);
end;

end.
Видел давненько уже здесь на форуме похожую программу для любых исходных данных, но вряд ли найду.

Последний раз редактировалось puporev; 04.08.2009 в 20:13.
puporev вне форума Ответить с цитированием
Старый 04.08.2009, 20:26   #3
AquaKlaster
Delphi,Python,PHP
Форумчанин
 
Аватар для AquaKlaster
 
Регистрация: 04.04.2009
Сообщений: 138
По умолчанию

Нужно с англ буквами и еще что бы можно было указывать длину перебираемых символов(3,4,5 и тд знаки)
AquaKlaster вне форума Ответить с цитированием
Старый 04.08.2009, 21:00   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Так и доделайте как Вам надо. А за Вас никто и не нанимался это делать. Что это еще за распоряжения?
puporev вне форума Ответить с цитированием
Старый 04.08.2009, 21:10   #5
AquaKlaster
Delphi,Python,PHP
Форумчанин
 
Аватар для AquaKlaster
 
Регистрация: 04.04.2009
Сообщений: 138
По умолчанию

я сказал что мне над, но я не сказал ЗДЕЛАЙТЕ
AquaKlaster вне форума Ответить с цитированием
Старый 04.08.2009, 22:40   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Что-то не очень понятно, что Вы хотите сделать. Вот пример только для маленьких латинских букв. Даже при n=3 вывод в Мемо идет несколько секунд. В файл быстрее. Уже при n=4 даже в файл долго выодит. Как Вы хотите это организовать дя например 100 символов, не знаю. В примере сделан вывод в Мемо, но в комментариях оставлен вывод в файл.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type mas=array[1..26] of char;
var
  Form1: TForm1;
  n:byte;
implementation

{$R *.dfm}
function incSymbol(const sym: char): char;
begin
  if sym in ['a'..'y'] then result:=char(Ord(sym)+1)//следующий по алфавиту символ
  else result:='z';
end;

function getNext(var m:mas): boolean;
  var i,k: byte;
  begin
   k:=0;
   for i:=1 to n do
   if m[i]='z' then inc(k); //если все символы=z, заканчиваем
   if k=n then  Result:=false
  else
    begin
    Result:=true;
    i:=n;//начинаем с последнего символа
    while (m[i]='z') do //если перебрали все символы в этой ячейке
      begin
      m[i]:='a';
      dec(i);   //переходим к левой ячейке
      end;
    m[i]:=incSymbol(m[i]);//перебираем символы
    end;
end;
procedure TForm1.Button1Click(Sender: TObject);//вводим с проверкой размер массива
begin
n:=StrToInt(Edit1.Text);
if not(n in [1..26])then
 begin
  Showmessage('Неверно введен размер массива!');
  Edit1.Clear;
  Edit1.SetFocus;
 end;


end;
procedure TForm1.Button2Click(Sender: TObject);
var //f:textfile;
    ms:mas;
    i:byte;
    s:string;
begin
//assignfile(f,'rez.txt');
//rewrite(f);
s:='';
for i:=1 to n do
 begin
  ms[i]:='a';  //первый массив из букв а
  s:=s+ms[i];
 end;
  //write(f,ms[i],' ');
Memo1.Lines.Add(s);

//writeln(f,'');
while getNext(ms)=true do  //все следующие массивы
  begin
   s:='';
   for i:=1 to n do
   s:=s+ms[i];
   //write(f,ms[i],' ');
   Memo1.Lines.Add(s);
   //writeln(f,'');
 end;
//closefile(f);  }
end;

end.
puporev вне форума Ответить с цитированием
Старый 04.08.2009, 23:57   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Когда то делал такую программу, она есть здесь на форуме. Я ее и сам вряд ли найду уже. Там до 6-ти разрядов я сделал, как универсально (до бесконечности) сделать я тогда так и не понял, может и невозможно. У меня там увеличение разрядности делается добавлением вложенных циклов, т.е. на этапе разработки, не во время выполнения.
А по времени да, долго, для 6-ти разрядов очень долго комбинации ищутся, вернее пишутся в файл/в форму.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 05.08.2009, 00:51   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

перебор можно через рекурсию сделать(сколько угодно можно вложенность сделать...ну почти...стек всетаки не резиновый)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.08.2009, 01:13   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

да нет, тогда рассматривали рекурсию (не я один пытался), даже дело не в стеке, не получалось тут через рекурсию, хотя другие задачи по комбинаторике я делал через рекурсию, короче не помню я уже, ищите поиском по форуму
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 05.08.2009, 04:11   #10
TAVulator
Программист
Форумчанин
 
Аватар для TAVulator
 
Регистрация: 23.07.2009
Сообщений: 101
По умолчанию

mutabor, плохо старались...
Цитата:
может и невозможно
Цитата:
тогда рассматривали рекурсию (не я один пытался)
возможно... плохо пытались.

вот набросал программку:
genpas.JPG
умеет перебирать символы в слова разной длинны (от и до).
словарь задается вручную.
в архиве сама программа и исходники к ней: GenDict.zip
делал с использованием рекурсии.

сразу предупреждаю: тестируйте на маленьких значениях (до 5-6) или используйте маленький словарь (например "123") иначе долго ждать придется :-)
Если вы верите, что можете или не можете
сделать что-то, вы правы в обоих случаях.

______________________________(С) Г.Форд

Последний раз редактировалось TAVulator; 05.08.2009 в 04:18.
TAVulator вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
с++ Перебор всех возможных подмножеств множества целых чисел Modlika17 Помощь студентам 19 10.01.2012 11:09
Реализовать перебор всех возможных IP-адресов (С++) ak74m Помощь студентам 0 09.04.2009 13:59
Перебор всех возможных вариантов [MI_nor] Общие вопросы C/C++ 9 01.04.2009 21:17
Найти значение функций для всех целых значений из диапазона -8..3 Goldberg Паскаль, Turbo Pascal, PascalABC.NET 5 13.11.2008 00:05
перебор всех элементов в TtreeView vitalik007 Общие вопросы Delphi 10 09.04.2008 15:44