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

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

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

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

Тема: Робота з файлами.

Мета: Отримання практичних навиків використання типізованих файлів,

побудова форм в ході виконання програми, використання компонента SpinEdit

(редактор числа) із сторінки палітри компонентів Samples.

Теоретичні відомості

Текстові файли – це файли в яких знаходиться текстова інформація

(набір рядків з символів). Текстова інформація складається не обов'язково з букв, в ній можуть міститися будь-які символи з таблиці ASCII.

Типізовані файли – це файли в яких знаходиться інформація будь-якого роду. Але структура такої інформації обов'язково повинна повторюватися.

Назву типізованого файлу, отримав через те, що в ньому зберігається однотипна інформація. Один рядок типу називається записом типізованого файлу.

Примітка

Типізовані файли дуже часто використовуються для опису яких-небудь списків інформації, наприклад, телефонних довідників. Кожен запис даного списку може складатися, наприклад, з номера телефону абонента, імені, адреси.

Нетипізовані файли - це файли, що містять послідовність байт без якої-

небуть структури. Наприклад, це може бути закодований або стислий блок інформації. При роботі з таким файлом вся інформація розглядається як набір окремих шматків по N байт, де значення N задається програмістом в діапазоні від 1 до 65535. В процесі роботи для будь-якого файлу потрібно виконувати послідовність наступних дій:

Міняти місцями пункти не можна.

1

Для кожного файлу є поняття - поточне положення у файлі, тобто це те положення, в якому на даний момент йде обробка інформації. Наприклад, у

типізованому файлі, можна прочитати перший запис, потім другий і т.д. У

такому разі поточним положенням у файлі спочатку буде перший запис, потім другий, потім третій.

Постановка завдання

Написати програму тестування, яка задовольняє наступним вимогам:

1.Кількість питань тесту може варіювати від 5 до 20.

2.Для кожного питання мають бути передбачене чотири варіанти відповіді.

3.В результаті тестування має бути виставлена оцінка (незадовільно,

задовільно, добре, відмінно) залежно від кількості правильних відповідей.

4.Питання і відповіді тесту повинні знаходитися у файлі.

5.У програмі має бути заблокована можливість повернення до попереднього питання.

Новим в цій програмі є:

використання типізованих файлів,

побудова форм в ході виконання програми,

використання компонента SpinEdit (редактор числа) із сторінки палітри компонентів Samples.

2. Інформаційна постановка завдання

В умові завдання сказано, що для зберігання використовується файл. У Delphi

підтримує три різні підходи для роботи з файлами, для різного типу інформації бажано використовувати найбільш відповідний підхід.

Структура інформації

В нашому завданні одиницею інформації буде питання, яке у свою чергу складатиметься з тексту питання, чотирьох варіантів відповіді і чотирьох покажчиків правильності відповіді. Таким чином, можна ввести тип, що описує питання.

2

Type TTEST = Record

TEXT

: String [250];// Текст питання

OTV_1

: String [100];// Варіант відповіді №1

OTV_2

: String [100];// Варіант відповіді №2

OTV_3

: String [100];// Варіант відповіді №3

OTV_4

: String [100];// Варіант відповіді №4

REZ_1

: Byte; //Признак правильності відповіді №1

REZ_2

: Byte; //Признак правильності відповіді №2

REZ_3

: Byte; //Признак правильності відповіді №3

REZ_4

: Byte; //Признак правильності відповіді №4

end;

 

TEXT, OTV_1, OTV_2, OTV_3, OTV_4 містять текстову інформацію, а

REZ_1, REZ_2, REZ_3, REZ_4 міститимуть числову інформацію: 0 -

відповідь неправильна, 1 - відповідь правильна. Можна було б для «Ознаки правильності відповіді» ввести тип Boolean, але введемо числове значення,

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

У запропоновану структуру можна внести зміни, які дозволять надалі скоротити текст програми. Для цього визначимо тип масиву для даних

«Варіант відповіді» і «Ознака правильності відповіді». Тоді опис типу буде виглядати так:

Type TTEST = Record

TEXT : String [250];//Текст питання

OTV : Array [1..4]of String [100];//Варіанти відповідей REZ : Array [1..4]of Byte; //Правильна відповідь

end;

Мимоволі підійшли до того, що потрібно використовувати типізований файл. Для роботи програми тестування нам буде потрібна ще інформація про назву тесту і кількість питань в тесті. Кількість питань в тесті (кількість записів у файлі) можна взнати за допомогою функції FileSize. А ось назву тесту

3

необхідно помістити у файл. Тому інформація у файлі розташовуватиметься таким чином:

Перший запис містить назву тесту, все подальші записи - інформацію про питання. В результаті кількість записів у файлі буде на одну більше, ніж кількість питань в тесті. Для формування тесту будемо використовувати масив:

