Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет мой.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
4.46 Mб
Скачать

Задача 48. Экзаменатор-2

Программа Экзаменатор-2 (Рис. 58) позволяет автоматизировать процесс тестирования. Имя файла теста передается программе при ее запуске — указывается в качестве параметра команды запуска .

Рис 58

Вывод: В этом задании мы научились автоматизировать процесс тестирования.

Листинг

int nQuery = 0; // всего вопроов

int nRight; // правильных ответов

int Right; // правильный ответ

int Sel; // ответ, выбранный испытуемым

static int mode =0; //0 - начало работы программы

// (вывести первый вопрос)

// 1 - процесс тестирования

// 2 - тестирование завершено

// началоработы void fastcall TForml::FormActivate(TObject *Sender)

{

if (ParamCount() ==0) {

Labell->Caption = "В командной строке надо указать "

"имяфайлатеста";

mode = 2; return;

XMLDocumentl->FileName = ParamStr(l); try

{

// открыть XML-документ XMLDocumentl->Active = True;

}

catch (EDOMParseError &e)

{

Labell->AutoSize = True;

Labell->Caption = "Ошибка доступа к файлу теста " +

ParamStr(l) +

"\nMessage: " + е.Message;

mode = 2;

236 Часть 1. Примеры и задачи

return;

Forml->Info(); // вывести информацию о тесте

// считывает и выводит вопрос с указанным номером int fastcall TForml::Qery(int i)

// привестиформувисходноесостояние RadioButtonl->Visible = False; RadioButton2->Visible = False; RadioButton3->Visible = False; RadioButton4->Checked = True; Button3->Enabled = False;

// настроитьинтерфейснаработусузлом qw _di_IXMLNode qw = XMLDocumentl-> DocumentElement->ChildNodes-> Nodes[WideString("qw")]; if ( i > qw->ChildNodes->Count -1 )

return -1;

nQuery++; // количество вопросов

/* Узел q - это вопрос. Параметр text узла q - это текст вопроса дети узла g - это альтернативные ответы */ _di_IXMLNode q = qw->ChildNodes->Nodes[i];

/* Атрибут Text узла qw - это текст вопроса, атрибут right - номер правильного ответа */

Игры и другие полезные программы 237

// вопрос Labell->AutoSize = false; Labell->Width = ClientWidth -20; Labell->Height = 150; Labell->Caption • q->GetAttribute(WideString("text")); Labell->AutoSize = true;

Right = StrToInt( q->GetAttribute(WideString("right")));

// узел "q" состоит из нескольких узлов "а" //(альтернативных ответов) _di_IXMLNode a; int j = 0; // номер узла "а" while ( j < q->ChildNodes->Count )

а = q->ChildNodes->Nodes[j]; switch ( j ) { case 0 : RadioButtonl->Caption = a->Text; RadioButtonl->Top = Labell->Top + Labell->Height + 10; RadioButtonl->Visible = True; break; case 1 : RadioButton2->Caption = a->Text; RadioButton2->Top = RadioButtonl->Top + RadioButtonl->Height + 10; RadioButton2->Visible = True,- break; case 2 : RadioButton3->Caption = a->Text; RadioButton3->Top = RadioButton2->Top + RadioButton2->Height + 10; RadioButton3->Visible = True; break;

return 0;

238 Часть 1. Примерыизадачи

// информацияотесте void fastcall TForml::Info() { Forml->Caption = XMLDocumentl->DocumentElement-> ChildNodes->Nodes[WideString("head")]->Text; Labell->Caption = XMLDocumentl->DocumentElement-> ChildNodes->Nodes[WideString("description")]->Text;

// щелчокнакнопкеОК void fastcall TForml::Button3Click(TObject *Sender)

static int i = 0; // номервопроса int r; // результатвыводавопроса: // -1 - вопросовбольшенет switch ( mode) { case 0: г = Qery(i++); mode = 1; break;

case 1:

// проверим, правильный ли ответ выбрал // испытуемый if ( Sel == Right) nRight++; // вывести следующий вопрос г = Qery(i++); if ( r == -1 ) // больше вопросов нет

// результаттестирования Result(); Button3->Enabled = true; mode = 2;

Игры и другие полезные программы 239

break;

case 2: Forml->Close(); // завершить работу программы

// вывести результат тестирования void fastcall TForml::Result()

(

int i = 0; int score; _di_lXMLNode Is; // интерфейс доступа к узлу levels _di_IXMLNode 1; // интерфейс доступа к узлу level

// считываем последовательно узлы level и сравниваем // значение параметра score с количеством правильных // ответов Is = XMLDocrnnentl->DocumentElement->

ChildNodes->Nodes[WideString("levels")] while ( i < ls->ChildNodes->Count) { 1 = ls~>ChildNodes->Nodes[i]; score = StrToInt( l-> GetAttribute(WideString("score"))); if ( nRight >= score ) break;

AnsiString mes; mes.printf("Экзамензакончен\п" "Всеговопросов: %i\n" "Правильныхответов: %i\n", nQuery,nRight);

240 Часть 1. Примерыизадачи

mes = mes + l->GetAttribute(WideString("text")); Labell->Width = Forml->ClientWidth - 20; Labell->Caption = mes;

// пользовательвыбралпервыйответ void fastcall TForml::RadioButtonlClick(TObject *Sender)

{

Sel = 1; Button3->Enabled = True;

// пользовательвыбралвторойответ void fastcall TForml::RadioButton2Click(TObject *Sender)

{

Sel = 2; Button3->Enabled = True;

// пользовательвыбралтретийответ void fastcall TForml::RadioButton3Click(TObject *Sender)

{

Sel = 3; Button3->Enabled = True;