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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.03.2009, 20:13
эмф эмф вне форума
Прохожий
 
Регистрация: 06.03.2009
Сообщения: 3
Репутация: 10
По умолчанию подскажите с масивом

Здравствуйте!
вот такой вопрос.
на форме мемо и кнопка,
при нажатие на кнопку, мемо заполнятеся пятью числами, по строчкам, которые не должны быть равны нули и между собой.
вот, что я смог :
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
mass:array[1..5] of integer;  //задал масив
i,j:integer;
s:string;
a,b:integer;
begin
memo1.Clear;
  Randomize;
   for i:=1 to 5 do
    begin
    a:=random(6);
     mass[i]:=a;        // заполнил рандомными числами
     while mass[i]=0 do  //сделал пересчёт, если появляется 0
         begin
       mass[i]:=random(6);
         end;
     end;

   for j:=1 to 5 do     //тут я пытаюсь пройтись по уже заполненому масиву
  begin
 while mass[j]=mass[j+1] do //пересчёт пока j-тый элемет масива равен j+1
           begin
       mass[j]:=random(6);
           end;
           memo1.Lines.Add(inttostr(mass[j])); // заполняем мемо
    end;
end;

у меня не получается пройтись по заполненому масиву, сравнив числа в нём между собой и повторную пересчитать. укажите пожайлуста мне на мои ошибки и что я не так понимаю !)
п.с.
извените, если оформел не по форме.

Последний раз редактировалось эмф, 06.03.2009 в 20:26.
Ответить с цитированием
  #2  
Старый 06.03.2009, 20:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,105
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Я правильно понимаю, что тебе надо заполнить N числами ПОДРЯД, но в СЛУЧАЙНОМ ПОРЯДКЕ?

Тут такая фигня, что обычный метод генерации случайных чисел тут плохой помошник. Он может работать неопределенно долгое время, особенно при генерации последних чисел. Я бы предложил немного другой алгоритм.

Есть массив 1..N, который надо заполнить числами 1..N в случайном порядке. в цикле от 1 до N мы генерим не сами числа, а их индексы в массиве. При этом, если ячейка уже занята, то не перегенерируем индекс, а сдвигаем его веред до первой свбодной ячейки с циклическим сдвигом (т.е. если после сгенерированного индекса нет ни одной свободной ячейки, то дальше начинаем искать место с начала массива).

Итак:
Код:
procedure GenerateList(N : Integer);
var
  I, Idx : Integer;
  AList : Array Of Integer;
begin
  // Сначала делаем массив и инициализируем его нулями
  SetLength(AList,N);
  For I := Low(AList) To High(AList) Do
    AList[i] := 0;

  // Теперь начинаем заполнять массив
  For I := 1 To N Do
    Begin
       Idx := Random(N);
       If AList[Idx] = 0 
         Then AList[Idx] := I // ячейка и так пустая
         Else // ячейка занята. ищем другое место
           Begin
              While AList[Idx] <> 0 Do
                Begin
                   Inc(Idx);
                   If Idx > High(AList) Then Idx := Low(AList);
                End;
              AList[Idx] := I;
           End;
    End;

  // Теперь выводим результат в мемо.
  Memo1.Lines.Clear;
  For I := Low(AList) To High(AList) Do
    Memo1.Lines.Add(IntToStr(AList[i]);
end;

На самом деле проверка на пустую ячейку не нужна, она добавлена для понятности алгоритма.
Еще несколько замечаний:
1. Динамический массив всегда начинается с 0.
2. Random(N) возвращает случайное число от 0 до N-1.
3. При работе с массивами всегда лучше пользоваться функциями Low() и High(), возвращающими нижнюю и верхнюю границы массива.
Ответить с цитированием
  #3  
Старый 06.03.2009, 21:05
эмф эмф вне форума
Прохожий
 
Регистрация: 06.03.2009
Сообщения: 3
Репутация: 10
По умолчанию

задачу для себя ставил такую, чтобы мемо заполнялась по строчкам n числом чисел, тоесть - пять строчек, 5 чисел,но чтобы небыло 0 и совпадающих чисел, например:
опять же берём пять строчек, но в каждой строчке рандом из 30, и если число в првой строчке будет равно, дапустим, числу из четвёртой строчки, то пересчёт рандома, чтобы числа не были равны между собой.
я попробывал ваш алгоритм, но выходит, что числа в строчках повторяются, и нули проскакивают)
Ответить с цитированием
  #4  
Старый 06.03.2009, 23:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,105
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

пробовал алгоритм или код?
по моему коду ни нулей, ни повторяющихся чисел быть не должно.
Ответить с цитированием
  #5  
Старый 07.03.2009, 12:56
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  mass:array[1..5] of integer;  
  i,j:integer;
  notchek: Boolean;
  a:integer;
begin
  memo1.Clear;
  Randomize;
    for i:=1 to 5 do
    begin
      notchek := true;
      while notchek do
      begin
        a:=random(6);
        if a <> 0 then
        begin
          notchek := false;
          for j := 1 to i - 1 do
          begin
            notchek := (a = mass[j]);
            if notchek then
              break;
          end;
        end;
      end;
      mass[i] := a;
      memo1.Lines.Add(inttostr(a));
    end;
end;
Ответить с цитированием
  #6  
Старый 07.03.2009, 20:32
эмф эмф вне форума
Прохожий
 
Регистрация: 06.03.2009
Сообщения: 3
Репутация: 10
По умолчанию

2 s0Creator
Спасибо, работает! сейчас попробую осознать проиходящее)

2 lmikle
извеняюсь, код! код попробывал)
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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