14:28

ДЕЛФИ

Маша
Господа, никто в Делфи, случаем, не шарит..хотя бы на средненьком уровне.

Нужно программно реализовать тест, представляющий собой позиционную игру "ученик-тестирующий". Чтобы при ответе на вопросы теста (5 штук) ученику ставилась оценка. А оценка формируется благодаря вектору выигрышей (его составить самостоятельно можно). Если кто что-то в этом понимает-пишите. Более детально расскажу и покажу примерную программу.

Комментарии
19.11.2005 в 14:42

всё иллюзия
50$
19.11.2005 в 18:56

Маша
Оранжевый Удав, 50 это много:)))
19.11.2005 в 22:40

Fire in a hole!
neZvezda подробности в студию.
19.11.2005 в 22:43

всё иллюзия
neZvezda ага , много :shuffle:
20.11.2005 в 01:55

Маша
Neiru, завтра напишу поподробнее все.
20.11.2005 в 13:23

Маша
Интересует вектор выигрышей. Он должен заполняться автоматически. Т.к. в тесте 5 вопросов и это 9 уровней бинарного дерева. Т.е. 2^9=512 вариантов завершения теста.

Все вручную заполнять-глупо. Надо сделать так, чтобы эти 512 вариантов заполнились каким-то количеством баллов, по которым впоследствии можно будет оценить ученика.



Т.е. если он на все 5 вопросов ответил правильно, и тест в своих 4х ходах повысил сложность, то у ученика должно быть максимальное кол-во баллов. И наоборот, если ученик не ответил ни на один вопрос, и тест в своих 4х ходах понижал сложность вопроса, то ученик получет минимальное количествоа баллов.

А вот остальные вектора выигрышей надо как-то заполнить автоматически, исходя из того, на сколько вопросов ученик ответил правильно, и у скольки вопросов тест повышал или понижал сложность.
20.11.2005 в 13:24

Маша
Вопрос с тестом.



Пусть переговоры закончатся в N=5 тура.

И пусть каждая из сторон в каждом туре имеет только две альтернативы, два варианта выдвигаемого предложения.

Ученик имеет-"верно" и "неверно" ответить. ТЕСТ имеет "повысить сложность" и "понизить сложность"



Далее переговоры ведутся так. Первая сторона (ученик) отвечает на вопрос ("верно" или "неверно").

В ответ вторая сторона (ТЕСТ), рассмотрев это предложение, высказывает своё предложение ("повысить сложность" или "понизить").

После этого первая сторона, зная уже две составляющие ситуации (своё первое предложение и ответ контрагента), высказывает новое предложение (третье число 1 или 2). И т.д. до 5 шага.

Бинарное дерево если нарисовать, то у меня возникает вопрос:

если ученик ответил неправильно, то у ТЕСТА 2 альтернативы "повысить" или "понизить". Тогда ТЕСТУ всегда предлагать "понизить"? А повысить тогда не рассматривать? Или даже при неверном ответе ТЕСТ может "повышать сложность" Т.к. по логике, если человек отвечает неправильно, то уровень сложности понижается. Но тут может быть 2 варианта действия теста. Так вот как это запрограммировать? Каков алгоритм?
20.11.2005 в 13:28

Маша
вот у меня есть текст чем-то похожей программки. ТОлько ее код. Внешнего оформления нету.



unit Pozigr1;



interface



uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,

Forms, Dialogs, Grids, StdCtrls, Spin;



type

TForm1 = class(TForm)

Label1: TLabel;

Button1: TButton;

SpinEdit1: TSpinEdit;

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

Label2: TLabel;

Label3: TLabel;

CheckBox1: TCheckBox;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure SpinEdit1Change(Sender: TObject);

procedure CheckBox1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



const

Nmax = 5;



type

Matr = array [ 1..32{2^5},1..16{2^(5-1)} ] of real;

Vekt = array [ 1..32 ] of real;



var

Form1: TForm1;

M : Matr;

W : Vekt;

N,D1,D2 : integer;



implementation



function DvaVStepeni ( n : integer ) : integer;

begin

DvaVStepeni:=1 shl n;

end;



function Bit ( x{число} : integer; n{номер от конца} : integer ) : integer;

var b : integer;

begin

b:=1 shl (n-1);

Bit:=0;

if (x and b)<>0 then Bit:=1;

end;



function Vektor ( x,n : integer ) : string;

var i : integer; s : string;

begin

s:='( ';

for i:=1 to n do begin

if Bit(x,n-i+1)=0

then s:=s+'1, '

else s:=s+'2, ';

end;

s[length(s)-1]:=' ';

s[length(s)]:=')';

Vektor:=s;

end;



function Nomer ( n1,n2,n : integer ) : integer;

var i,k,rez : integer;

begin

k:=Bit(n1,n);

rez:=k shl (n-1);

for i:=n-1 downto 1 do begin

if (i and 1)=0

then begin {ход второго по n2}

k:=Bit(n2 shl k,i);

rez:=rez or (k shl (i-1));

end

else begin {ход первого по n1}

k:=Bit(n1 shl k,i+1);

rez:=rez or (k shl (i-1));

end;

end;

Nomer:=rez;

end;



{$R *.DFM}



procedure TForm1.FormCreate(Sender: TObject);

begin

Randomize;

StringGrid1.Cells[0,0]:='Выигрыш в партии:';

StringGrid1.Cells[1,0]:='Составляет:';

StringGrid2.ColWidths[0]:=100;

SpinEdit1.Value:=3;

SpinEdit1.MaxValue:=Nmax;

end;



procedure TForm1.Button1Click(Sender: TObject);

var i,k,maxmin,minmax : integer;

min,max : Vekt;

begin

for i:=1 to D1 do begin

W[i]:=StrToFloat(StringGrid1.Cells[1,i]);

end;

for i:=1 to D1 do for k:=1 to D2 do begin

M[i,k]:=W[Nomer(i-1,k-1,N)+1];

end;

for i:=1 to D1 do for k:=1 to D2 do begin

if CheckBox1.Checked

then StringGrid2.Cells[k,i]:=Vektor(Nomer(i-1,k-1,N),N)

else StringGrid2.Cells[k,i]:=FloatToStrF(M[i,k],ffFixed,11,3);

end;

for i:=1 to D1 do begin

min[i]:=M[i,1];

for k:=1 to D2 do

if M[i,k]<min[i] then min[i]:=M[i,k];

end;

for k:=1 to D2 do begin

max[k]:=M[1,k];

for i:=1 to D1 do

if M[i,k]>max[k] then max[k]:=M[i,k];

end;

maxmin:=1;

for i:=1 to D1 do

if min[i]>min[maxmin] then maxmin:=i;

minmax:=1;

for k:=1 to D2 do

if max[k]<max[minmax] then minmax:=k;

Label3.Caption:='Ответ: '+Vektor(Nomer(maxmin-1,minmax-1,n),n);

end;



procedure TForm1.SpinEdit1Change(Sender: TObject);

var i,k : integer;

begin

N:=SpinEdit1.Value;

D1:=DvaVStepeni(N);

D2:=DvaVStepeni(N-1);

StringGrid1.RowCount:=D1+1;

StringGrid2.RowCount:=D1+1;

StringGrid2.ColCount:=D2+1;

if N=3

then begin

k:=1;

for i:=1 to 8 do begin

W[i]:=k*i; k:=-k;

end;

end

else begin

for i:=1 to D1 do begin

k:=random(20); W[i]:=k-10;

end;

end;

for i:=1 to D1 do begin

StringGrid1.Cells[0,i]:=' W '+Vektor(i-1,N)+' = ';

StringGrid1.Cells[1,i]:=FloatToStrF(W[i],ffFixed,11,3);

end;

for i:=1 to D1 do begin

StringGrid2.Cells[0,i]:=Vektor(i-1,N);

end;

for i:=1 to D2 do begin

StringGrid2.Cells[i,0]:=Vektor(i-1,N-1);

end;

for i:=1 to D1 do for k:=1 to D2 do

StringGrid2.Cells[k,i]:='';

Label3.Caption:='';

end;



procedure TForm1.CheckBox1Click(Sender: TObject);

begin

Button1Click(Sender);

end;



end.

23.11.2005 в 01:17

Пусть прошлое горит синим пламенем. У меня есть настоящее и будущее!
Писал такое на С++. Нада - отдам готовый проект. Так кое-что переделать (у меня было n ответов, n-1 - 0 баллов, один (верный) - один балл).
23.11.2005 в 08:16

всё иллюзия
даа, здесь 50 - мало!
23.11.2005 в 18:56

Маша
Aen Sidhe , да, очень надо..можно поглядеть твою программу?
27.11.2005 в 14:52

Геральд
Простая экспертная система...
07.12.2005 в 23:28

А чё обязательно Delfi? Могу придложить альтернативу на Visual Basic.