Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторна робота №12

.pdf
Скачиваний:
10
Добавлен:
15.02.2015
Размер:
515.49 Кб
Скачать

В результаті, після запуска проекту, отримаємо форму, яка представлена на рис.12.2

Рисунок 12.2

Наше завдання - сформувати файл тестових питань, який потім можна використовувати для проведення тестування. Для цього необхідно подумати про те, як будуть організовані дані. Із загального вигляду Form1 можна зробити виведення, що кожне питання складається з тексту питання, чотирьох варіантів відповідей і чотирьох варіантів ознак правильності відповіді. Для зручності скористаємося типом даних Запис (Record). З одного боку, запис можна розглядати як єдине ціле, з іншого боку - як набір окремих елементів різного типу. Для нашої задачі підійде наступний опис типу:

Type TTEST = Record

 

TEXT: String [250];

// Текст питання

OTV: Array [1..4]of

String [40]; // Варіанти відповідей

REZ: Array [1..4]of

Byte // Правильна відповідь

end;

 

Вирішити наше завдання можна таким чином:

11

1.Ввести назву тесту і кількість питань.

2.Ввести всі питання з варіантами відповідей, записуючи їх в масив.

Примітка. Це дозволить переглядати (вперед, назад) питання, вносити зміни до запису їх у файл.

3. Зберегти всі сформовані питання у файлі. Для цього наш масив бути мати тип запису TTEST. У розділ опису включимо опис файлу і опис масиву.

Const KOL = 21;

 

// Max кількість питань

Var FFile: File

of TTEST;

// Опис файлу

TEST_: Array [1..KOL] of TTEST; // Масив тесту

При побудові масиву перший елемент масиву (TEST_[1]) міститиме інформацію про тест: Test_[1].TEXT - назва тесту

Починаючи з другого елементу масиву, розташовуватиметься безпосередньо інформація про питання тесту. У процедуру TForm1.FormCreate

необхідно додати ще один блок підготовки масиву TEST_ до роботи.

В процедуру TForm1.FormCreate необходимо добавить еще один блок подготовки массива TEST_ к работе.

For I:=1 to KOL do begin TEST_[I].TEXT:=' '; for K:=1 to 4 do begin TEST_[I].OTV[K]:=' '; TEST_[I].REZ[K]:=0

end; end;

Створимо процедуру, яка обробляє ситуацію натиснення кнопки Button3

(запис створеного масиву у файл). Для цього виділіть об'єкт Button3, перейдіть на вкладку Events Інспектора об'єктів (Object Inspector), знайдіть подію

OnClick, праворуч від нього двічі клацнути лівою кнопкою миші. Попавши в код програми, треба написати наступний код:

procedure TForm1.Button3Click(Sender: TObject);

Var I :Byte;

STROK:TTEST;

begin

12

AssignFile(FFILE,'TEST.txt');

Rewrite(FFILE);

Button1.Enabled:=False; //Недосяжні всі три кнопки

Button2.Enabled:=False;

Button3.Enabled:=False;

For I:=1 to STEP_N+1 do begin STROK:=TEST_[I];

Write(FFILE, STROK) end;

CloseFile(FFILE)

end;

У представленій процедурі файлової змінної FFILE ставиться у відповідність ім'я файлу, тобто масив запишемо у файл TEST.txt. Потім відкривається файл (у нашому випадку він створюється) для запису. У файл переписуються усі елементи масиву TEST _. Їх кількість відповідає введеному параметру "Кількість питань в тесті" плюс 1, так як доданий один елемент(перший), який містить назву тесту.

Встановлюється недоступними кнопки "Попередня", "Наступна",

"Запис", а потім масив записується у файл. У кінці файл закривається.

Перейдемо до створення процедури обробки Button2 ("Наступна" -

перехід до наступного запису). Для цього виділіть об'єкт Button2, перейдіть на вкладку Events Інспектора об'єктів(Object Inspector), знайдіть подію OnClick,

праворуч від нього двічі клацнути лівою кнопкою миші. Розберемо код процедури по частинах.

Частина № 1

procedure TForm1.Button2Click(Sender: TObject); Var I:Byte;

begin

If (RadioButton1.Checked=False) and (RadioButton2.Checked=False) and (RadioButton3.Checked=False) and (RadioButton4.Checked=False) Then begin ShowMessage('Не обрано правильну відповідь');

13

Exit

end;

На початку процедури необхідно перевірити чи вибрана правильна відповідь

(має бути натиснута одна з кнопок RadioButton). Якщо значення властивості

