Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Вопрос по Delphi

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Вопрос по Delphi
Имя
Сообщение << Старые топики   Новые топики >>
Вопрос по Delphi - 2008-06-13 17:27:36.416666   
~Zavoorchik~

Сообщений: 3
Оценки: 0
Присоединился: 2008-06-05 20:32:08.073333
Имеются 16 компонентов Button. Как сделать так, чтобы свойство Caption каждой кнопки было равно числу от 1 до 16? порядок следования чисел должен быть произвольным, и только чтобы числа не повторялись…
Заранее спасибо ;)
Post #: 1
RE: Вопрос по Delphi - 2008-06-13 18:00:57.166666   
vvviperrr

Сообщений: 301
Оценки: 0
Присоединился: 2007-03-20 21:33:16.790000
ну динамически кнопки на форме создавать, массив хендлов будет, и в цикле установить им caption
Post #: 2
RE: Вопрос по Delphi - 2008-06-13 18:11:28.703333   
~Zavoorchik~

Сообщений: 3
Оценки: 0
Присоединился: 2008-06-05 20:32:08.073333
хотел уточнить: числа в Caption должны следовать не по порядку, а случайным образом (если это конечно возможно)
Post #: 3
RE: Вопрос по Delphi - 2008-06-13 18:25:13.246666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ну это от тебя зависит, что им присваивать.
Post #: 4
RE: Вопрос по Delphi - 2008-06-16 03:42:37.223333   
Xaction

Сообщений: 6
Оценки: 0
Присоединился: 2008-06-15 03:12:02.053333
Юзай циклы и рандомы…
Post #: 5
RE: Вопрос по Delphi - 2008-06-16 04:04:45.873333   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666

quote:

ORIGINAL: Xaction

Юзай циклы и рандомы…

Я посмотрю как ты рандомом будешь делать так, чтобы названия на кнопках не повторялись.
Post #: 6
RE: Вопрос по Delphi - 2008-06-16 16:03:51.030000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
А что там делать-то? Список забиваешь нужными значениями. Рандомом выбираешь любое - потом его удаляешь и т.д., пока список не станет пустым.
Post #: 7
RE: Вопрос по Delphi - 2008-06-16 16:23:24.646666   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
Ну "юзай циклы и рандомы", судя во всему, означают тупо выбор на угад числа из массива и в лучшем случае проверка, нет ли такого среди уже выбранных. Пусть автор меня поправит, если это не так.
Post #: 8
RE: Вопрос по Delphi - 2008-06-16 16:27:56.436666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Генерируем число кидаем его в массив используемых названий , присваиваем кнопочке имя сгенирированное
Post #: 9
RE: Вопрос по Delphi - 2008-06-16 19:12:26.880000   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
И чё дальше? Генерируем новое число и проверяем, есть ли такое? Все названия уже есть - это числа от 1 до 16, что ещё генерировать? Вопрос в том, как это перемешать, чтобы не повторялось. Ответ на этот вопрос уже дал _Saz_. Можно ещё список заменить динамическим масивом - будет медленнее, но с меньшей памятью. Всё это банальные алгоритмы, я не понимаю, откуда берётся столько людей с непонятными идеями.
Post #: 10
RE: Вопрос по Delphi - 2008-06-16 21:02:34.103333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Оттуда, откуда и желающие влупить 16 кнопок на одну форму. Никакого понятия о юзабилити…
Post #: 11
RE: Вопрос по Delphi - 2008-06-17 18:10:33.110000   
~Zavoorchik~

Сообщений: 3
Оценки: 0
Присоединился: 2008-06-05 20:32:08.073333
я все-таки составил процедуру для заполнения массива случайными неповторяющимися числами от 1 до 16. спасибо всем за советы…
 
procedure CreateRandArray();
var
  i, j : integer;
  n : integer;
  f : integer;
begin
  for i := 1 to 16 do // цикл для заполнения массива numbs[1..16], где будут храниться полученные значения
    begin
      repeat
        f := 0; // вспомогательная переменная f
          n := Random(16) + 1; // генерируем случайное значение
            for j := 1 to 16 do // цикл для проверки значений массива…
              if numbs[j] <> n then // если ячейка массива не равна сгенерированному числу…
                f := f + 1; // тогда увеличим значение вспомогательной переменной
      until f = 16; // цикл до тех пор, пока ни одно значение массива не равно сгенерированному чеслу
      numbs := n; // если все нормально, присвоим индексу массива уникальное значение
