Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Помогите исправить ошибку в коде (http://www.tehnari.ru/f43/t85737/)

stil 26.02.2013 00:26

Помогите исправить ошибку в коде
 
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(n); //выбираем случайный вопрос из базы
//проверяем: не задавали ли мы этот вопрос ранее
for i := 1 to n do
if mass[i] = a then goto ran;
for i := 1 to n do
if mass[i] = 0 then
begin
mass[i] := 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[i] then vb:=i+1;
end;

for i:=0 to Otv_c-1 do begin
L2.Checked[i]:=false;
end;

L2.Checked[vb-1]:=true;
Label1.Caption:='Выбран ответ: '+ inttostr(vb);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;

end

Debianer 26.02.2013 05:14

У вас код с ошибками. Попробовал скомпилировать, и сразу вот:
case _vop of
незакончен синтаксис

stil 26.02.2013 08:09

=)
 
а как закончить..же ведь не программист..я самоучка..просто по моей профессии нужна эта программа...я простой бухгалтер...

Vladimir_S 26.02.2013 10:42

Цитата:

Сообщение от stil (Сообщение 872020)
Vladimir_S здравствуйте. а может мне исправите ошибку в коде.

Цитата:

Сообщение от stil (Сообщение 872109)
ведь не программист..я самоучка...я простой бухгалтер...

Здравствуйте, Stil. К сожалению, помочь вряд ли смогу: в этих объектно-ориентированных делах не силён. Тоже, как и Вы, самоучка, простой физик-экспериментатор. И как-то до сих пор обходился начальным уровнем программирования, без этих классов, объектов и т.п. Даже динамический подход знаю поверхностно, хотя иногда использую. Извините.


Часовой пояс GMT +4, время: 08:23.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.