Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопросы новичка про цикл и неповторяющиеся числа в массиве.


Страницы:   1 2 3

volkafff ©   (2011-01-15 17:07:00) 

Здравствуйте!
1)Я могу написать во так:

z=array[1..10]of integer;
for i:=1 to 10 do
begin
z[i]:=5;
end;

То есть я циклом присваиваю всем элементам массива значение "5".

А как мне сделать что-то подобное:

For i:=1 to 10 do
begin
image[i].visible:=false;
end;

То есть я хочу присвоить 10-ти объектам одно и тоже значение одного и того же свойства.Не получается. Пробовал и круглые,и квадратные скобки- всё равно.Что сделать?

2) Мне нужно,чтобы в массиве были  сгенерированные неповторяющиеся числа(порядок карт в колоде).
Хотел сделать так:
X=array[1..10]of integer;(все числа этого массива равны нулю)
number=array[1..10]of integer; (здесь будут храниться сгенерированные числа)
(L-это label)
for i:=1 to 10 do
begin
L:
Z:=random(9)+1;(генерация числа от 1 до 10(для этого генерируется число от 0 до 9 и прибавляется единица))
if x[z]=0 then  (в массиве Х только нули.Как только сгенерируется число,скажем,5,то x[5]:=1; сделано для отслеживания повторяющихся чисел)
begin
number[i]:=z;(если небыло раньше такого числа-присвоить его другому массиву под индексом [i])
x[z]:=1;
end
else
goto L(в противном случае повторить генерацию)
end;

Вся проблема способа в том,что двухъядерный компьютер завис на генерации пяти чисел, а я хотел сгенерировать 92 числа. Что мне можно сделать?


MBo   (2011-01-16 15:15:00) [21]

1.   http://www.delphimaster.ru/articles/comparray.html
2.   http://en.wikipedia.org/wiki/Fisher–Yates_shuffle
по сути - то, что уже описал Сергей М. ©   (15.01.11 18:00) [3]


Inovet   (2011-01-16 15:04:00) [22]

> [21] sniknik ©   (16.01.11 14:18)
> там где то customsort есть

Автор не хотел стандартных компонентов, в это, надо полагать, входят и методы всякие.

Вот наподибие, тько вручную.

Массив на 92 елемента.
Цикл от 91 до 0
Перестановка двух елементов в массиве с индексами текущее_значение_итератора и сенерированного рандомного значения в диапазоне 0-текущее_значение_итератора.


v_a_belousov   (2011-01-16 14:43:00) [23]


> sniknik

да конечно надо делать по другому... как уже писали:


> ...циклами выбираешь из списка элемент со случ.индексом...


да и ещё много как можно... но если у него всего 100 цифр, то ничего страшного не случится и если сделать так как у меня.


sniknik   (2011-01-16 14:41:00) [24]

вот, "моя идея", если убрать заполнение/просмотр, то все нужное для перемешивания это List.CustomSort(MySort);

function MySort(List: TStringList; Index1, Index2: Integer): Integer;
begin
 result:= Random(3) - 1;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
 i: integer;
 List: TStringList;
 st: string;
begin
 List:= TStringList.Create;
 try
   for i:= 1 to 92 do //это по идее должно быть заполнено 1 раз, при старте например
     List.AddObject('', Tobject(i));
   Randomize;         //тоже достаточно 1 раз, при старте например

   List.CustomSort(MySort); //собственно "перемешивание"

   st:= '';
   for i:= 0 to 92-1 do //посмотрим что получилось
     st:= st + IntToStr(Integer(List.Objects[i])) + #13#10;
   Memo1.Text:= st;
 finally
   List.Free;
 end;
end;


sniknik   (2011-01-16 14:24:00) [25]

+
идея работать со строковыми представлениями чисел... также на 2
взял бы уж тогда TList и хранил числа.


sniknik   (2011-01-16 14:18:00) [26]

> я показал саму идею...
идея "долбится миллион раз пока случайным образом не получишь оставшееся единственным число..." на двоечку. ;)

если нужна "перетасовка" то лучше сделать сортировку по случайному значению. (там где то customsort есть). результат будет тот же, а времени займет много меньше.


v_a_belousov   (2011-01-16 13:23:00) [27]


> Sha

Я не старался написать полноценный алгоритм) я показал саму идею...


Sha   (2011-01-16 09:53:00) [28]

v_a_belousov   (15.01.11 18:28) [5]

Плохой алгоритм, на троечку.
Попробуйте еще раз, если хотите исправить оценку :)


DiamondShark   (2011-01-15 23:23:00) [29]

