ОПИСАНИЕ ВОЗМОЖНОСТЕЙ РАЗРАБОТАННОЙ ПРОГРАММЫ «ГОТОВИМСЯ К ЕГЭ».
методическая разработка по физике (11 класс) по теме

Финагеев Максим Михайлович

 

При  составления тестирующих программ основной вопрос, с которой сталкивается программист, является проблема хранения данных.  Как было отмечено выше программа «Готовимся к ЕГЭ» разработана  школьникам для решения тестовых заданий единого государственного экзамена. Как известно, эти задания содержат в себе: изображения, формулы, таблицы, графики. Следовательно, хранения данных тестовых заданий в базе данных MS Accessможно осуществить лишь с использованием OLE – объектов. Но данный способ «не всегда работает», так как при переносе  OLE – объектов из базы данных MS Accessвозникает ряд проблем. Поэтому нами была предпринята идея хранения заданий в документе Microsoft Word с использованием «тегов».

Скачать:

ВложениеРазмер
Файл opisanie_vozmozhnostey_razrabotannoy.docx28.51 КБ

Предварительный просмотр:

ОПИСАНИЕ ВОЗМОЖНОСТЕЙ РАЗРАБОТАННОЙ

ПРОГРАММЫ «ГОТОВИМСЯ К ЕГЭ».

При  составления тестирующих программ основной вопрос, с которой сталкивается программист, является проблема хранения данных.  Как было отмечено выше программа «Готовимся к ЕГЭ» разработана  школьникам для решения тестовых заданий единого государственного экзамена. Как известно, эти задания содержат в себе: изображения, формулы, таблицы, графики. Следовательно, хранения данных тестовых заданий в базе данных MS Access можно осуществить лишь с использованием OLE – объектов. Но данный способ «не всегда работает», так как при переносе  OLE – объектов из базы данных MS Access возникает ряд проблем. Поэтому нами была предпринята идея хранения заданий в документе Microsoft Word с использованием «тегов».

Приведем фрагмент

0:01:00

<\t>

Лазер излучает свет с длиной волны 600 нм. Свет лазера делят на два пучка, которые затем направляют на экран. Определите оптическую разность хода пучков, при которой на экране наблюдается максимум освещенности.

<\a>

200 нм<\v>

300 нм<\v>

900 нм<\v>

1,2 мкм<\v>

2<\ans>

<\d>

<\s>

0:01:00

<\t>

Билет на автобус стоит 15 рублей. Какое максимальное число билетов можно будет купить на 100 рублей после повышения цены билета на 20%?

<\b>

5<\ans>

Ответом на задани должно быть целое число или конечная десятичная дробь. Ответ следует записать в бланк ответов №1 справа от номера выполняемого задания, начиная с первой клеточки. Каждую цифру, знак минус и запятую пишите в отдельной клеточке в соответствии с приведенными в бланке образцами. Единицы измерений писать не нужно.

<\d>

Расшифруем обозначение «тегов».

Задается время на отведенное задание

  1. <\t>

Задается описание вопроса задания

  1. <\b>

Задается вариант ответа

  1. <\v>

Ответ на поставленное задание

  1. <\ans>

Описание требований записи ответа

  1. <\d>

Описание подробного решения

  1. <\s>

Начало тестирования

При нажатии кнопки начать тест генерируется следующее событие:

procedure TMainForm.StartBtnClick(Sender: TObject);

var

 i:integer;

 blob : TAdoBlobStream;

 FileName:WideString;

 ArchiveItem: TZFArchiveItem;

begin

if StartBtn.Caption = 'Начать тест' then

begin

 TegNum:=1;

 tegnumprev:=1;

 zipForge1.FileName:='test.'+IntToStr(SubjectBox.ItemIndex+1)+'.zip';

 zipForge1.Password:='8989';

try

// Открытие архива

 ZipForge1.OpenArchive(fmOpenRead);

FileName:=IntToStr(SubjectBox.ItemIndex+1)+'.'+YearBox.Text+'.'+NumberBox.Text+'.doc';

 if (ZipForge1.FindFirst(FileName,ArchiveItem,faAnyFile-faDirectory)) then

 begin

  ZipForge1.ExtractFiles(ArchiveItem.FileName);

  fn:=ExtractFilePath(Application.ExeName)+ArchiveItem.FileName;

  ZipForge1.CloseArchive();

// Открытие файла Word

  WappConnect_Open(Wordapp,false,false,CkRunningOrNew,fn);

  TestTime:=TimeShow(WordApp);

  MainForm.BorderIcons:= [biMinimize, biMaximize];

  time:=Now;

  Image.Visible:=false;

  SubjectBox.Visible:=false;

  YearBox.Visible:=false;

  NumberBox.Visible:=false;

  MainPnl.Visible:=true;

  VisibleLabel.Caption:=SubjectBox.Text+' за '+YearBox.Text+'  № '+NumberBox.Text;

//Подсчет вопросов части A

  KolA:=UmyWApp.KolTeg(WordApp,'a');

  for i := 1 to kolA do

   begin

    {Create the buttons}

    RunTimeButtons[i] := TSpeedButton.Create(Self);

    with RunTimeButtons[i] do

    begin

     parent:=ButtonBox;

     Width:=35;

     Height:=35;

     Caption := 'A' + IntToStr(i);

     Left     := 8+(i-1) * Width;

     Top:=50;

     GroupIndex:=1;

     AllowAllUp := False;

     Tag     := i;

     Font.Size:=12;

     {Assign a OnClick handler}

     Visible := True;

     OnClick :=  RunTimeButtonclick;

    end;

   end;

// Подсчет вопросов части B

  KolB:=UmyWApp.KolTeg(WordApp,'b');

  for i := kolA+1 to kolB+kolA do

   begin

    {Create the buttons}

    RunTimeButtons[i] := TSpeedButton.Create(Self);

    with RunTimeButtons[i] do

    begin

     parent:=ButtonBox;

     Width:=35;

     Height:=35;

     Caption := 'B' + IntToStr(i-kolA);

     Left := 8+(i-1-kolA) * Width;

     Top:=50+height;

     GroupIndex:=1;

     AllowAllUp := False;

     Tag := i;

     Font.Size:=12;

     {Assign a OnClick handler}

     Visible := True;

     OnClick :=  RunTimeButtonclick;

    end;

   end;

// Подсчет вопросов части C

   KolC:=UmyWApp.KolTeg(WordApp,'c');

  for i := kolA+kolB+1 to kolB+kolA+KolC do

   begin

    {Create the buttons}

    RunTimeButtons[i] := TSpeedButton.Create(Self);

    with RunTimeButtons[i] do

    begin

     parent:=ButtonBox;

     Width:=35;

     Height:=35;

     Caption := 'C' + IntToStr(i-kolA-kolB);

     Left := 8+(i-1-kolA-kolB) * Width;

     Top:=50+2*height;

     GroupIndex:=1;

     AllowAllUp := False;

     Tag := i;

     Font.Size:=12;

     {Assign a OnClick handler}

     Visible := True;

     OnClick :=  RunTimeButtonclick;

    end;

   end;

 // Удаление всех записей из таблицы  

with DataForm.AnswerTable do

    begin

      First;

      while not eof do delete;

      insert;

    end;

DataForm.AnswerTable.FieldByName('Тест').AsString:=IntToStr(SubjectBox.

ItemIndex+1)+'.'+YearBox.Text+'.'+NumberBox.Text+'.doc';

   RunTimeButtons[1].Click;

   RunTimeButtons[1].Down:=true;

   RunTimeButtons[1].Font.Color:=clRed;

   StartBtn.Caption:='Завершить тест';

   timer.Enabled:=true;

 end

 else

  MessageDlg('Отсутствует тест в базе',mtInformation, [mbYes], 0);

except

 MessageDlg('Отсутствует база с тестами',mtError, [mbYes], 0);

end;

end

else

begin

……………

Завершение работы теста

……………

end;

end.

Опишем ключевые моменты выше указанной процедуры:

1)   Открываем архив для чтения, извлекаем из него фаил с названием IntToStr(SubjectBox.ItemIndex+1)+'.'+YearBox.Text+'.'+NumberBox.Text+'.doc';

2)     Связываем компонент WordАрр c фаилом тестового задания.

3)    Подсчитывая количество вопросов части А, В и С, происходит создание соответствующих кнопок. После чего  фаил с тестовым задание приобретает вид (производится номерация тегов):

0:01:00

<\t>

B1

Билет на автобус стоит 15 рублей. Какое максимальное число билетов можно будет купить на 100 рублей после повышения цены билета на 20%?

<\b>

5<\ans>

Ответом на задани должно быть целое число или конечная десятичная дробь. Ответ следует записать в бланк ответов №1 справа от номера выполняемого задания, начиная с первой клеточки. Каждую цифру, знак минус и запятую пишите в отдельной клеточке в соответствии с приведенными в бланке образцами. Единицы измерений писать не нужно.

<\d>

Решение

После повышения цены билета на 20% его стоимость составит:  рублей. Значит, на 100 рублей можно будет купить 5 билетов, так как .

Ответ: 5.

<\s>

0:01:00

<\t>

Лазер излучает свет с длиной волны 600 нм. Свет лазера делят на два пучка, которые затем направляют на экран. Определите оптическую разность хода пучков, при которой на экране наблюдается максимум освещенности.

<\a>

<v.a1.1>200 нм<\v>

300 нм<\v>

900 нм<\v>

1,2 мкм<\v>

2<\ans>

<\d>

<\s>

 Процесс тестирования.

В данном пункте опишем процедуру извлечения тестовых вопросов из файла тестовых заданий. При выборе  вопроса генерируется следующее событие:

procedure TMainForm.RunTimeButtonClick(Sender: TObject);

begin

SolBtn.Caption := 'Решение';

//Отображается вопрос

QuestionShow(MainForm.WordApp,  OleContainer,(Sender as TSpeedButton).Caption);

(Sender as TSpeedButton).Font.Color:=clRed;

