Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2014, 17:04   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию Рандомный вывод вопросов в тесте

Здравствуйте, наверное видели мою программу создатель тестов, дак вот, возникла необходимость перемешки вопросов.

структура данных такая:

количество вопросов (цифра)
сам вопрос
варианты ответов (количество)
правильный ответ (номер)
вариант ответа 1
вариант ответа 2
...

Пример

2
Вопрос 1
3
1
1
2
3
Вопрос 2
4
2
1
2
3
4

Тест хранится в такой структуре в текстовом файле, есть идея записать в Tstringlist, то есть все вопросы записаны в массив строк, перемешиваются, потом этот вопрос записывается в новый список, и исходя из вопроса уже к нему переписываются и сами варианты ответа, а так же порядковые номера, идея муторная, есть другие, исходяиз структуры файла?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 27.05.2014, 17:07   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

это вы за такое время только к такому формату и додумались?

кидайте программирование
eval вне форума Ответить с цитированием
Старый 27.05.2014, 18:00   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

В общем спрошу проще: есть динамический одномерный массив со строками, как его перемешать? Код теста позже выложу
from dark to light)

Последний раз редактировалось Алексей_2012; 27.05.2014 в 18:08.
Алексей_2012 вне форума Ответить с цитированием
Старый 27.05.2014, 20:46   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

смотрите код правильного перемешивания - ТЫЦ
(там и пруфлинк есть, если что)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.05.2014, 21:11   #5
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Код:
var
  a: array of string;
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(a, 5);
  a[0] := 'Вопрос 1';
  a[1] := 'Вопрос 2';
  a[2] := 'Вопрос 3';
  a[3] := 'Вопрос 4';
  a[4] := 'Вопрос 5';


end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  a := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i, j, k: integer;
  b: array of integer;
  c: array of string;
begin
  SetLength(b, Length(A));
  SetLength(c, Length(a));
  k := 0;
  Memo1.clear;
  for i := 0 to Length(a) - 1 do
  begin
    c[i] := a[i];
    Memo1.Lines.Add(c[i]);
  end;
   for i := Length(a) - 1 downto 0 do
  begin
    Randomize;
    b[k] := Random(i);
    inc(k);
  end;
  Memo1.Lines.Add('');
  Memo1.Lines.Add('');
  for i := 0 to Length(a) - 1 do
  begin
    a[i] := c[b[i]];
    Memo1.Lines.Add(a[i]);
  end;

  b := nil;
  c := nil;
end;
ну вот что сам попробовал, не очень получилось, совсем не работает и элементы строк вдобавок заменяют.
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 27.05.2014, 22:42   #6
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

ребят, вот поменял значения, циклится на выводе перетасованного массива, голова уже кипит
Код:
var
  a: array of string;
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(a, 5);
   a[0] := 'Вопрос 1';
  a[1] := 'Вопрос 2';
  a[2] := 'Вопрос 3';
  a[3] := 'Вопрос 4';
  a[4] := 'Вопрос 5';


end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  a := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i, j, k: integer;
  b: array of integer;
  c: array of string;
begin
  SetLength(b, Length(A));
  SetLength(c, Length(a));
  k := 0;
  Memo1.clear;
  for i := 0 to Length(a) - 1 do
  begin
    c[i] := a[i];
    Memo1.Lines.Add(c[i]);
  end;
   for i := Length(a) - 1 downto 0 do
  begin
    Randomize;
      b[k] := Random(i);
    if (k>0) and (b[k]=b[k-1])  then
    while b[k]=b[k-1] do  b[k] := Random(i);
    inc(k);
  end;
  Memo1.Lines.Add('');
  Memo1.Lines.Add('');
  for i := 0 to Length(a) - 1 do
  begin
    a[i] := c[b[i]];
    Memo1.Lines.Add(a[i]);
  end;

  b := nil;
  c := nil;
end;
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 27.05.2014, 23:10   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

возьмите работающий код ОТСЮДА

оффтоп...
Назовите хотя бы одну вменяемую причину, по которой Вы не хотите взять простой и работающий алгоритм (по ссылке) и пытаетесь приделать колёса к табуретке в надежде получить велосипед?

Последний раз редактировалось Serge_Bliznykov; 27.05.2014 в 23:15.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.05.2014, 23:20   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

если бы автор хронил данные в номальном виде, то и не пришлось бы совсем заморачиваться с табуретками, но он нормальный герой, надо еще месяц повозюкаться чтобы потом выкинуть, со спокойной душой, все что на ваяет
eval вне форума Ответить с цитированием
Старый 28.05.2014, 00:30   #9
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Serge_Bliznykov Видемо суть кода не дошла человека. Нужно объяснять на пальцах. Создаём цикл (это такая штука, с элементами for to do) от первого до последнего элемента массива (массив, это штука, которая была упомянута во втором посте). Внутри цикла получаем рандом от размера массива
Код:
Random(Length(array) - 1)
Меняем местами элемент по индексу цикла с элементом по числу из рандома. Для этого помещаем один элемент в буфер, перезаписываем первый элемент вторым элементом, а второй элемент перезаписываем элементом из буфера... Всё. Гениально сложно, не правда ли???
P.S. Ах да. Забыл ещё более простой вариант решения, если предыдущий окажется чересчур сложным. Создаём ещё один StringList, и в цикле, пока Count > 0 (While List.Count > 0) получаем рандомно строку, записываем её в новый StringList, и удаляем её из старого листа.

Последний раз редактировалось doktor255; 28.05.2014 в 00:35.
doktor255 вне форума Ответить с цитированием
Старый 28.05.2014, 00:51   #10
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Цитата:
но он нормальный герой, надо еще месяц повозюкаться чтобы потом выкинуть, со спокойной душой, все что на ваяет
и все-таки он готов! Рандомизация выполнена на ура, и вопросы перемешиваются и выводятся так, как перемешались)))))
Вложения
Тип файла: zip text_one.zip (420.1 Кб, 92 просмотров)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рандомный вывод изображений PSWDU JavaScript, Ajax 1 24.09.2013 03:15
Рандомный вывод картинок siryugad Microsoft Office Excel 4 17.06.2013 21:24
Рандомный вывод (цикл/условие/количество) Predator199 PHP 4 27.11.2012 17:58
Рандомный вывод ответа в классе _Bald_ Общие вопросы C/C++ 1 29.05.2010 20:31
Рандомный вывод Forrest Gamp Общие вопросы C/C++ 6 10.02.2008 15:03