Checked у RadioButton дорівнює False, то буде видано повідомлення "Не вибрана правильна відповідь" і процедура закінчить свою роботу.

Частина № 2

If STEP=1 Then begin

TEST_[1].TEXT:=Edit1.Text;

Edit1.Enabled:=False;

STEP_N:= StrtoInt(SpinEdit1.Text); // Кількість питань в тесті

SpinEdit1.Enabled:=False;

STEP:=STEP+1;

end;

Цей шматок процедури потрібний, оскільки в масиві елементи з індексом 1 містять інформацію про назву тесту. Тому, якщо у нас перше питання (STEP=1), то здійснюється запис в масив інформації про тест і встановлюються об'єкти Edit1 і SpinEdit1 недоступними. Переходимо до формування питань.

Частина № 3

TEST_[STEP].TEXT:=Edit2.Text;

For I:=1 to 4 do begin

TEST_[STEP].OTV[I]:=TEdit(FindComponent('Edit'+IntToStr(I+2)) ).Text;

If TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Checke d= True Then TEST_[STEP].REZ[I]:= 1;

14

end;

У третій частині елементам масиву з індексом STEP привласнюється значення

відповідних полів. Якщо натиснута RadioButton, то відповідному елементу

масиву REZ[I] (Результат відповіді) привласнюється значення 1.

Частина № 4

Button1.Enabled:=True;

If STEP>STEP_N Then begin

Button2.Enabled:=False;

Button3.Enabled:=True; end

Else begin

STEP:=STEP+1;

Label3.Caption:='Питання № '+IntToStr(STEP-1);

Edit2.Text:=TEST_[STEP].TEXT;

For I:=1 to 4 do begin

TEdit(FindComponent('Edit'+IntToStr(I+2))).Text:=TEST_[STEP].

OTV[I];

If TEST_[STEP].REZ[I]= 1 Then TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Chec ked:= True else TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Chec

ked:= False end; end; end;

У завершальній частині спочатку встановлюється доступною кнопка Button1 ("Попередня"), тобто вже є один запис і після виконання процедури,

переходимо на другу. Далі йде перевірка - чи являється наш запис останній,

тобто номер поточного запису (STEP) більше кількості питань в тісті (STEP _N). Якщо записати в масив усі питання, то кнопка Button2 ("Наступна")

встановлюється недоступною, а кнопка Button3 ("Запис") - доступною.

15

1. Якщо не досягли кінця тесту, то йде підготовка до наступного питання:

збільшується змінна STEP і властивостям компонент екрану привласнюються значення наступного запису масиву.

2.Якщо масив не заповнений до кінця, то це будуть порожні записи.

3.Якщо масив був заповнений, і переходили від одного запису до іншого за допомогою кнопок Button1("Попередня") і Button2("Наступна"), то на екран будуть виведені значення відповідного запису.

Перейдемо до створення процедури обробки Button1 ("Попередня" -

перехід до попереднього запису). Для цього виділіть об'єкт Button1, перейдіть на вкладку Events Інспектора об'єктів (Object Inspector), знайдіть подію

OnClick, праворуч від нього двічі клацнути лівою кнопкою миші. Потрапивши в код програми, потрібно написати наступний код:

procedure TForm1.Button1Click(Sender: TObject); Var I: Byte;

Begin

STEP:=STEP-1;

Label3.Caption:= 'Питання № '+IntToStr(STEP-1);

Edit2.Text:=TEST_[STEP].TEXT;

For I:=1 to 4 do begin TEdit(FindComponent('Edit'+IntToStr(I+2))).Text:=TEST_[STEP]

.OTV[I];

If TEST_[STEP].REZ[I]= 1 Then TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Ch ecked:= True Else TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Ch

ecked:= False end; If STEP=2 then

Button1.Enabled:=False;

Button2.Enabled:=True;

end;

На початку переходимо до попереднього питання (зменшуємо значення змінної

STEP), а потім виводимо на екран вміст питання. У кінці процедури

16

перевіряємо, якщо питання є першим (номер рядка масиву STEP=2), то робимо недоступною кнопку Попередня і у будь-якому випадку має бути доступна кнопка Наступна.

Збережіть проект остаточно, запустіть і протестуйте його.

4. Програма тестування

Програма тестування складатиметься з двох форм: титульної форми, на якій здійснюється вибір тесту з довідника тестів (текстовий файл) і форма безпосередньо тесту.

Залежно від правильності відповідей на питання тесту, підраховується результат і виставляється оцінка.

4.1. Створення титульної форми

Титульна форма буде виконувати наступні функції:

