Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 655

/ вопрос открыт /

Здравствуйте, эксперты!
Здравствуйте! Пишу программу тестирования. Есть форма на ней одна кнопка Ответить , TWebBrowser для вывода вопросов из БД и радиокнопки для выбора ответов. На обработчик события нажатия кнопки Ответить я кидаю процедуру QuestGEN (n:integer); - процедура выборки случайного номера вопроса, где n - всего (кол-во) вопросов. Массив куда я сохраняю значения описан внешне .... я его "обнуляю" каждый раз при ShowForm и DestroyForm , т.е заполняю значениями "-1". Ниже привел пример процедуры которую пишу но она почему-то неправильно работает ...помогите пожалуйста исправить или подскажите как лучше с алгоритмом выборки.

Приложение:
  1. var
  2. QMass : array [1..100] of integer;
  3.  
  4. ...............
  5.  
  6. procedure TTestForm.QuestGen(N:integer);
  7. var
  8. i,j,qnum : integer;
  9. fnd:boolean;
  10. begin
  11. fnd:=FALSE;
  12. Randomize;
  13.  
  14. showmessage(IntToStr(qnum));
  15. for i:=1 to QCOUNT do
  16. begin
  17. if QMass[i] = qnum
  18. then fnd:=TRUE
  19. else fnd:=FALSE;
  20. end;
  21.  
  22.  
  23. else QMass[i]:=qnum;
  24.  
  25. end;
  26.  
  27.  
  28. ///////////////////////////////////////////
  29. procedure TTestForm.FormShow(Sender: TObject);
  30. var
  31. i:integer;
  32. begin
  33.  
  34.  
  35.  
  36. for i:=1 to 100 do
  37. begin
  38.  
  39. end;
  40.  
  41. end;
  42.  
  43.  
  44.  
  45. procedure TTestForm.FormDestroy(Sender: TObject);
  46. var
  47. i:integer;
  48. begin
  49.  
  50.  
  51.  
  52.  
  53. for i:=1 to 100 do
  54. begin
  55.  
  56. end;
  57. end;


Motor Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Motor (статус: Посетитель)
Вопрос отправлен: 17 апреля 2009, 21:29
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Мережников Андрей

Здравствуйте, Motor!
Уберите randomize из процедуры. Эта функция должна вызываться только один раз. Поставьте ее вызов, например, в FormShow

Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 18 апреля 2009, 06:43
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 19 апреля 2009, 04:23; участников в обсуждении: 3.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 18 апреля 2009, 06:48 [#1]:

Да, еще. в дополнение к ответу перепишите цикл поиска совпадений следующим образом:
i:=1;
while(i<=QCount)and not(fnd)
do if (Qmass[i]=qnum)
then fnd:=true
else inc(i);
Motor

Motor (статус: Посетитель), 18 апреля 2009, 07:32 [#2]:

Большое Вам человеческое СПАСИБО !!!! Буду тестить :)))
Motor

Motor (статус: Посетитель), 18 апреля 2009, 08:13 [#3]:

всеравно что-то неправильно отрабатывает ...поставил randomize; в событие FormShow...далее изменил процедуру как вы и сказали :

procedure TTestForm.QuestGen(N:integer);
var
i,j,qnum : integer;
fnd:boolean;
begin
fnd:=FALSE;
qnum:=Random(N)+1; // выбираем случайным образом вопрос
showmessage(IntToStr(qnum));
i:=1;
while(i<=QCount)and not(fnd) do
if (Qmass[i]=qnum)
then fnd:=true
else inc(i);

if fnd then Showmessage('УЖО БЫЛ')
else QMass[i]:=qnum;

end;


может массив описан не правильно ? вроде как надо, внешне в данном Unit-e , как var QMass : array [1..100] of integer;

может проблема в том что я использую конструкцию в событиях FormShow и Formdestroy ? :

for i:=1 to 100 do
begin
QMass[i]:=-1; // очищаем массив под выборку
end;
Motor

Motor (статус: Посетитель), 18 апреля 2009, 08:46 [#4]:

procedure TTestForm.QuestGen(N:integer);
var
i,j,qnum : integer;
fnd:boolean;
begin
fnd:=FALSE;
qnum:=Random(N)+1; // выбираем случайным образом вопрос
showmessage(IntToStr(qnum));
i:=1;
while(i<=QCount)and not(fnd) do
if (Qmass[i]=qnum)
then fnd:=true
else inc(i); QMass[qnum]:=qnum;
if fnd then Showmessage('УЖО БЫЛ');

end;

переписал вроде работает .....тока непойму как массив заполняется?:( ...и еще не пойму как дописать фишку, если все N вопросы исчерпаны то закрыть окно ...или остановить цикл .....???
Вадим К

Вадим К (статус: Академик), 18 апреля 2009, 11:53 [#5]:

По поводу Randomize.
Он должен вызываться всего один раз в программе. Больше его вызывать не стоит, от этого "случайность" не улучшиться ни на йоту. А в некоторых реализациях (для других языков, но не для делфи) постоянный вызов может привести к том, что значения генератора будет одно и тоже.
Почему же random выдает одну и туже последовательность при каждом запуске программы? Это не ошибка и не бага, а специально сделанная функциональность для упрощения отладки. Представьте во что превратилась отладка, если random выдавал каждый раз новые числа. Отладка должна быть детерментированной, то есть определенной.
Галочка "подтверждения прочтения" - вселенское зло.
Motor

Motor (статус: Посетитель), 19 апреля 2009, 04:23 [#6]:

СПАСИБО !

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 сентября 2020, 07:38
Выполнено за 0.02 сек.
Рейтинг@Mail.ru