Мне понравилось:
-- Как мне продварковать влендишным способом?
Следует описание алгоритма по-русски.
-- Я ничего не понял. Можно кодом?
Следует кусок кода.
- Я ничего не понял. Можно по-русски объяснить?


Anatoly Podgoretsky   (2011-01-15 21:38:00) [30]

Вообще то это конференция для начинающих, а для новичков у нас нет конференции.


v_a_belousov   (2011-01-15 19:30:00) [31]


> volkafff ©

К примеру оставим твою концепцию. Как сгенерировать 100 чисел в разном порядке я тебе показал. Теперь тебе нужно только изображениям задать картинки в нужном порядке... следовательно у тебя на форме находится 100 Image. Image1..Image100

тогда делай так

for i:=1 to Length(Y) do
begin
 TImage(FindComponent('Image'+IntToStr(i))).Picture := Y[x[i-1]];
end;


> В папке с программой есть картинки.Мне нужно как-то их загрузить
> в этот массив,но так,чтобы при переносе на другой компьютер
> всё работало. Как это можно сделать?

сделать ресурс... или загрузить сразу в Image...


RWolf   (2011-01-15 19:28:00) [32]


> Но такая запись("image[z].")не подходит.Что делать?

(FindComponent('Image'+IntToStr(i)) as TImage).


volkafff   (2011-01-15 19:19:00) [33]

Я хочу сделать подобие гастольной игры.Там будет поле из 100 карточек,каждую игру оно генерируется заново.
Есть 100 картинок-полей.
Генерируется массив случайных чисел "Х"-порядок этих карточек.
Потом в массиве "Y" картинки-поля распологаются в соответствии с массивом "Х". И последнее-отображение самого поля:

For Z:=1 to 100 do
begin
image[z].picture:=Y[z];
end;

То есть все сгенерированные картинки встают на свои места. Но такая запись("image[z].")не подходит.Что делать?

2)У меня есть массив:
Pic=array[1..10]of tpicture;

В папке с программой есть картинки.Мне нужно как-то их загрузить в этот массив,но так,чтобы при переносе на другой компьютер всё работало. Как это можно сделать?


v_a_belousov   (2011-01-15 19:10:00) [34]


> Сергей М.

ну да)


Сергей М.   (2011-01-15 19:03:00) [35]


> v_a_belousov   (15.01.11 18:28) [5]


Забивать гвозди и микроскопом можно)


v_a_belousov   (2011-01-15 19:00:00) [36]


> Вот первый вопрос:

чтобы дать тебе ответ на него объясни где у тебя изображения... сколько их... что нужно сделать подробнее...


Сергей М.   (2011-01-15 19:00:00) [37]


> Можно кодом?.. без стандартных  компонентов delphi.


Можно если ты вразумительно ответишь на вопрос, где ты увидел хоть намек на компоненты и чем они тебе не угодили


v_a_belousov   (2011-01-15 18:58:00) [38]


> объясните пожалуйста по действиям,что происходит

var i: integer; List: TStringList; - объявляем переменные
begin
repeat - начинаем цикл
Randomize; - делаем выбор числа случайным...
i := random(92); - генерируем число
if i<>0 then - если не равно 0, то
begin
if List.IndexOf(IntToStr(i))=-1 then - если его ещё нет в списке
 List.Add(IntToStr(i)); - то добавляем его туда
end;
Application.ProcessMessages; - не зависаем
until List.Count+1=92; - цикл закончится когда будут сгенерированы все числа
end;


volkafff   (2011-01-15 18:52:00) [39]

1)"Что здесь твориться"-всмысле вот так:

"Загружаем bmp-файл в компонент image1. Загружаем его в массив картинок. Очищаем массив цифр."

и т.п. то есть объясните пожалуйста по действиям,что происходит.

2)Вот первый вопрос:

> Здравствуйте!1)Я могу написать во так:z=array[1..10]of integer;
> for i:=1 to 10 dobeginz[i]:=5;end;То есть я циклом присваиваю
> всем элементам массива значение "5".А как мне сделать что-
> то подобное:For i:=1 to 10 dobeginimage[i].visible:=false;
> end;То есть я хочу присвоить 10-ти объектам одно и тоже
> значение одного и того же свойства.Не получается. Пробовал
> и круглые,и квадратные скобки- всё равно.Что сделать?


v_a_belousov   (2011-01-15 18:42:00) [40]


> Мне нужно,чтобы в массиве были  сгенерированные неповторяющиеся
> числа(порядок карт в колоде)


> завис на генерации пяти чисел, а я хотел сгенерировать 92
> числа. Что мне можно сделать?


> что здесь творится


Генерируем тебе 92 числа.


> ответ на первый вопрос?

А что тебе ещё нужно я думаю не только я не понял...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо