Форум по 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:53
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

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

Добавил в свой код только данное действиие, тоесть + 1 и все стало нормально
Ответить с цитированием
  #7  
Старый 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.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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