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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.11.2011, 00:10
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию Перемешать список

Код:
var
  Form1: TForm1;
  R: Integer;
  New : array [1..15] of Integer;

implementation

{$R *.dfm}

procedure TForm1.RList;
begin
Randomize;
r := Random(15);
if New[r] = 0 then
  RList // ошибка
else
  begin
  ListBox1.Items.Add(IntToStr(r));
  New[r] := 0;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
for i:=1 to 15 do
New[i]:=1;

Edit1.Clear;
for i:=1 to 15 do
RList;
end;

Код вялый и выдает ошибку, но после нажатия "ОК" в целом получается то что нужно. Вообще задача состоит в том что есть несколько переменных в которых записаны данные и необходимо что бы эти данные считывались, но в случайном порядке и не повторялись. Возможно кто-то может посоветовать что-то более стабильное.

Последний раз редактировалось Kaktuz, 30.11.2011 в 00:13.
Ответить с цитированием
  #2  
Старый 30.11.2011, 00:15
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Сразу что бросилось в глаза:
Код:
  New : array [1..15] of Integer;
...
r := Random(15);
if New[r] = 0 then
...
откровенная лажа, дальше и смотреть не стал.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 30.11.2011, 00:57
m1sclick m1sclick вне форума
Начинающий
 
Регистрация: 04.07.2011
Адрес: Украина
Сообщения: 186
Версия Delphi: 2010
Репутация: 2094
По умолчанию

Каково применение сего чуда?

Будь добр, весь код выложи. Или если это весь код, то я могу предложить более простой способ присвоения 15-ти элементам массива значения 0.

Ну а если быть серьезным то дописывай:
В var
Код:
fuck: integer;
а так-же в RList:
Код:
if fuck = 14 then exit;
и
Код:
if New[r] = 0 then
  begin
    inc(fuck);
...
Все что я смог сообразить на ночь глядя.
Да и вобще, какого лешего нужно было писать целую процедуру да и еще потом её саму с себя вызывать для того что бы выполнить одну строчку кода: r := Random(14); ах, да и поправь массивы - это же не серьезно совсем.

Последний раз редактировалось m1sclick, 30.11.2011 в 01:42.
Ответить с цитированием
  #4  
Старый 30.11.2011, 01:26
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Сори. Забыл пояснить одну деталь.
Код:
if New[r] = 0 then
Используется что бы вычесть из random "0" который не нужен и не будет использоваться, таким образом оставив только 1-15.
Если смотреть на код поочередно то можно заметить что в начале было записано в 15 переменных 1
Код:
for i:=1 to 15 do
New[i]:=1;
Последующим образом должна была происходить подобная схема.
Если генерированное число (тоисть номер переменной) равняется 1 значит такого числа еще не было и мы его добавим в список и запишем в переменную 0 что это чило уже используется. Ну и так далее.
Друго-го я как-то не смог придумать...
Ответить с цитированием
  #5  
Старый 30.11.2011, 01:37
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Тогда так:
Код:
r := Random(15) + 1;
и 0 не будет.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 30.11.2011, 01:37
m1sclick m1sclick вне форума
Начинающий
 
Регистрация: 04.07.2011
Адрес: Украина
Сообщения: 186
Версия Delphi: 2010
Репутация: 2094
По умолчанию

Я вобще-то понял это все, и сути это не меняет совсем. У тебя 15 элементов заполняются нолями и ты тупо продолжаешь открывать процедуры RList пока не заполниш ими всю память. Делай как говорил я или придумывай другой способ как контролировать количество открытых RList.
Во, единственное что я забыл так это обнулять переменную fuck если New[r] <> 0, то есть:
Цитата:
else
begin
ListBox1.Items.Add(IntToStr(r));
New[r] := 0;
fuck:=0;
end;
Извиняюсь за такой прокол, не думает уже головушка.

И я до сих пор не понял как строка:
Цитата:
if New[r] = 0 then
помогает
Цитата:
Сообщение от Kaktuz
вычесть из random "0" который не нужен и не будет использоваться, таким образом оставив только 1-15.

Как вариант можно вызывать random на 15 и приплюсовывать 1.

Последний раз редактировалось m1sclick, 30.11.2011 в 02:14.
Ответить с цитированием
  #7  
Старый 30.11.2011, 01:53
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Тогда так:
Код:
r := Random(15) + 1;
и 0 не будет.

Добавил в свой код только данное действиие, тоесть + 1 и все стало нормально
Ответить с цитированием
  #8  
Старый 30.11.2011, 02:13
m1sclick m1sclick вне форума
Начинающий
 
Регистрация: 04.07.2011
Адрес: Украина
Сообщения: 186
Версия Delphi: 2010
Репутация: 2094
По умолчанию

Уже наверно не актуально но,вот так наверно будет красивее:
Код:
procedure RList;
begin
Randomize;
repeat
  r := Random(15)+1;
  if Form1.ListBox1.Items.Count = 15 then exit;
until New[r] <> 0 ;
Form1.ListBox1.Items.Add(IntToStr(r));
New[r] := 0;
end;
Ответить с цитированием
  #9  
Старый 30.11.2011, 02:24
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от m1sclick
Уже наверно не актуально но,вот так наверно будет красивее:
Код:
procedure RList;
begin
Randomize;
repeat
  r := Random(15)+1;
  if Form1.ListBox1.Items.Count = 15 then exit;
until New[r] <> 0 ;
Form1.ListBox1.Items.Add(IntToStr(r));
New[r] := 0;
end;

Почему-то у меня программа зависла с 100% загрузкой процессора.
Вот еще так подкорректировал.
Код:
procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
ListBox1.Clear;
for i:=1 to 15 do
  New[i]:=0;
for i:=1 to 15 do
  ABC;
end;

procedure TForm1.ABC;
var r: integer;
begin
Randomize;
r := random(15)+1;
If New[r] = 0 then
  begin
  New[r] := r;
  ListBox1.Items.Add(IntToStr(r));
  end
else
  ABC;
end;
Что конечно ни как не могу понять суть строки r := random(15)+1; если же нам генерируют число 0 мы добавляем 1 и получаем 1. Это ясно. Ну, а вот если генерируем число 15 и добавляется 1 должно получится 16 но оно как-то неполучается
Ответить с цитированием
  #10  
Старый 30.11.2011, 02:28
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Kaktuz
Что конечно ни как не могу понять суть строки r := random(15)+1; если же нам генерируют число 0 мы добавляем 1 и получаем 1. Это ясно. Ну, а вот если генерируем число 15 и добавляется 1 должно получится 16 но оно как-то неполучается
Random генерит от нуля до числа-1, получится не 16, а 15.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 30.11.2011, 06:24
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

PHP код:
type Tmyarray = array[1..15of integer;
procedure shuffle(var aTmyarray);
  
procedure swap(xyinteger);
  var 
kinteger;
  
begin
    k 
:= a[x]; a[x] := a[y]; a[y] := k;
  
end;
var 
iinteger;
begin
  
for := low(ato high(a) do
    
swap(ilow(a) + random(high(a)));
end

Последний раз редактировалось Pyro, 30.11.2011 в 06:29.
Ответить с цитированием
  #12  
Старый 30.11.2011, 08:11
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Уже давно существует простой и элегантный способ перемешивания. Создаете массив. Заполняете его значениями по порядку. Затем обмениваете в случайном порядке индексы этого массива. Чем длиннее цикл обмена, тем выше качество перемешивания. Собственно Pyro и показал такой вариант.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 30.11.2011, 08:53
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Я что-то не представляю как его использовать...
Ответить с цитированием
  #14  
Старый 01.12.2011, 23:22
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Ругается на меня. Что не так?
Пишет что Integer и String несовместимые типы.
Глобальная переменная "n: integer;" остальные "String;".

Код:
procedure TForm1.Refresh;
var r, a: integer;
begin
Randomize;
r := random(16)+1;
if New[r] <> '0' then
  begin
  But[n]:=New[r];
  a:=But[n];
  Box[a]:='0';
Ответить с цитированием
  #15  
Старый 01.12.2011, 23:26
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Как определён массив But?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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