1.Пошук довідника тестів (текстовий файл STEST.txt), читання інформації про тести-файли і виведення переліку тестів в компонент RadioGroup1.

2.Залежно від вибраного тест-файла, формування робочого файлу тестів.

3.Виклик форми безпосереднього тестування.

4.Видалення робочого файлу тестів при закінченні роботи

Довідник тестів - текстовий файл, який можна створити у будь-якому текстовому редакторові. Кожен рядок файлу містить найменування тесту.

Може мати, наприклад, такий зміст:

Програмування Системне програмування Операційні системи Комп’ютерні мережі

Кожному тесту відповідає файл-тест, який має ім'я TEST _ N.txt, де N - номер рядка у файлі.

Відкрийте новий проект і розмістіть у формі компоненти відповідно до рис.12.3

17

Рисунок 12.3

Найменуваннн

Сторінка

Призначення

п/п

я компоненту

 

 

1

RadioGroup1

Standard

Перелік можливих тестів (з довідника

 

 

 

тестів)

2

Button 1

Standard

Кнопка для переходу до тестування

 

 

 

після вибору тесту

3

Button2

Standard

Кнопка виходу з програми тестування

В розділі implementation розмістіть опис типу і даних, які будемо

використовувати під час роботи.

Type TTEST = Record

TEXT : String [250];

// Текст питання

OTV

: Array

[1..4]of

String [40]; // Варіанти відповідей

REZ

: Array

[1..4]of

Byte // Правильна відповідь

end;

 

Var SFILE : TextFile;

// довідник тестів

FFile: File of TTEST; // Файл тестів

FF_R : File of TTEST; // Робочий файл тестів

KOL : Byte;// Кількість тестів в довіднику тестів

TEST_: TTEST;

// рядок запису файлу

18

 

Виділіть об'єкт Form1, перейдіть на вкладку Events Інспектора об'єктів

(Object Inspector), знайдіть подію OnCreat, праворуч від нього двічі клацнути лівою кнопкою миші. Потрапивши в код програми, потрібно написати наступний код:

procedure TForm1.FormCreate(Sender: TObject);

Var I

: Byte;

SF

: String;

T_TEXT

: Array [1..10] of String[50];

Left_N

: Integer; // отступ слева

Top_N

: Integer; // отступ справа

Begin

KOL:=1;

AssignFile(SFILE,'STEST.txt');

{$I-}

Reset(SFILE);

{$I+}

If IOResult = 0 then begin Repeat

ReadLn(SFILE,SF);

T_TEXT[KOL]:=SF;

KOL:=KOL+1;

until (Eof(SFILE)) or (KOL>10); CloseFile(SFILE);

Left_N:=30; Top_N:=50;

Form1.Caption:='Тестування';

Form1.Width:=400;

Form1.Height:=Top_N+ KOL*25 + 120;

RadioGroup1.Top:=Top_N;

RadioGroup1.Left:=Left_N;

RadioGroup1.Width:= 350;

RadioGroup1.Height:= KOL*25;

RadioGroup1.Caption:= ' Обери тест ';

For I:=1 to KOL-1 do

19

RadioGroup1.Items.Add(T_TEXT[I]);

RadioGroup1.Font.Size:=11;

Button1.Caption:='Тест';

Button1.Left:= Left_N;

Button1.Top:=Top_N+ KOL*25+40;

Button1.Width:= 100;

Button1.Height:=30;

Button2.Caption:='Вихід';

Button2.Left:= Left_N+ 250;

Button2.Top:=Top_N+ KOL*25+40;

Button2.Width:= 100;

Button2.Height:=30;

end else

ShowMessage('Відсутній довідник тестів'); } end;

Трохи теорії

Директива компілятора {$I+}/{$I-} вмикає або вимикає автоматичну перевірку помилок введення/виведення. Коли директива включена і виникає помилка введення/виведення, то виконання програми завершується з повідомленням про помилку, що сталася. Але можна відключити аварійне завершення програми при виникненні помилки. В цьому випадку програміст бере на себе обробку аварійної ситуації. Для того, щоб взнати чи сталася помилка при відкритті файлу, можна скористатися функцією IOResult. Вона повертає код відмінний від нуля, якщо виникла помилка і нуль, якщо операція виконалася успішно.

Типовою помилкою введення/виведення є відсутність файлу. За умовчанням директива компілятора включена - {$I+}. На початку процедури відкривається файл довідника тестів STEST.txt. Якщо файл існує, то інформація з нього переписується в масив T_text і підраховується кількість записів (KOL).

20