
- •1 Виділення слів у текстових файлах
- •1.1 Підготовка до лабораторної роботи
- •Теоретичні відомості
- •Варіанти завдань
- •1.4 Контрольні питання
- •2 Комбінований тип даних
- •2.1 Підготовка до лабораторної роботи
- •2.2 Теоретичні відомості
- •2.3 Варіанти завдань
- •2.4 Контрольні питання
- •3 Сортування масивів комбінованого типу даних
- •3.1 Підготовка до лабораторної роботи
- •3.2 Теоретичні відомості
- •3.3 Варіанти завдань
- •3.4 Контрольні питання
- •4 Підпрограми-процедури
- •4.1 Підготовка до лабораторної роботи
- •4.2 Теоретичні відомості
- •4.3 Варіанти завдань
- •4.4 Контрольні питання
- •5 Підпрограми-функції
- •5.1 Підготовка до лабораторної роботи
- •5.2 Теоретичні відомості
- •5.3 Варіанти завдань
- •Контрольні питання
- •6 Організація односпрямованого списку
- •6.1 Підготовка до лабораторної роботи
- •6.2 Теоретичні відомості
- •6.3 Варіанти завдань
- •6.4 Контрольні питання
- •7 Обробка матриць у середовищі lazarus
- •7.1 Теоретичні відомості
- •7.2 Варіанти завдань
- •7.3 Контрольні питання
- •Перелік посилань
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.