Const KOL = 21; // Max кількість питань

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

Опис файлу

При оголошенні файлової змінної типізованих файлів, вказується тип даних, що

містяться у файлі.

Var FFile: File of TTEST; // Опис файлу

Для читання або запису файлів такого типу можливе використання лише операторів Read і Write. Readln і Writeln використовувати не можна, оскільки дані у файлі це не рядки тексту, тобто немає ліній.

Дані у типізованому файлі зберігаються у внутрішньому машинному вигляді. Тому створювати файл і читати інформацію з нього можна лише за допомогою програми, яка «знає» структуру даних. Для цього ми створимо дві програм. Перша відповідатиме за створення тесту, а друга - тестування.

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

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

4

Рисунок 12.1

Нам знадобляться наступні компоненти:

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

Сторінка

Призначення

п/п

компоненту

 

 

 

 

 

 

1

Label1

Standard

Виведення тексту «Назва тесту»

2

Label2

Standard

Виведення тексту «Кількість питань» в

 

 

 

тесті

3

Label3

Standard

Виведення тексту «Питання №»

4

Label4

Standard

Виведення тексту «Текст» питання

5

Label5

Standard

Виведення тексту «Відповідь № 1»

6

Label6

Standard

Виведення тексту «Відповідь № 2»

7

Label7

Standard

Виведення тексту «Відповідь № 3»

8

Label8

Standard

Виведення тексту «Відповідь № 4»

9

Edit1

Standard

Вікно введення назви тесту

10

Edit2

Standard

Вікно введення тексту питання

11

Edit3

Standard

Вікно введення варіанту відповіді № 1

12

Edit4

Standard

Вікно введення варіанту відповіді № 2

5

13

Edit5

Standard

Вікно введення варіанту відповіді № 3

14

Edit6

Standard

Вікно введення варіанту відповіді № 4

15

SpinEdit1

Samples

Вибір кількості питань в тесті.

 

 

 

 

 

Примітка

 

 

 

 

 

 

 

 

SpinEdit - редактор числа. Забезпечує

 

 

 

відображення і

редагування цілого

 

 

 

числа. Цей компонент містить дві

 

 

 

кнопки

зі

 

стрілками,

які

 

 

 

використовуються

для збільшення

або

 

 

 

зменьшення значення числа.

 

 

 

 

 

Діапазон

значень

числа

задається

 

 

 

властивостями Min і Мах. Ці властивості

 

 

 

визначають, відповідно, мінімально і

 

 

 

максимально можливі значення числа.

 

 

 

Крок зміни значення при натисненні

 

 

 

кнопок зі стрілками міститься в

 

 

 

властивості

Increment. По замовченню

 

 

 

значення цієї

властивості

дорівнює

 

 

 

одиниці. Поточне значення визначається

 

 

 

властивістю Text.

 

 

 

 

 

 

 

 

 

16

GroupBox1

Standard

Панель GroupBox дозволяє об’єднати

 

 

 

 

компоненти RadioButton для того, щоб

 

 

 

кнопки взаємодіяли одна з одною в

 

 

 

 

групі (може бути натиснена тільки одна

 

 

 

кнопка з чотирьох).

 

 

 

 

 

 

 

 

 

17

RadioButton1

Standard

Вибір правильної відповіді

 

 

18

RadioButton2

Standard

 

 

 

 

 

 

19

RadioButton3

Standard

 

 

 

 

 

 

20

RadioButton4

Standard

 

 

 

 

 

 

21

Button 1

Standard

Кнопка переходу на попереднє питання

22

Button2

Standard

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

23

Button3

Standard

Запис готового тесту на диск (заповнені

 

 

 

всі питання)

 

 

 

 

 

6

Збережіть проект. У подальшому зберігайте проект і перевіряйте його працездатність після кожної зміни. Не прагніть розташовувати компоненти на свої місця. Це зробимо в програмі при створенні форми. Для цього виділіть об'єкт Form1, перейдіть на вкладку Events Інспектора об'єктів (Object Inspector), знайдіть подію OnCreat, праворуч від нього двічі клацнути лівою кнопкою миші. Попавши в код програми, треба написати наступний код:

Var Left_N : Integer; // Відступ зліва верхньої частини

Top_N : Integer; // Відступ зверху

Left_NN: Integer; // Відступ зліва для розділу відповідей

Top_NN : Integer; // Отступ сверху для RadioButton K, I K,I:Integer;

. . .

Left_N:=30;

Top_N:=50;

Left_NN:=60;

// Формування елементів форми

Form1.Width:=740;

Form1.Height:=540;

Form1.Caption:='Створення тесту';

Label1.Left:=Left_N;

Label1.Top:=Top_N;

Label1.Font.Style:=[fsBold];

Label1.Font.Size:=10; Label1.Caption:='Назва тесту'; Edit1.Text:=' ';

