Компонент XMLDocument забезпечує читання з XML-файла: запитань, альтернативних відповідей та іншої інформації. Запитання і результат тестування, відображаються в полі компонента Label1. Компоненти RadioButton1, RadioButton2 і RadioButton3 використовуються для відображення варіантів відповіді. Під час час роботи програми компонент RadioButton4 використовується для скидання перемикачів вибору відповіді перед виведенням чергового запитання.

Код написання програми
Файл XML:
xml version="1.0" encoding="Windows-1251"?>
test
head>Економіка /head
qw>
q text="Карл Маркс написав книгу" src="" right="3">
a> "Матеріалізм і емпіріокритицизм" /a>
a> "Як нам боротися з інфляцією" /a>
a> "Капітал" /a>
/q>
q text="Коли вперше з'явилися бартерні угоди?" src="" right="1">
a> за первіснообщинного ладу /a>
a> в період суспільного поділу праці /a>
a> у наш час /a>
/q>
q text="Hoy-xay означає:" src="" right="3">
a> секрет /a>
a> нове підприємство /a>
a> нова ідея (знаю, як) /a>
/q>
q text="Ставка дисконтування дозволяє:" src="" right="1"
a> привести вартість грошей у майбутньому до поточного моменту /a>
a> розрахувати знижку за кредитом /a>
a> врахувати інфляцію /a>
/q>
/qw>
levels>
level score="4" text="Оцінка - ВІДМІННО"/>
level score="3" text="Оцінка - ДОБРЕ."/>
level score="2" text="Оцінка - ЗАДОВІЛЬНА"/>
level score="0" text="Оцінка - ПОГАНО!"/>
/levels
/test
BPR (CPP):
#include vcl.h
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int nQuery = 0; // усього запитань
int nRight; // правильних відповідей
AnsiString Right; // правильна відповідь
int Sel; // відповідь, обрана випробовуваним
static int mode = 0; //0 - початок роботи програми
// 1 - процес тестування
// 2 - тестування завершено
static int currentQuestionIndex = 0;// індекс поточного запитання
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::FormActivate(TObject *Sender)
{
if (currentQuestionIndex > 0)
return; // перевірка на вже існуюче значення currentQuestionIndex
if (OpenDialog1->Execute())
{
XMLDocument1->FileName = OpenDialog1->FileName;
try
{
XMLDocument1->Active = true;
}
catch (EDOMParseError &e)
{
Label1->AutoSize = true;
Label1->Caption = "Помилка доступу до файлу тесту " +
OpenDialog1->FileName +
"\nMessage: " + e.Message;
mode = 2;
return;
}
Form1->Info();
nQuery = 0;
nRight = 0;
Sel = 0;
mode = 0;
currentQuestionIndex = 0; // змінено на 0
Qery(currentQuestionIndex);
currentQuestionIndex++; // збільшено на 1
}
else
{
Label1->Caption = "Ви не обрали файл тесту";
mode = 2;
}
}
int __fastcall TForm1::Qery(int i)
{
RadioButton1->Visible = false;
RadioButton2->Visible = false;
RadioButton3->Visible = false;
RadioButton4->Checked = true;
Button1->Enabled = false;
_di_IXMLNode qw = XMLDocument1->DocumentElement->ChildNodes->Nodes[WideString("qw")];
if (i >= qw->ChildNodes->Count)
{
return -1;
}
nQuery++;
_di_IXMLNode q = qw->ChildNodes->Nodes[i];
Label1->Caption = q->GetAttribute(WideString("text"));
Right = q->GetAttribute(WideString("right"));
_di_IXMLNode a;
int j = 0;
while (j < q->ChildNodes->Count)
{
a = q->ChildNodes->Nodes[j];
switch (j)
{
case 0:
RadioButton1->Caption = a->Text;
RadioButton1->Visible = true;
break;
case 1:
RadioButton2->Caption = a->Text;
RadioButton2->Visible = true;
break;
case 2:
RadioButton3->Caption = a->Text;
RadioButton3->Visible = true;
break;
}
j++;
}
return 0;
}
void __fastcall TForm1::Info()
{
Form1->Caption = XMLDocument1->DocumentElement->ChildNodes->Nodes[WideString("head")]->Text;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int r; // результат виведення запитання: -1 - питань більше немає
switch (mode)
{
case 0:
Qery(currentQuestionIndex);
r = currentQuestionIndex;
mode = 1;
currentQuestionIndex++; // збільшуємо індекс лише у режимі 0
break;
case 1:
// перевіримо, чи правильну відповідь вибрав випробовуваний
if (Sel == Right)
nRight++;
// вивести наступне запитання
r = Qery(currentQuestionIndex);
if (r == -1)
{ // більше запитань немає
Result();
Button1->Enabled = true;
mode = 2;
}
currentQuestionIndex++; // збільшуємо індекс у режимі 1
break;
case 2:
Form1->Close();
}
}
void __fastcall TForm1::Result()
{
int i = 0;
int score;
_di_IXMLNode ls;// інтерфейс доступу до вузла levels _di_IXMLNode l; // інтерфейс доступу до вузла level // зчитуємо послідовно вузли level і порівнюємо // значення параметра score з кількістю правильних // відповідей
ls = XMLDocument1->DocumentElement->ChildNodes->Nodes[WideString("levels")];
while (i < ls->ChildNodes->Count)
{
l = ls->ChildNodes->Nodes[i];
score = StrToInt(l->GetAttribute(WideString("score")));
if (nRight >= score)
break;
i++;
}
AnsiString mes;
mes.printf("Іспит закінчено\n"
"Усього запитань: %i\n"
"Правильних відповідей: %i\n",
nQuery, nRight);
mes = mes + l->GetAttribute(WideString("text"));
Label1->Caption = mes;
}
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
Sel = 1;
Button1->Enabled = True;;
}
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
Sel = 2;
Button1->Enabled = True;
}
void __fastcall TForm1::RadioButton3Click(TObject *Sender)
{
Sel = 3;
Button1->Enabled = True;
}
BPR (h):
__published: // IDE-managed Components
TRadioButton *RadioButton1;
TRadioButton *RadioButton2;
TRadioButton *RadioButton3;
TRadioButton *RadioButton4;
TButton *Button1;
TXMLDocument *XMLDocument1;
TLabel *Label1;
TOpenDialog *OpenDialog1;
void __fastcall FormActivate(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall RadioButton1Click(TObject *Sender);
void __fastcall RadioButton2Click(TObject *Sender);
void __fastcall RadioButton3Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
int __fastcall TForm1::Qery(int i);
void __fastcall TForm1::Info();
void __fastcall TForm1::Result();
програмування