Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабороторные 2 семестр.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
435.71 Кб
Скачать

2.1 Підготовка до лабораторної роботи

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

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

Комбінований тип даних є гнучким механізмом, що дозволяє об'єднати в одну структуру різні за типом елементи (поля). Конкретний комбінований тип даних містить фіксовану кількість полів.

При визначенні комбінованого типу задається ім'я кожного поля і його тип. Наприклад, для того, щоб зберігати назву книги, прізвище автора та рік видання, створюється комбінований тип IZDANIE з трьома полями:

TYPE IZDANIE = RECORD

NAME, AVTOR: STRING;

YEAR:1800..2015

END;

VAR BOOK : IZDANIE;

При зверненні до конкретного поля необхідно вказати ім'я змінної комбінованого типу та ім'я цього поля. Назва запису і назва поля повинні бути розділені крапкою.

BOOK.NAME:= 'УЧИТЕСЬ ПРОГРАММИРОВАТЬ';

BOOK.AVTOR:= 'Г.ДЖОНСТОН';

BOOK.YEAR:= 1989;

WRITELN (BOOK.NAME:20, BOOK.AVTOR:15, BOOK.YEAR:5);

Більш компактно виглядає звернення до полів запису, якщо використовувати оператор приєднання WITH:

WITH BOOK DO

WRITELN (NAME,AVTOR,YEAR);

На базі комбінованого типу даних можуть бути побудовані інші складові типи. Наприклад, для створення списку книг можна використовувати масив записів:

VAR BIBL: ARRAY[1..50] OF IZDANIE;

I:INTEGER;

BEGIN

FOR I:=1 TO 50 DO

READ (BIBL[I].NAME,BIBL[I].AVTOR,BIBL[I].YEAR);

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

TYPE DATE = RECORD

DAY: 1..31;

MONTH: 1..12;

YEAR: 1960..2012

END;

PERSON = RECORD

FAM,NAME: STRING[20];

DAT_R:DATE;

POL: CHAR;

END;

VAR

STUDENT: PERSON;

BEGIN

READ(STUDENT.FAM:20, STUDENT.NAME:15, STUDENT.DAT_R.DAY:4,

STUDENT.DAT_R.MONTH:4, STUDENT.DAT_R.YEAR:6,

STUDENT.POL:3);

Доступ до полів елемента STUDENT провадиться за загальними правилами: зліва від символу «крапка» завжди повинна знаходитися змінна типу запис (STUDENT, DAT_R), а праворуч ідентифікатор поля цього запису.

Якщо при роботі зі стандартними текстовими файлами INPUT, OUTPUT введення-виведення запису здійснюється тільки по полях, то при обробці файлу з компонентами комбінованого типу введення з файлу або виведення в нього виконується цілком записами.

VAR

F:FILE OF PERSON;

STUDENT:PERSON;

BEGIN

ASSIGN(F,'TEST.DAT');

RESET(F);

READ(F,STUDENT);

WRITELN('Введений запис: ');

WRITELN(' прізвище -',STUDENT.FAM:20,'им’я -', STUDENT.NAME:15);

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

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

TYPE

IZDANIE = RECORD

NAME,AVTOR: STRING;

YEAR:1800..2015

END;

VAR

BIBL:IZDANIE;

F:FILE OF IZDANIE;

BEGIN

ASSIGN(F,’SPISOK.RCD’);

REWRITE(F);

READLN(BIBL.NAME);

WHILE BIBL.NAME<>’*’ DO

BEGIN

READLN(BIBL.AVTOR);

READLN(BIBL.YEAR)

WRITE(F,BIBL);

READLN(BIBL.NAME);

END;

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

УЧИТЕСЬ ПРОГРАММИРОВАТЬ

Г. ДЖОНСТОН

1989

БАЗЫ ДАННЫХ

А.Д. ХОМОНЕНКО

2003

и т.д.

Програма, яка формує файл комбінованого типу з текстового файлу:

TYPE IZDANIE = RECORD

NAME,AVTOR: STRING;

YEAR:1800..2012

END;

VAR

BOOK : IZDANIE;

F:TEXT;

R: FILE OF IZDANIE;

BEGIN

ASSIGN(F,'DAN.PAS');

RESET(F);

ASSIGN(R,'TEST.DAT');

REWRITE( R);

WHILE NOT EOF(F) DO

BEGIN

READLN(F,BOOK.NAME);

READLN(F,BOOK.AVTOR);

READLN(F,BOOK.YEAR);

WRITE(R,BOOK)

END;

END.

У багатьох завданнях строго певна структура запису обмежує її застосування. Тому передбачені записи, що містять довільне число компонент. Вони називаються записами з варіантами і складаються з необов'язковою фіксованого та варіантної частин. Остання формується за допомогою оператора case. Він задає особливе поле запису - поле ознаки, яке визначає, який з варіантів в даний момент буде активізований. Варіантні поля вказуються після фіксованих; компоненти кожного варіанта полягають в круглі дужки; у частині case немає окремого слова end. Якщо в розглянутому вище прикладі потрібно вибір одиниць довжини для вимірювання довжини ребра куба, то до запису можна ввести варіантну частину:

info = record

c : string[7];

m : string[13];

case L : char of

‘м’ : (milim : word);

‘с’ : (cantim : longint);

end;

Приклад. Вивести список книг заданого автора і підрахувати кількість книг, що видані за останні п'ять років.

TYPE IZDANIE = RECORD

NAME,AVTOR: STRING;

YEAR:1800..2015

END;

VAR BOOK : IZDANIE;

R: FILE OF IZDANIE;

AV:STRING;

GOD, KOL:INTEGER;

BEGIN

ASSIGN(R,'TEST.DAT');

RESET ( R);

WRITELN(‘ ВВЕДІТЬ АВТОРА ’);

READLN(AV);

WRITELN(‘ВВЕДІТЬ ПОТОЧНИЙ РІК ’);

READLN(GOD);

KOL:=0;

WRITELN(‘ СПИСОК КНИГ ЗАДАНОГО АВТОРА ');

WHILE NOT EOF(R) DO

BEGIN

READ(R, BOOK);

{ виведення списку книг заданого автора }

IF BOOK.AVTOR=AV THEN

WRITELN(BOOK.NAME);

{ підрахунок кількості книг, випущених за останні п'ять років }

IF BOOK. YEAR =GOD-5 THEN INC(KOL);

END;

WRITELN( КОL,’ Книг виДАНІ ЗА ОСТАННІ П'ЯТЬ РОКІВ ’)

END.