Помогите исправить ошибку в коде
Vladimir_S здравствуйте. а может мне исправите ошибку в коде. там у меня ерунда с генерацией случайного числа..функция не пашет..посмотрите?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, CheckLst, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
L2: TCheckListBox;
S1: TSpeedButton;
S3: TSpeedButton;
Label1: TLabel;
OD1: TOpenDialog;
S2: TSpeedButton;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure S1Click(Sender: TObject);
procedure S2Click(Sender: TObject);
procedure S3Click(Sender: TObject);
procedure L2ClickCheck(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure question_select; //выбор вопроса
procedure Vopros(_vop:word);
public
{ Public declarations }
end;
var
Form1: TForm1;
T:TStringList;
Vop_c,Otv_c,vv:word;
vb:word;// выбранный ответ
Ocenka:integer;
Oc_: array of integer;
Max_oc: integer;
mass: array[1..100] of integer;
i, a, n: integer;
implementation
{$R *.dfm}
procedure TForm1.question_select() ;
label ran; //метка ran для быстрого перехода
begin
Randomize;
ran:
a := Random
; //выбираем случайный вопрос из базы
//проверяем: не задавали ли мы этот вопрос ранее
for i := 1 to n do
if mass = a then goto ran;
for i := 1 to n do
if mass = 0 then
begin
mass := a; {записываем номер вопроса, чтобы не
задавать его больше }
Break;
end;
end;
procedure Vopros(_vop:word);
var
go:boolean;
S_,S1:String;
nn:word;
symb:char;
v_t:boolean;//флаг текста вопроса
otv:integer;//счётчик ответов
cyr_otv:integer;//текущее значение оченки
cyr_max:integer;//максимальное значение ответа в вопросе.
begin
question_select();//вызываем процедуру выбора случайного вопроса
case _vop of
begin
S_:= T.Strings[_vop];
s1:='';
v_t:=true;
go:= true;
nn:=0;
otv:=-1;
cyr_max:=0;
form1.Label2.Caption:= inttostr(_vop) +'/'+ inttostr(vop_c);
while go do begin
nn:=nn+1;
if nn > length(S_) then begin //Конец строки. Заканчиваем.
if _vop = 0 then form1.Memo1.text:= s1 else form1.L2.Items.Add(s1);
go:= false;
continue;
end;
//Если не конец строки, продолжаем
symb:= S_[nn];
if symb = '/' then begin //Количество вопросов
if _vop = 0 then vop_c:= strtoint(s1) else begin
otv_c:= strtoint(s1);
SetLength(Oc_,otv_c);//Задаём размер массива оценок
end;
s1:='';
continue;
end;
if symb = '[' then begin //текст вопросов и ответов
if v_t then form1.Memo1.text:= s1 else
form1.L2.Items.Add(s1);
v_t:=false;
s1:='';
continue;
end;
end; // поставил------------------------------->
if symb = ']' then begin //оценка вопроса
otv:= otv+1;
cyr_otv:= StrToInt(trim(s1));
{Если текущая оценка больше предыдущих, то оно становится
максимальным}
if cyr_otv > cyr_max then cyr_max:= cyr_otv;
Oc_[otv]:= cyr_otv;
s1:='';
continue;
end;
s1:=s1+ symb;
end;
//form1.label3.Caption:=inttostr(Max_oc) + ' ' + inttostr(cyr_max) ;
if _vop <> 0 then Max_oc:= Max_oc + cyr_max;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
T:=TStringList.Create;
S2.Enabled:=false;
S3.Enabled:=false;
end;
procedure TForm1.S1Click(Sender: TObject);
begin
if OD1.Execute then begin
T.LoadFromFile(OD1.FileName);
Vopros(0);
S1.Enabled:=false;
S2.Enabled:=true;
end;
end;
procedure TForm1.S2Click(Sender: TObject);
begin
vb:=0;
vv:=1;
Vopros(1);
//label1.Caption:=inttostr(vop_c);
Ocenka:= 0;
//Max_oc:=0;
S2.Enabled:=false;
S3.Enabled:=true;
end;
procedure TForm1.S3Click(Sender: TObject);
begin
//Вывод следующего вопроса с ответами.
if vb = 0 then begin
Label1.Caption:='Ответ не выбран!';
exit;
end;
Label1.Caption:='';
Ocenka:= Ocenka + Oc_[vb-1];
vv:=vv+1;
Memo1.Clear;
L2.Clear;
if vv > vop_c then begin
S1.Enabled:=true;
S2.Enabled:=true;
S3.Enabled:=false;
//label3.Caption:=inttostr(Max_oc);
//Расчёт по процентам
Ocenka:= round((Ocenka/Max_oc)*100);
if Ocenka <= 60 then Ocenka:= 2;
if (Ocenka > 60) and (Ocenka <= 80) then Ocenka:= 3;
if (Ocenka > 80) and (Ocenka <= 99) then Ocenka:= 4;
if Ocenka =100 then Ocenka:= 5;
Max_oc:= 0;
Memo1.Text:='Тест закончен: Оценка - ' + inttostr(Ocenka);
end else begin
Vopros(vv);
//
vb:= 0;
end;
end;
procedure TForm1.L2ClickCheck(Sender: TObject);
var
i:word;
begin
vb:= 0;
for i:=0 to Otv_c-1 do begin
if L2.Selected then vb:=i+1;
end;
for i:=0 to Otv_c-1 do begin
L2.Checked:=false;
end;
L2.Checked[vb-1]:=true;
Label1.Caption:='Выбран ответ: '+ inttostr(vb);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
end
Vladimir_S здравствуйте. а может мне исправите ошибку в коде. там у меня ерунда с генерацией случайного числа..функция не пашет..посмотрите?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, CheckLst, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
L2: TCheckListBox;
S1: TSpeedButton;
S3: TSpeedButton;
Label1: TLabel;
OD1: TOpenDialog;
S2: TSpeedButton;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure S1Click(Sender: TObject);
procedure S2Click(Sender: TObject);
procedure S3Click(Sender: TObject);
procedure L2ClickCheck(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure question_select; //выбор вопроса
procedure Vopros(_vop:word);
public
{ Public declarations }
end;
var
Form1: TForm1;
T:TStringList;
Vop_c,Otv_c,vv:word;
vb:word;// выбранный ответ
Ocenka:integer;
Oc_: array of integer;
Max_oc: integer;
mass: array[1..100] of integer;
i, a, n: integer;
implementation
{$R *.dfm}
procedure TForm1.question_select() ;
label ran; //метка ran для быстрого перехода
begin
Randomize;
ran:
a := Random
//проверяем: не задавали ли мы этот вопрос ранее
for i := 1 to n do
if mass = a then goto ran;
for i := 1 to n do
if mass = 0 then
begin
mass := a; {записываем номер вопроса, чтобы не
задавать его больше }
Break;
end;
end;
procedure Vopros(_vop:word);
var
go:boolean;
S_,S1:String;
nn:word;
symb:char;
v_t:boolean;//флаг текста вопроса
otv:integer;//счётчик ответов
cyr_otv:integer;//текущее значение оченки
cyr_max:integer;//максимальное значение ответа в вопросе.
begin
question_select();//вызываем процедуру выбора случайного вопроса
case _vop of
begin
S_:= T.Strings[_vop];
s1:='';
v_t:=true;
go:= true;
nn:=0;
otv:=-1;
cyr_max:=0;
form1.Label2.Caption:= inttostr(_vop) +'/'+ inttostr(vop_c);
while go do begin
nn:=nn+1;
if nn > length(S_) then begin //Конец строки. Заканчиваем.
if _vop = 0 then form1.Memo1.text:= s1 else form1.L2.Items.Add(s1);
go:= false;
continue;
end;
//Если не конец строки, продолжаем
symb:= S_[nn];
if symb = '/' then begin //Количество вопросов
if _vop = 0 then vop_c:= strtoint(s1) else begin
otv_c:= strtoint(s1);
SetLength(Oc_,otv_c);//Задаём размер массива оценок
end;
s1:='';
continue;
end;
if symb = '[' then begin //текст вопросов и ответов
if v_t then form1.Memo1.text:= s1 else
form1.L2.Items.Add(s1);
v_t:=false;
s1:='';
continue;
end;
end; // поставил------------------------------->
if symb = ']' then begin //оценка вопроса
otv:= otv+1;
cyr_otv:= StrToInt(trim(s1));
{Если текущая оценка больше предыдущих, то оно становится
максимальным}
if cyr_otv > cyr_max then cyr_max:= cyr_otv;
Oc_[otv]:= cyr_otv;
s1:='';
continue;
end;
s1:=s1+ symb;
end;
//form1.label3.Caption:=inttostr(Max_oc) + ' ' + inttostr(cyr_max) ;
if _vop <> 0 then Max_oc:= Max_oc + cyr_max;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
T:=TStringList.Create;
S2.Enabled:=false;
S3.Enabled:=false;
end;
procedure TForm1.S1Click(Sender: TObject);
begin
if OD1.Execute then begin
T.LoadFromFile(OD1.FileName);
Vopros(0);
S1.Enabled:=false;
S2.Enabled:=true;
end;
end;
procedure TForm1.S2Click(Sender: TObject);
begin
vb:=0;
vv:=1;
Vopros(1);
//label1.Caption:=inttostr(vop_c);
Ocenka:= 0;
//Max_oc:=0;
S2.Enabled:=false;
S3.Enabled:=true;
end;
procedure TForm1.S3Click(Sender: TObject);
begin
//Вывод следующего вопроса с ответами.
if vb = 0 then begin
Label1.Caption:='Ответ не выбран!';
exit;
end;
Label1.Caption:='';
Ocenka:= Ocenka + Oc_[vb-1];
vv:=vv+1;
Memo1.Clear;
L2.Clear;
if vv > vop_c then begin
S1.Enabled:=true;
S2.Enabled:=true;
S3.Enabled:=false;
//label3.Caption:=inttostr(Max_oc);
//Расчёт по процентам
Ocenka:= round((Ocenka/Max_oc)*100);
if Ocenka <= 60 then Ocenka:= 2;
if (Ocenka > 60) and (Ocenka <= 80) then Ocenka:= 3;
if (Ocenka > 80) and (Ocenka <= 99) then Ocenka:= 4;
if Ocenka =100 then Ocenka:= 5;
Max_oc:= 0;
Memo1.Text:='Тест закончен: Оценка - ' + inttostr(Ocenka);
end else begin
Vopros(vv);
//
vb:= 0;
end;
end;
procedure TForm1.L2ClickCheck(Sender: TObject);
var
i:word;
begin
vb:= 0;
for i:=0 to Otv_c-1 do begin
if L2.Selected then vb:=i+1;
end;
for i:=0 to Otv_c-1 do begin
L2.Checked:=false;
end;
L2.Checked[vb-1]:=true;
Label1.Caption:='Выбран ответ: '+ inttostr(vb);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
end