//Отображается критерии записи ответа

DescriptionMemo.Text:=DescriptionShow(WordApp,(Sender as TSpeedButton).Caption);

if (Sender as TSpeedButton).Caption[1]='A' then

 begin

  AnswerDBEdit.Visible:=false;

  AnswerGroup.Items.Clear;

  AnswerGroup.Items:=AnswerShow(MainForm.WordApp, (Sender as TSpeedButton).Caption);

  AnswerGroup.DataField:=(Sender as TSpeedButton).Caption;

  TegNum:=(Sender as TSpeedButton).Tag;

  AnswerGroup.Visible:=true;

  end

else

 Begin

  AnswerGroup.Visible:=false;

  AnswerDBEdit.Visible:=true;

  AnswerDBEdit.DataField:=(Sender as TSpeedButton).Caption;

  AnswerDBEdit.SetFocus;

  TegNum:=(Sender as TSpeedButton).Tag;

 end;

if DataForm.AnswerTable.FieldByName(

        RunTimeButtons[TegNumPrev].Caption).AsString<>''

then

 RunTimeButtons[TegNumPrev].Font.Color:=clGreen

else

 RunTimeButtons[TegNumPrev].Font.Color:=clBlack;

tegnumprev:=tegnum;

end;

Чтобы было понятно, опишем ключевые моменты  выше указанной процедуры на конкретном примере. Например, при нажатии кнопки с надписью А1  программа:

  1. отыскивает в файле тестового задания соответствующий тег и отображает вопрос, который находится между тегами и <\a>, в компоненте  OleContainer.
  2. Отыскивает теги <v.a1.i>  и отображает варианты ответов, которые находятся между тегами <v.a1.1>  и  <\v>, в компоненте AnswerGroup.
  3. Связываем компонент AnswerGroup с полем А1 таблицы AnswerTable.(Если мы работаем с частью В, то в таком случае связываем компонент AnswerDBEdit полем В* таблицы AnswerTable.

Завершение тестирования

Для завершения теста нажимаем кнопку «завершить тестирование», после чего генерируется следующее событие:

procedure TMainForm.RunTimeButtonClick(Sender: TObject);

…………….

  StartBtn.Caption:='Начать тест';

  if DataForm.AnswerTable.Modified then DataForm.AnswerTable.Post

   else DataForm.AnswerTable.Cancel;

  SubjectBox.Visible:=true;

  YearBox.Visible:=true;

  NumberBox.Visible:=true;

  Timer.Enabled:=false;

  VisibleLabel.Caption:='';

  MainPnl.Visible:=false;

  Image.Visible:=true;

// Отображаем форму ответов

  ResultForm.ShowModal;

  for i := 1 to kolA+KolB+kolC do

    RunTimeButtons[i].Destroy;

  QuitWordAppNotSave(WordApp);

  deleteFile(fn);

  MainForm.BorderIcons:= [biSystemMenu, biMinimize, biMaximize];

end;

end;

Опишем работу выше указанной процедуры:

  1. Сохраняем изменения в таблице AnswerTable;
  2. Отображаем окно результатов ResultForm. При активации данного окна возникает следующее событие:

procedure TResultForm.FormActivate(Sender: TObject);

Var

 i, right:integer;

begin

  StringGrid1.Cells[0,0]:='№ вопроса';

  StringGrid1.Cells[1,0]:='Задача';

  StringGrid1.Cells[2,0]:='Ваш ответ';

  StringGrid1.Cells[3,0]:='Правильный ответ';

  StringGrid1.Cells[4,0]:='Бал';

  StringGrid1.RowCount:=MainForm.kolA+MainForm.kolB+1;

for i:=1 to MainForm.KolA+MainForm.kolB+MainForm.kolC do

 begin

  StringGrid1.Cells[0,i]:=IntToStr(i);

  StringGrid1.Cells[1,i]:=MainForm.RunTimeButtons[i].Caption;

  StringGrid1.Cells[2,i]:=DataForm.AnswerTable.FieldByName(

                          MainForm.RunTimeButtons[i].Caption).AsString;

StringGrid1.Cells[3,i]:=RightShow(MainForm.WordApp,MainForm.RunTimeButtons[i].Caption);

  if StringGrid1.Cells[2,i] = StringGrid1.Cells[3,i]

   then

    begin

     StringGrid1.Cells[4,i]:='1';

     right:=right+1;

    end

   else

    StringGrid1.Cells[4,i]:='0';

end;

AnswerLabel.Caption:=IntToStr(right)+' правильных ответов из '

                     + IntToStr(MainForm.kolA+MainForm.kolB+MainForm.kolB);

TimeLabel.Caption:='Ваше время : '+ MainForm.TimeNowLbl.Caption;

end;

Опишем кратко выше указанную процедуру:

  1. Заполняется таблица результатов;
  2. Подсчитывается количество правильных ответов

 3. На заключительном этапе происходит удаление временного файла.

Разработанная программа обеспечивает простую работу при создании тестовых заданий, а также заменяет онлайн тестирование для школьников не имеющих доступ к интернету.