Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
1

Рандом с появлением групбоксов, рандом с расположением ответов в программе тестирования

12.04.2015, 18:06. Показов 2545. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дали задание сделать тест с рандом выдачей вопросов(групбокс) и рандом расположения ответов(радиобаттон), вопросы будут находится в самой программе. Сделать рандом в выдаче вопросов не тяжело хоть и множество вариантов, вот с расположением попозже справлюсь, но вот главная проблема если вопрос уже попадался и на него был дан ответ, то надо что б этот вопрос больше не повторялся.
Подскажите, натолкните, объясните если не трудно, по форуму рыскал но что не нашел (возможно плохо искал)
Есть код моей не первой попытки, в этот раз все выло но это очень долго, и это только с тремя gгрупбоксами.
Не сильно ругайтесь за примитивный код.
Заранее благодарю.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
randomize;
a:=false;
b:=false;
c:=false;
if (radiobutton1.Checked or radiobutton2.Checked) then a:=true;
if (radiobutton3.Checked or radiobutton4.Checked) then b:=true;
if (radiobutton5.Checked or radiobutton6.Checked) then c:=true;
if ((a=true) and (b=true) and (c=true)) then begin
showmessage('все ответы даны');
exit end else begin
if ((a=false) and (b=false) and (c=false)) then begin
i:=random(3) end else
if ((a=true) and (b=false) and (c=false)) then begin
i:=random(2)+1 end else
if ((a=false) and (b=true) and (c=false)) then begin
i:=2 end else
if ((a=false) and (b=false) and (c=true)) then begin
i:=random(2) end else
if ((a=true) and (b=true) and (c=false)) then begin
i:=3 end else
if ((a=false) and (b=true) and (c=true)) then begin
i:=random(1) end else
if ((a=true) and (b=false) and (c=true)) then begin
i:=1 end;
edit1.text:=Memo1.lines[i];
if edit1.text=memo1.Lines[0]
then begin
groupbox1.Visible:=true;
groupbox2.Visible:=false;
groupbox3.Visible:=false end;
begin
if edit1.text=memo1.Lines[1]
then begin
groupbox2.Visible:=true;
groupbox1.Visible:=false;
groupbox3.Visible:=false end;
begin
if edit1.text=memo1.Lines[2]
then begin
groupbox1.Visible:=false;
groupbox2.Visible:=false;
groupbox3.Visible:=true end;
end; end; end; end;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2015, 18:06
Ответы с готовыми решениями:

Задать случайный порядок вопросов в программе тестирования с помощью функции рандом
привет! как задать случайный порядок вопросов в программе тестирования с помощью функции рандом на...

Рандом в пайтон (аппаратный рандом для генерации паролей)
суть такова есть такой скрипт на питоне wavBuf = dwParam1.contents if...

VBScript-овский рандом совсем не рандом
Не знаю, может я ошибаюсь, но по-моему VBScript-овский рандом совсем не рандом, т.е., генерит он...

Не понятный рандом в программе
Здравствуйте. Я сам придумываю себе практические занятия дабы закрепить материал с книги. Так вот...

8
602 / 550 / 210
Регистрация: 24.01.2012
Сообщений: 1,352
14.04.2015, 15:18 2
Лучший ответ Сообщение было отмечено FromOutSide как решение

Решение

где-то в описании глобальных переменных
Delphi
1
2
 //описываем множество, для определения вопросов, какие уже задавались
var a:set of byte;
дальше в коде для выбора случайного вопроса
Delphi
1
2
3
4
5
6
7
8
  repeat
//генерируем номер вопроса
    b:random(10);
//если он уже задавался - переходим на начало цикла
  until not (b in a);
//включаем номер вопроса в множество, чтобы больше не задавать
  include(a,b);
//все. вопрос номер b еще не задавался и его можно задать
Добавлено через 2 минуты
И зачем нужны groupbox`ы? Неужели в задании так сказали?
1
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
16.04.2015, 14:11  [ТС] 3
Цитата Сообщение от edukra Посмотреть сообщение
И зачем нужны groupbox`ы? Неужели в задании так сказали?
такова ее прихоть)
0
843 / 738 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
16.04.2015, 14:26 4
Цитата Сообщение от FromOutSide Посмотреть сообщение
вот главная проблема если вопрос уже попадался и на него был дан ответ, то надо что б этот вопрос больше не повторялся
Брать можно номер вопроса можно из массива, где он заполнен неповторяющимися числами.
0
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
16.04.2015, 14:34  [ТС] 5
Цитата Сообщение от edukra Посмотреть сообщение
repeat
//генерируем номер вопроса
* * b:random(10);
//если он уже задавался - переходим на начало цикла
* until not (b in a);
//включаем номер вопроса в множество, чтобы больше не задавать
* include(a,b);
//все. вопрос номер b еще не задавался и его можно задать
если прокликать по этой кнопке отвечая и не отвечая на вопросы то во концовке прога засыпает.

