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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.01.2010, 23:03
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
Вопрос Рандом и защита от повторений

Добрый вечер, товарищи программисты.
Пишу программулину, включающую в себя небольшое тестирование. Тесты находятся в бд. Заступорился на защите от запоминания - рандомная загрузка вопросов и , соответственно, вопросов к ним.
Код:
for i:=1 to 4 do begin
radiobutton1.caption:=table1.fields[random(i)].asstring;
radiobutton2.caption:=table1.fields[random(i)].asstring;
radiobutton3.caption:=table1.fields[random(i)].asstring;
radiobutton4.caption:=table1.fields[random(i)].asstring;
end;
Проблема:
Видимо то ли цикл работает не правильно, то ли ему здесь вообще не место, т.к. часто вижу значения нулевого поля (fields[0]), которым здесь не место. Как это исправить?
Вопрос:
Как написать защиту от повторений? Т.к. сейчас постоянно встречаются несколько значений одного поля.

Заранее благодарен, с ув. Лунтик-Некрофил.
__________________
Алкоголик-аморал, явная угроза обществу
Блин, я уже местный, а все равно нифига не знаю...
Ответить с цитированием
  #2  
Старый 14.01.2010, 23:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. random(i)+1 спасет от вывода поля с индексом 0.
2. Да ты вообще непонятно что делаешь Fields - это список полей одной записи. А у тебя каждый вопрос д.б. отельной записью. Фактически, тебе надо бы получить весь список вопросов, а потом генерить их номера для вывода и запоминать уникальный идентификатор вопроса, что бы проверить на то, что он повторяется.

Или я чего-то не понимаю и тебе надо вывести ВСЕ вопросы, но к ним ОТВЕТЫ в случайном порядке?
Ответить с цитированием
  #3  
Старый 14.01.2010, 23:44
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

1. Не помогло особо, просто немного переделал саму бд.
2. Видимо я чего-то не понимаю... Бд написанна примитивная.
Код:
Правильный|Неправильный1|Неправильный2|Неправильный3|Вопрос
В общем надо , чтобы при каждом запуске проги рандомно загружались вопросы и ответы к ним, но чтобы не было повторений.
По идее надо просто написать запоминалку( отдельно для вопросов и отдельно для ответов) , куда заносить каждый уже загруженный элемент, и при загрузке проверять - если он уже есть в ней, то его не загружаем... Но вопрос как её создать)
Если сможешь хоть образно описать (желательнее написать ) - рад буду)
__________________
Алкоголик-аморал, явная угроза обществу
Блин, я уже местный, а все равно нифига не знаю...
Ответить с цитированием
  #4  
Старый 15.01.2010, 18:57
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

Ни у кого нет никаких предложений/догадок?=(
__________________
Алкоголик-аморал, явная угроза обществу
Блин, я уже местный, а все равно нифига не знаю...
Ответить с цитированием
  #5  
Старый 16.01.2010, 07:35
Serga Serga вне форума
Прохожий
 
Регистрация: 28.01.2008
Сообщения: 28
Репутация: 10
По умолчанию Рандом и защита от повторений

Сколь я понял, надо чтоб при старте вопросника случайным образом выбирался вопрос, а ответы к нему в случайном порядке "вешались" на radiobutton'ы (навроде шоб не запоминали "координаты" ответа) и далее в том же духе;

Вот к примеру такое решение:

Выгрузить список вопросов в, скажем, TStringList

Рандомным образом отсортировать и задавать их по порядку;
или
Рандомно выбираем вопрос и после ответа удаляем его из списка;

Определяем радиобуттоны:
Выгружаем в TStringList ответы, рандомно сортируем и по порядку назначаем радиобуттонаМ.
Ответить с цитированием
  #6  
Старый 16.01.2010, 14:08
malekskv malekskv вне форума
Прохожий
 
Регистрация: 13.11.2009
Сообщения: 44
Репутация: 14
По умолчанию Рандом

Вот тесты где все делается так как тебе нужно (даже больше, только без бд) вот описание:

1) в начале теста вводим имя\фамилию и под конец теста сохраняем файл под названием *имя* *фамилия*.test
2) Выбор формы прохождения теста (учение или контроль;
При форме учение при нажатии на ответ пишется сразу правильный этот ответ или нет, при контроле выбираем ответ и отвечаем.)
3) Средний и сложный уровень теста (средний 12 вопросов, 5 минут на прохождение, максимум 10 баллов; Сложный 18 вопросов, 8 минут на прохождение, максимум 12 баллов.)
4) Выведение вопросов и вариантов ответов в случайном порядке(вопросы и ответы вбиваются в memo, может быть вписано абсолютно любое число вопросов, из них будет выбираться случайным образом количество вопросов зависимое от уровня теста)
5) Время на прохождение (при окончании времени выводит результаты теста сколько успели..)
6) При завершении теста выводит оценку и список вопросов на который были данные неверные ответы для контроля.
7) Опять же повторюсь сохраняет файл под именем *имя* *фамилия*.test с зашифрированой информацией в папку с екзешником.
В файл сохраняется Имя и Фамилии тестера. оценка. Сложность.
8) В начале теста можно открыть и просмотреть результаты тестов из файлов *.test (идет дешифрация).
9) Автосайзинг (без разницы какое разрешение монитора хоть 800*600, хоть 2048 на 1536, все елементы теста будут стоять на своих местах пропорционально.);


Если хочешь могу продать за умеренную цену.. стучи в аську: 485766405
Вложения
Тип файла: rar Tester.rar (10.5 Кбайт, 139 просмотров)

Последний раз редактировалось malekskv, 16.01.2010 в 14:14.
Ответить с цитированием
  #7  
Старый 16.01.2010, 17:21
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

Serga
Слишком много получится... Тем более, что у меня бд... Как вариант можно перемешивать при каждом запуске проги в бд значения... Но к сожалению я хз как это сделать=(

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

Я прошу дать для начала мне хотя бы смутное представление, а вопросы будут потом...
__________________
Алкоголик-аморал, явная угроза обществу
Блин, я уже местный, а все равно нифига не знаю...
Ответить с цитированием
  #8  
Старый 16.01.2010, 18:22
malekskv malekskv вне форума
Прохожий
 
Регистрация: 13.11.2009
Сообщения: 44
Репутация: 14
По умолчанию

Представление.. делай массив, заполняй его от 1 до *количества вопросов*. Потом перемешивай елементы масивва. Получится массив с рандомными не повторяющимися числами. И потом уже думай как делать дальше.
Ответить с цитированием
  #9  
Старый 16.01.2010, 20:56
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

Гггг. Не повериш, я уже 2й день пытаюсь узнать как же мне их перемешать , чтоб получился "массив с рандомными не повторяющимися числами", никто ничего толкового не посоветовал)
__________________
Алкоголик-аморал, явная угроза обществу
Блин, я уже местный, а все равно нифига не знаю...
Ответить с цитированием
  #10  
Старый 16.01.2010, 22:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Вот ведь. Ну вот вам рабочий пример:
Код:
program Project37;

{$APPTYPE CONSOLE}
Const
  ArrSize = 20;

Var
  A: Array of Integer;
  i,Val: Integer;
  NewSearch: Boolean;
begin
 Randomize;
 SetLength(A, 0);
 while Length(A) < ArrSize
 do begin
    Val := Random(ArrSize);
    NewSearch := False;
    for i := 0 to High(A)
    do if A[i] = Val
       then begin
            NewSearch := True;
            Break;
            end;
    if NewSearch then Continue;
    SetLength(A,Length(A)+1);
    A[High(A)] := Val;
    end;
  for i := 0 to High(A)
  do WriteLn(A[i]);
  ReadLn;
end.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 16.01.2010, 23:01
malekskv malekskv вне форума
Прохожий
 
Регистрация: 13.11.2009
Сообщения: 44
Репутация: 14
По умолчанию

http://www.delphisources.ru/forum/sh...ad.php?t=10634 посмотри там.. я написал.
Страдалецъ: Чем ваш код лучше или хуже чем мой? (в теме по ссылке). Просто интерестно.
Ответить с цитированием
  #12  
Старый 16.01.2010, 23:06
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

malekskv, что за что вообще отвечает ? зачем нужен этот круговорот
Код:
Shuffle:=a[R1];
a[R1]:=a[R2];
a[R2]:=Shuffle;
и что предполагается с ним дальше делать? Извиняюсь конечно, но на ночь глядя туго соображать.
__________________
Алкоголик-аморал, явная угроза обществу
Блин, я уже местный, а все равно нифига не знаю...
Ответить с цитированием
  #13  
Старый 16.01.2010, 23:09
malekskv malekskv вне форума
Прохожий
 
Регистрация: 13.11.2009
Сообщения: 44
Репутация: 14
По умолчанию

Цитата:
Сообщение от Лунтик-Некрофил
malekskv, что за что вообще отвечает ? зачем нужен этот круговорот
Код:
Shuffle:=a[R1];
a[R1]:=a[R2];
a[R2]:=Shuffle;
и что предполагается с ним дальше делать? Извиняюсь конечно, но на ночь глядя туго соображать.

[code]
Uses ..., Math;
...
var a:array[1..5] of integer; //Создаем массив целых чисел
Shuffle,N,M:Integer; // переменные которые нам понадобятся поже

begin
Randomize; //запускаем функцию рандомиз
for i:=1 to 5 do begin // цикл повторяется 5 рас
a[i]:=i; //присваиваем первому єлементу массива номер цикла.
end;
for i:=1 to 5 do begin //цикл повторяется 5 рас
N:=RandomRange(1,6); // Числу n присваиваем случайное значение из диапазона 1-5
M:=RandomRange(1,6); // Числу m присваиваем случайное значение из диапазона 1-5
Shuffle:=a[n]; // Присваиваем переменной Shuffle Значение N элемента массива а.
a[n]:=a[m]; // Присваиваем N єлементу массива а значение M элемента массива а.
a[m]:=Shuffle; // Присваиваем M єлементу массива а значение переменной Shuffle.
end;
//С помощью єтих 2 циклов ми создали массив a[1,2,3,4,5] и случайный образом потом перемешали его элементы.
end;
[code]


нужно было сразу такой код давать... )
Ответить с цитированием
  #14  
Старый 16.01.2010, 23:18
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

Страдалец, большое спасибо, разобрался.

malekskv,
Код:
нужно было сразу такой код давать... )
- ты конечно капитан очевидность, но достаточно было написать что работа дальше будет идти с массивом а. Тебе тоже большое спасибо, скорее всего буду использовать твой пример в виду небольшого размера.
__________________
Алкоголик-аморал, явная угроза обществу
Блин, я уже местный, а все равно нифига не знаю...
Ответить с цитированием
  #15  
Старый 16.01.2010, 23:22
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
http://www.delphisources.ru/forum/sh...ad.php?t=10634 посмотри там.. я написал.
Страдалецъ: Чем ваш код лучше или хуже чем мой? (в теме по ссылке). Просто интерестно.
Он явно лучше т.к. короче. Но я хоть убей не врубаюсь как он работает.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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