Edit1.Top:=Top_N;

Edit1.Left:=Left_N+Label1.Width+10;

Edit1.Width:=300;

Top_N:=Top_N+40;

Label2.Left:=Left_N; Label2.Top:=Top_N; Label2.Font.Style:=[fsBold]; Label2.Font.Size:=10; Label2.Caption:='Кількість питань'; SpinEdit1.Left:=Left_N+Label2.Width+10;

7

SpinEdit1.Top:=Top_N;

SpinEdit1.MinValue:=5;

SpinEdit1.MaxValue:=20;

SpinEdit1.Text:='5';

SpinEdit1.Width:=40;

Top_N:=Top_N+60;

Label3.Left:=Left_N;

Label3.Top:=Top_N;

Label3.Font.Style:=[fsBold];

Label3.Font.Size:=10;

Label3.Caption:='Питання № 1';

Top_N:=Top_N+40;

Label4.Left:=Left_NN;

Label4.Top:=Top_N;

Label4.Font.Style:=[fsBold];

Label4.Font.Size:=9;

Label4.Caption:='Текст';

Edit2.Text:=' ';

Edit2.Top:=Top_N;

Edit2.Left:=Left_NN+Label4.Width+10;

Edit2.Width:=600;

Left_NN:=Left_NN+Label4.Width+10;

Top_N:=Top_N+40;

GroupBox1.Left:=620;

GroupBox1.Top:=Top_N+20;

GroupBox1.Width:=90;

GroupBox1.Height:=180;

GroupBox1.Caption:=' Правильний ';

GroupBox1.Font.Size:=8;

Ми встановили властивості компонентам Label1, Edit1, Label2,

Spinedit1, Label3, Label4, Edit2, GroupBox1. Всі вони володіють різними

властивостями. Але компоненти, які описують 4 варіанти відповідей, можна

8

згрупувати - Label + Edit + RadioButton (для кожної відповіді). Компоненти кожного рядка відрізнятимуться лише значенням властивості Тор і своїми номерами. Компоненти розподіляться по рядках таким чином:

1-ий рядок - Label5, Edit3, RadioButton1

2-ий рядок - Label6, Edit4, RadioButton2

3-ий рядок - Label7, Edit5, RadioButton3

4-ий рядок - Label8, Edit6, RadioButton4

Тому виникає питання: «Яким чином можна перераховувати в програмі імена компонентів послідовно, наприклад, переходячи від Label5 до Label6,

потім до Label7

Це можна зробити, якщо скористатися методом FindComponent. Він повертає покажчик екземпляра компоненти, про яку відомо. Допустимо, що форма містить екземпляр компоненти TLabel з ім'ям Label2. Щоб отримати покажчик на екземпляр Label2 і змінити властивість Caption, можна записати:

K:=2;

TLabel(FindComponent('Label'+IntToStr(K))).Caption:= 'МІТКА';

Отже, для формування рядків варіантів відповідей в програму можна додати

текст:

// Формування розділу відповідей K:=2;

Top_NN:= -20;

For I:=1 To 4 do begin

Top_N:=Top_N+40;

Top_NN:=Top_NN+40;

TLabel(FindComponent('Label'+IntToStr(K+I+2))).Left:=Left_NN; TLabel(FindComponent('Label'+IntToStr(K+I+2))).Top:=Top_N; TLabel(FindComponent('Label'+IntToStr(K+I+2))).Font.Size:=9; TLabel(FindComponent('Label'+IntToStr(K+I+2))).Caption:='Відп овідь №'+IntToStr(I); TEdit(FindComponent('Edit'+IntToStr(K+I))).Text:=''; TEdit(FindComponent('Edit'+IntToStr(K+I))).Top:=Top_N;

9

TEdit(FindComponent('Edit'+IntToStr(K+I))).Left:=200;

TEdit(FindComponent('Edit'+IntToStr(K+I))).Width:=400;

TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Left:=

40;

TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Top:=T

op_NN;

TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Captio

n:=' ';

TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Width:

=10;

end;

І в кінці додаємо блок формування трьох кнопок.

// Формування нижньої частини форми

Top_N:=Top_N+70;

Button1.Caption:='Попередня';

Button1.Left:=Left_NN+100;

Button1.Top:=Top_N;

Button1.Width:=100;

Button1.Height:=30;

Button1.Enabled:=False;

Button2.Caption:='Наступна';

Button2.Left:=Left_NN+250;

Button2.Top:=Top_N;

Button2.Width:=100;

Button2.Height:=30;

Button3.Caption:='Записати';

Button3.Left:=Left_NN+500;

Button3.Top:=Top_N;

Button3.Width:=100;

Button3.Height:=30;

Button3.Enabled:=False;

STEP:=1; //Номер вопроса = 1

10