Добавлено через 1 минуту
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
Брать можно номер вопроса можно из массива, где он заполнен неповторяющимися числами.
можете пример привести? сам что то недопонимаю, почти не понимаю динамическую память.
0
843 / 738 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
16.04.2015, 15:00 6
Цитата Сообщение от FromOutSide Посмотреть сообщение
можете пример привести? сам что то недопонимаю
Держи в коде расписал пример как это работает, числа что будеш получать (выделил красным) от 0 до 10 ни когда не повторятся!

Хоть тысячу раз код запустиш, ни одного повторения числа или что там хотел, номера вопроса не получиш!
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var
  Form1: TForm1;
  mas: array[0..10] of Integer;
  n, i, velm: Integer; //счетчик, временный элемент, цикл
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  //заполним массив упорядоченно
  for i := 0 to 10 do
    mas[i] := i;
 
  n := 10; //для последнего числа в массиве
  velm := 10; //для выпавшего элемента (случайного числа)
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  velm := Random(n);
  ListBox1.Items.Add('рандом число = ' + IntToStr(velm) + ', число в этом элементе = ' + IntToStr(mas[velm]));
 
  //теперь в этом же элементе массива лежит число из последнего элемента массива
  mas[velm] := mas[n];
  velm := velm - 1;
  n := n - 1;
end;
Миниатюры
Рандом с появлением групбоксов, рандом с расположением ответов в программе тестирования  
1
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
17.04.2015, 11:48  [ТС] 7
NIKOLAYY, а как мне применить это все с групбоксами? Плюс если нажать больше раз чем число в массиве то выдаст ошибку
Delphi
1
[Warning] Unit1.pas(34): For loop control variable must be simple local variable
0
843 / 738 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
17.04.2015, 12:30 8
Цитата Сообщение от FromOutSide Посмотреть сообщение
если нажать больше раз чем число в массиве то выдаст ошибку
Конечно так и должно быть, массив кончился- кончились и числа.
Если можно было бы нажимать еще то тебе выдавало бы числа повторы!
Просто поставь счетчик и как только последний вопрос будет задан, блокируй кнопку от нажимания и пиши все вопросы исчерпаны.
0
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
18.04.2015, 13:05  [ТС] 9
Всем спасибо, я выбрал один из ответов и решил его использовать.

Добавлено через 4 часа 56 минут
ну вот вроде более-менее.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var
  Form1: TForm1;
   r:set of byte;
  qw:integer=0;
 
implementation
 
procedure TForm1.Button4Click(Sender: TObject);
var
v:integer;
begin
if button4.caption='Завершить'
 then begin showmessage('') end else begin
button4.caption:='Продолжить';
if button4.caption='Продолжить' then begin
button4.enabled:=false;
randomize;
repeat
v:=random(6);
edit1.text:=memo1.lines[v];
  until not (v in r);
  include(r,v);
 if v=0 then qw:=qw+1;
  if v=1 then qw:=qw+1;
   if v=2 then qw:=qw+1;
    if v=3 then qw:=qw+1;
     if v=4 then qw:=qw+1;
      if v=5 then qw:=qw+1;
       if qw=6 then button4.Caption:='Завершить';
  end; end; end;
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
groupbox1.Visible:=edit1.text=memo1.Lines[0];
groupbox2.Visible:=edit1.text=memo1.Lines[1];
groupbox3.Visible:=edit1.text=memo1.Lines[2];
groupbox4.Visible:=edit1.text=memo1.Lines[3];
groupbox5.Visible:=edit1.text=memo1.Lines[4];
groupbox6.Visible:=edit1.text=memo1.Lines[5];
end;
0
18.04.2015, 13:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2015, 13:05
Помогаю со студенческими работами здесь

Подсчет ответов в программе тестирования
У меня дана задача в Турбо паскале.Надо сделать тест из обычного бумажного вида в электронном.дано...

Рандом совсем не рандом
Здравствуйте,столкнулся с проблемой,что при создании рандомных координат,для вывода на экран...

Чтение ответов из файла в программе тестирования
Делаю универсальную программу тестирования. В начале загружается файл теста. В нем вопросы,...

Вывести количество правильных ответов в программе тестирования
Составить контролирующую программу по предмету, работующего следующим образом: - выводится верное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru