Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перебор динамического массива 
:(
    Опции темы
stalkerok
Дата 18.1.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Добрый день!
Возможно ли сделать полный перебор значений динамического массива?

например 3-и значения:
Код

var
  i1, i2, i3: integer;
  a: array of integer;
begin
  setlength(a, 3);

  a[0]:=3;
  a[1]:=7;
  a[2]:=5;

  for i1 := 0 to High(a) do
  begin
    for i2 := 0 to High(a) do
    begin
      for i3 := 0 to High(a) do
      begin
        if (not(a[i1]=a[i2]) and not(a[i1]=a[i3]) and not(a[i2]=a[i3])) then
        memo1.Lines.Add(format('%d %d %d',[a[i1], a[i2], a[i3]]));
      end;
    end;
  end;


но как быть если размер массива меняется ? делать как-то динамические циклы и условия?

заранее спасибо!

Это сообщение отредактировал(а) stalkerok - 18.1.2009, 00:42
PM MAIL   Вверх
Alexeis
Дата 18.1.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(stalkerok @  17.1.2009,  23:37 Найти цитируемый пост)
но как быть если размер массива меняется ? 

  внутри цикла? Тогда цикл for не подходит, нужен while


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
SneG0K
Дата 18.1.2009, 00:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



Цитата(stalkerok @  17.1.2009,  23:37 Найти цитируемый пост)
делать как-то динамические циклы и условия?

Код

 for i:=0 to length(dynamic_array) do
 begin
   ..Запустися цикл по массиву
 end;


Добавлено через 38 секунд
Цитата(Alexeis @  17.1.2009,  23:41 Найти цитируемый пост)
внутри цикла?

Да уточни... А то я сразу не догнал,..
PM WWW Skype   Вверх
stalkerok
Дата 18.1.2009, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Цитата

внутри цикла? Тогда цикл for не подходит, нужен while 

Нет массив меняется перед циклом, а while получается также писать нужно n раз (n - длина массива)

Это сообщение отредактировал(а) stalkerok - 18.1.2009, 00:45
PM MAIL   Вверх
Alexeis
Дата 18.1.2009, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



SneG0K, а собсно чем length лучше High ? ИМХО это тоже самое +1 элемент.

Добавлено через 1 минуту и 51 секунду
Цитата(stalkerok @  17.1.2009,  23:44 Найти цитируемый пост)
А можно не внутри сделать? а while получается также писать нужно n раз (n - длина массива) 

  Так это как вам удобно, по идее High должен работать и с динамическими размерностями


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stalkerok
Дата 18.1.2009, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



это будет функция в которую будет передаваться массив разной дины например с 500 или 1000 элементов, и тогда как?
PM MAIL   Вверх
Alexeis
Дата 18.1.2009, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



stalkerok, ааа я понял, вложенностей должно быть столько сколько элементов. Попробуйте рекурсию.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stalkerok
Дата 18.1.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Alexeis спасибо Вам, а как её применить?
PM MAIL   Вверх
SneG0K
Дата 18.1.2009, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



stalkerok, рекурсия - это когда функция вызывает сама себя
PM WWW Skype   Вверх
Alexeis
Дата 18.1.2009, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Внутри цикла функция вызовет саму себя, соответственно в ней тоже будет обход цикла с вызовом самой себя. Ток чета мне кажется сам алгоритм требует доработки. В чем состоит задача?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stalkerok
Дата 18.1.2009, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Цитата

В чем состоит задача?

частичным решением этой задачи

и вот тут я запутался...
Код

procedure TmainFrm.startClick(Sender: TObject);
var
  i: integer;
  a: array of integer;
begin
  setlength(a, 3);

  a[0]:=3;
  a[1]:=7;
  a[2]:=5;

  memo.Lines.Clear;

  for i := 0 to High(a) do
  begin
    rec(a);
    //memo.Lines.Add(format('%d %d %d',[a[i1], a[i2], a[i3]]));
  end;

end;

function rec(a: array of integer): array of integer;
var
  i:integer;
  b:array of integer;
begin
  setlength(b, length(a));
  for i := 0 to High(a) do
  begin
    //
  end;
end;

PM MAIL   Вверх
Alexeis
Дата 18.1.2009, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Гм... муторное условие. Что-то похожее решение задачи из теории графов.

Добавлено через 1 минуту и 19 секунд
Одно ясно точно без рекурсии не обойтись, но по примерам трудно понять хорошо бы четкое условие.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stalkerok
Дата 18.1.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



вот нашёл несколько алгоритмов перебора, не подскажите какой быстрее(лучше)?
PM MAIL   Вверх
stalkerok
Дата 18.1.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Цитата

Гм... муторное условие. Что-то похожее решение задачи из теории графов.

да так и есть, 
Цитата

Одно ясно точно без рекурсии не обойтись, но по примерам трудно понять хорошо бы четкое условие. 

мне всего лишь нужно перебрать все комбинации в массиве разной длины (как в старттопике), не получается с рекурсией можно пример?

заранее спасибо!
PM MAIL   Вверх
stalkerok
Дата 18.1.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Попытался сделать но ничего не получается что не так?

Код

procedure TmainFrm.startClick(Sender: TObject);
var
  a: array of integer;
begin
  setlength(a, 3);
  a[0]:=3;
  a[1]:=7;
  a[2]:=5;
  memo.Lines.Clear;
  rec(a);
end;

procedure TmainFrm.rec(a: array of integer);
var
 i:integer;
begin
  for i := 0 to length(a) do
  begin
    rec(a);
    memo.Lines.Add(format('%d %d %d',[a[i], a[i], a[i]]));
  end;
end;

PM MAIL   Вверх
stalkerok
Дата 19.1.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



нашёл то что нужно! помогите переделать под массив и числа.
заранее спасибо!
Код

program Permute;
{$APPTYPE CONSOLE}

uses SysUtils;

var
  R, Slen: Integer;

procedure P(var A: string; B: string);
var
  J: Word;
  C, D: string;
begin
  { P(N,N) >>  R=Slen  }
  if Length(B) = SLen - R then
  begin
    Write(' {' + A + '} '); {Per++}
  end
  else
    for J := 1 to Length(B) do
    begin
      C := B;
      D := A + C[J];
      Delete(C, J, 1);
      P(D, C);
    end;
end;

var
  Q, S, S2: string;
begin
  S  := ' ';
  S2 := ' ';
  while (S <> '') and (S2 <> '') do
  begin
    Writeln('');
    Writeln('');
    Write('P(N,R)  N=? : ');
    ReadLn(S);
    SLen := Length(S);
    Write('P(N,R)  R=? : ');
    ReadLn(S2);
    if s2 <> '' then R := StrToInt(S2);
    Writeln('');
    Q := '';
    P(Q, S);
  end;
end.

PM MAIL   Вверх
stalkerok
Дата 19.1.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



переделал, правильно?

почему с Word не работало а с integer всё нормально стало (i, j: integer;)?

Код

program bust;
{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure Permute(var a: string; b: array of integer);
var
  i, j: integer;
  str: string;
  c: array of integer;
begin
  if length(b) = 0 then
  begin
    write(' ' + a);
    writeln('');
  end
  else
  begin
    for i := 0 to high(b) do
    begin
      //c = b
      setlength(c, length(b));
      for j := 0 to high(b) do c[j]:=b[j];
      str:= a + inttostr(c[i]);
      //Delete
      for j:=i to high(c)-1 do c[j]:=c[j+1];
      SetLength(c, high(c));
      //Permute
      Permute(str, c);
    end;
  end;
end;

var
  arr: array of integer;
  s1: string;
begin
  s1:= '';
  setlength(arr, 3);
  arr[0]:=5;
  arr[1]:=7;
  arr[2]:=3;

  writeln('');
  Permute(s1, arr);
  readLn;
end.


Это сообщение отредактировал(а) stalkerok - 19.1.2009, 20:22
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1045 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.