Все структуровані типи даних, з якими ми вже познайомилися, являють собою сукупності однотипних величин. Комбінований тип даних - це структурований тип, що складається з фіксованого числа компонент (полів) різного типу. Комбінований тип має ще й іншу назву - запис.
Зазвичай запис містить сукупність різнотипних атрибутів, що відносяться до одного об'єкту. Наприклад, анкетні відомості про студента вузу можуть бути представлені у вигляді інформаційної структури (рис. 35).
Така структура називається дворівневим деревом. У Паскалі ця інформація може зберігатися в одній змінної типу Record (запис). Задати тип і описати змінну можна наступним чином:
Curs: 1..5; (Або елементи)
Var Student: Anketa1;
Такий запис, так само як і відповідне їй дерево, називається дворівневою.
До кожного елементу записи можна звернутися, використовуючи складене ім'я, яке має наступну структуру:
<имя переменной>.<имя поля>
Наприклад, student. fio; student. dat і т.п. Якщо, наприклад, потрібно полю курс привласнити значення 3, то це робиться так:
Поля запису можуть мати будь-який тип, зокрема самі можуть бути записами. Така можливість використовується в тому випадку, коли у Вас можуть запитати багаторівневе дерево (більше 2 рівнів). Наприклад, ті ж відомості про студентів можна відобразити трирівневим деревом (рис.36).
Така організація даних дозволить, наприклад, робити вибірки інформації за роком народження або по місту, де живуть студенти. У цьому випадку опис відповідного запису буде виглядати так:
Var Student: Anketa2;
Поля такого запису, що знаходяться на третьому рівні, ідентифікуються потрійним складовим ім'ям.
Наприклад, student.Dat.God; student.Adres.Gorod.
Наведемо структурограмму завдання комбінованого типу (мал.37).
У програмі можуть використовуватися масиви записів. Якщо на факультеті 500 студентів, то все анкетні дані про них можна уявити в масиві:
Var Student: Array [1..500] Of Anketal;
В такому випадку, наприклад, рік народження п'ятого в списку студента зберігається в змінної student [5] .Dat.God.
Будь-яка обробка записів, в тому числі введення і виведення, проводиться поелементно. Наприклад, введення відомостей про 500 студентів можна організувати таким чином:
For I: = 1 Те 500 Do
With Student [I] Do
Write ( 'Пол (м / ж):'); ReadLn (Pol);
Write ( 'Дата народження:'); ReadLn (Dat);
Write ( 'Стипендія (руб.):'); ReadLn (Stip)
У цьому прикладі використаний оператор приєднання. який має наступний вигляд:
With <переменная типа запись> Do <оператор>;
Він дозволяє, один раз вказавши ім'я змінної типу запис після слова With, працювати в межах оператора з іменами полів як зі звичайними змінними, т. Е. Писати громіздких складових імен.
Робота з файлами записів. Найчастіше записи використовуються як елементи файлів, складових комп'ютерні інформаційні системи. Розглянемо приклади програм, що працюють з файлами записів.
Приклад 1. Сформувати файл FM.dat, що містить екзаменаційну відомість однієї студентської групи. Записи файлу складаються з наступних елементів: прізвище, ім'я, по батькові; номер залікової книжки; оцінка.
Var Fstud: File Of Stud;
Write ( 'Кількість студентів в групі?');
Write (I: 1, '- й, Прізвище І.О.'); ReadLn (S.FIO);
Write ( 'Номер заліковки:'); ReadLn (S.Nz);
WriteLn ( 'Формування файлу закінчено!');
Перш ніж перейти до наступного прикладу, пов'язаного з обробкою сформованого файлу, розглянемо ще один засіб роботи з файлами, яке ми поки не обговорювали.
Прямий доступ до записів файлу
У стандарті мови Паскаль допустимо тільки послідовний доступ до елементів файлу. Однією з додаткових можливостей, реалізованих в Турбо Паскалі, є прямий доступ до записів файлу.
Тут FV - ім'я файлової змінної, n - порядковий номер елемента. У наступному прикладі ця процедура буде використана.
Приклад 2. Є файл, сформований програмою з попереднього прикладу. Нехай деякі студенти перездати іспит і отримали нові оцінки. Скласти програму внесення результатів переекзаменування в файл. Програма буде запитувати номер студента у відомості і його нову оцінку. Робота закінчується, якщо вводиться неіснуючий номер (9999).
Var Fstud: File Of Stud;
Write ( 'Номер в відомості?');
While N<>9999 Do
Write ( 'Номер в відомості?');
Приклад вимагає деяких пояснень. Список студентів у відомості пронумерований, починаючи від 1, а записи в файлі нумеруються від 0. Тому, якщо n - це номер у відомості, то номер відповідного запису в файлі дорівнює n-1. Після прочитання записи «номер n-1» покажчик зміщується до наступної n-й записи. Для повторного занесення на те саме місце виправленої записи повторюється установка покажчика.