&nbsp; end;
end;
переменная f увеличивается в течение цикла, если сгенерированное число не совпадает с проверяемым в массиве… если&nbsp;f = 16, то ни одно значение не повторяется, следовательно можно добавить n в массив…
возможно, не вполне удобно, но… я&nbsp;пока только начинающий программист:D
Post #: 12
RE: Вопрос по Delphi - 2008-06-17 22:44:13.573333   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
Мда, индийцы отдыхают… Процедура не скомпилируется, алгоритм - полная чушь, работать не будет. Даже если заставишь работать, то это будет ужасно неэффективно. Тебе сверху написали нормальный алгоритм, тебя чем-то не устраивает или ты чего то не понимаешь в нём? Лучше спроси, чем пиши такую чушь.
Post #: 13
RE: Вопрос по Delphi - 2008-06-18 16:57:10.393333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Паскаля не помню вообще, но что-то типа этого:
procedure CreateRandomizedArray( var a:array of integer; count:integer ); var &nbsp;&nbsp;&nbsp; ta:array[1..count] of integer; &nbsp;&nbsp;&nbsp; i, n, j, left:integer; begin &nbsp;&nbsp;&nbsp; randomize; &nbsp;&nbsp;&nbsp; for i := 1 to count do &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ta[i] := i; &nbsp;&nbsp;&nbsp; left := count; &nbsp; &nbsp;&nbsp;&nbsp; for n := 1 to count do &nbsp; &nbsp;&nbsp;&nbsp; begin &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; i := random( left ) + 1; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; a[n] := ta[i]; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; for j := i to left - 1 do &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ta[j] := ta[j + 1]; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; dec(left); &nbsp;&nbsp;&nbsp; end; end;
Типа того… Не очень быстро, но зато эффективно.
А твой алгоритм - бред полный ;), может он и каким-то чудом работает, но циклы вида repeat until random(m)=n; с логической точки зрения неправильный, т.к. выполнения такого условия можно оооочень долго ждать.
Post #: 14
RE: Вопрос по Delphi - 2008-06-18 17:02:03.340000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
P.S. индусы и правда отдыхают…
Post #: 15
RE: Вопрос по Delphi - 2008-06-18 17:23:23.460000   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
quote:

ORIGINAL: kreol

И чё дальше? Генерируем новое число и проверяем, есть ли такое?


А не проще ли создать циклом упорядоченный массив с числами 1-Х, а потом пройтись по нему другим циклом и на каждой итерации менять местами элемент под счетчиком цикла с рандомным элементом от 1 до X?
Post #: 16
RE: Вопрос по Delphi - 2008-06-18 18:06:44.123333   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
quote:

ORIGINAL: Absurd

А не проще ли создать циклом упорядоченный массив с числами 1-Х, а потом пройтись по нему другим циклом и на каждой итерации менять местами элемент под счетчиком цикла с рандомным элементом от 1 до X?

Как вариант. В общем-то подойдёт любой алгоритм перемешивания массива, хоть хеш-таблицы =)
Post #: 17
RE: Вопрос по Delphi - 2008-06-18 18:09:42.660000   
Yoshka

Сообщений: 19
Оценки: 0
Присоединился: 2008-03-31 17:30:47.400000
Если я тебя правильно понял то тебе что-то типа этого нужно
Post #: 18
RE: Вопрос по Delphi - 2008-06-18 18:14:39.496666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
quote:

ORIGINAL: Absurd
А не проще ли создать циклом упорядоченный массив с числами 1-Х, а потом пройтись по нему другим циклом и на каждой итерации менять местами элемент под счетчиком цикла с рандомным элементом от 1 до X?

проще ;)
Post #: 19
RE: Вопрос по Delphi - 2009-03-10 08:50:45.406666   
jeka5555

Сообщений: 18
Оценки: 0
Присоединился: 2009-03-10 08:43:28.223333
Вот набросал код для требуемой задачи, помоему самый простой и надёжный вариант:

Var x: array [1..16] of integer; i, n, temp:integer; begin for i:=1 to 16 do begin x[i]:=i; end; randomize; for i:=1 to 16 do begin n:=random(16)+1; temp=x[i]; x[i]:=x[n]; x[n]:=temp; end;
Post #: 20
RE: Вопрос по Delphi - 2009-03-10 10:39:01.973333   
NightmareZz

Сообщений: 1087
Оценки: 0
Присоединился: 2006-10-15 11:16:16.833333
Хакеры дружною толпою пишут "пятнашки". Ржунимагу.
Post #: 21
RE: Вопрос по Delphi - 2009-03-10 11:28:56.970000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
quote:

ORIGINAL: jeka5555

Вот набросал код для требуемой задачи, помоему самый простой и надёжный вариант:



Ерунду ты тут написал. Погугли на тему "сортировка массива на паскале".
Post #: 22
RE: Вопрос по Delphi - 2009-03-10 15:18:27.840000   
Login_hochu

Сообщений: 1471
Оценки: 0
Присоединился: 2007-07-15 14:19:23.423333

quote:

ORIGINAL: NightmareZz

Хакеры дружною толпою пишут "пятнашки". Ржунимагу.

Кстати да, пока читал, вспомнил про пятнашки Найтмареза, где то они были выложенны. А он оказывается уже сам вспомнил.
Post #: 23
RE: Вопрос по Delphi - 2009-03-12 07:54:59.233333   
jeka5555

Сообщений: 18
Оценки: 0
Присоединился: 2009-03-10 08:43:28.223333

quote:

ORIGINAL: _SaZ_

quote:

ORIGINAL: jeka5555

Вот набросал код для требуемой задачи, помоему самый простой и надёжный вариант:



Ерунду ты тут написал. Погугли на тему "сортировка массива на паскале".


Почему ерунду:? не принимаю подобные заявления без объяснений.

Код прекрасно работает, сам использовал его для своей задачки: тест из 16 вопросов, где вопросы при каждом запуске перемешивались в случайном порядке как раз при помощи этой процедурки.
Post #: 24
RE: Вопрос по Delphi - 2009-03-12 07:58:23.683333   
jeka5555

Сообщений: 18
Оценки: 0
Присоединился: 2009-03-10 08:43:28.223333

quote:

ORIGINAL: _SaZ_

quote:

ORIGINAL: Absurd
А не проще ли создать циклом упорядоченный массив с числами 1-Х, а потом пройтись по нему другим циклом и на каждой итерации менять местами элемент под счетчиком цикла с рандомным элементом от 1 до X?

проще ;)

Вы, батенька, своим словам противоречите.

ты сам писал, что этом вариант проще. Только в моём случае я создавал не динамический массив, а статический, так как количество вопросов в моём тесте заранее известно. На каждом шаге я просто менял местами элемент массива с другим случайно выбранным.
Post #: 25
RE: Вопрос по Delphi - 2009-03-12 10:59:30.303333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ты мне скажи, какова вероятность того, что рандом вернёт два одинаковых значения? А если больше? Я понимаю, что это очень грамотное и 100%-но рабочее решение полагаться на "авось".
Post #: 26
RE: Вопрос по Delphi - 2009-03-13 08:16:05.130000   
jeka5555

Сообщений: 18
Оценки: 0
Присоединился: 2009-03-10 08:43:28.223333
Что-то я вообще не понимаю логику твоих мыслей, или скорее всего ты не понимаешь код.
Что из того если рандом будет ворачивать два или более одинаковых значения? В этом случае у нас просто элементы поменяются местами обратно. Завтра пришлю программку, может поймёшь.
Post #: 27
RE: Вопрос по Delphi - 2009-03-14 20:52:00.503333   
jeka5555

Сообщений: 18
Оценки: 0
Присоединился: 2009-03-10 08:43:28.223333
Как и обещал программа:
http://www.raduga.uuuq.com/files/array_rand.zip
Можешь скачать и убидиться кто был не прав.
Вот код:
&nbsp;unit Unit1; interface uses &nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, &nbsp; Dialogs, StdCtrls; type &nbsp; TForm1 = class(TForm) &nbsp;&nbsp;&nbsp; Button1: TButton; &nbsp;&nbsp;&nbsp; Label1: TLabel; &nbsp;&nbsp;&nbsp; Button2: TButton; &nbsp;&nbsp;&nbsp; procedure Button1Click(Sender: TObject); &nbsp;&nbsp;&nbsp; procedure Button2Click(Sender: TObject); &nbsp; private &nbsp;&nbsp;&nbsp; { Private declarations } &nbsp; public &nbsp;&nbsp;&nbsp; { Public declarations } &nbsp; end; var &nbsp; Form1: TForm1; &nbsp;mas:array[1..16] of integer; &nbsp;i,a,temp:integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin label1.Caption:=''; for i:=1 to 16 do begin mas[i]:=i; end; for i:=1 to 16 do begin label1.Caption:=label1.Caption+' '+IntToStr(mas[i]); end; end; procedure TForm1.Button2Click(Sender: TObject); begin Label1.Caption:=''; randomize; for i:=1 to 16 do begin a:=random(16)+1; temp:=mas[i]; mas[i]:=mas[a]; mas[a]:=temp; end; for i:=1 to 16 do begin label1.Caption:=label1.Caption+' '+IntToStr(mas[i]); end; end; end
Post #: 28
RE: Вопрос по Delphi - 2009-03-17 13:12:09.220000   
jeka5555

Сообщений: 18
Оценки: 0
Присоединился: 2009-03-10 08:43:28.223333
_SaZ_, смотрел прогу? убедился что ты был неправ?
Post #: 29
RE: Вопрос по Delphi - 2009-03-17 13:33:04.876666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ты мегахацкер, такую супер сложную прогу написал. Очень жаль, что у тебя так и не хватило мозгов понять, что я имел в виду.
Post #: 30
RE: Вопрос по Delphi - 2009-03-17 14:01:34.340000   
SmanxX1

Сообщений: 208
Оценки: 0
Присоединился: 2007-07-31 14:33:56.650000
quote:

Имеются 16 компонентов Button. Как сделать так, чтобы свойство Caption каждой кнопки было равно числу от 1 до 16?

Если кнопки уже на форме, то все элементарно!
Можно сделать так:
var i,btn_num:integer; ... btn_num:=1; for i:=0 to (ComponentCount-1) do if Components[i].ClassType=TButton then begin (Components[i] as TButton).Caption:=IntToStr(btn_num); inc(btn_num); end; В результате все кнопочки получат название от 1го, до _КоличествоКнопокНаФорме_.
Post #: 31
RE: Вопрос по Delphi - 2009-03-17 16:06:18.953333   
jeka5555

Сообщений: 18
Оценки: 0
Присоединился: 2009-03-10 08:43:28.223333

quote:

ORIGINAL: SmanxX1

quote:

Имеются 16 компонентов Button. Как сделать так, чтобы свойство Caption каждой кнопки было равно числу от 1 до 16?

Если кнопки уже на форме, то все элементарно!
Можно сделать так:
var i,btn_num:integer; ... btn_num:=1; for i:=0 to (ComponentCount-1) do if Components[i].ClassType=TButton then begin (Components[i] as TButton).Caption:=IntToStr(btn_num); inc(btn_num); end; В результате все кнопочки получат название от 1го, до _КоличествоКнопокНаФорме_.


Да, толко в этом случае все кнопочки будут иметь название строго по порядку 1,2,3,4,5… и т.д.
Post #: 32
RE: Вопрос по Delphi - 2009-03-17 16:09:27.903333   
jeka5555

Сообщений: 18
Оценки: 0
Присоединился: 2009-03-10 08:43:28.223333
quote:

ORIGINAL: _SaZ_

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


Я и не старался написать супер-мега прогу, и не считаю что чем сложнее код тем ты круче, думаю как раз наобарот. А если я что-то не догнал, так ты объясни, пожалуйста.
Post #: 33
RE: Вопрос по Delphi - 2009-03-17 16:36:04.440000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Уговорил - я был не прав. Затупил =\
Post #: 34
RE: Вопрос по Delphi - 2009-03-17 16:45:47.170000   
jeka5555

Сообщений: 18
Оценки: 0
Присоединился: 2009-03-10 08:43:28.223333

quote:

ORIGINAL: _SaZ_

Уговорил - я был не прав. Затупил =\

Бывает! главное то что ты в этом признался.
[sm=az.gif] Мир!
Post #: 35
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Вопрос по Delphi







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.