Комбінований тип даних
Комбінований тип даних (записи)
Розбір з прикладу
Працюючи з масивами основне обмеження у тому, кожен елемент повинен мати той самий тип. Але при вирішенні багатьох завдань виникає необхідність зберігати та обробляти сукупності даних різного типу.
Приклад
Для кожного з 25 учнів класу відомі прізвище та оцінка (у балах) з п'яти дисциплін. Потрібно обчислити середню оцінку кожного учня та вибрати людину, яка має максимальний середній бал.
У цьому випадку прізвище може бути представлене рядком з 15 символів, оцінка - це ціле число, а середній бал повинен бути представлений дійсним числом. У Паскалі для опису комбінацій об'єктів різних типів використовуються записи.
Запис - це структурований тип, що містить набір різних типів об'єктів. Об'єкти, що складають запис, називаються її полями. У записі кожне поле має власне ім'я. Щоб описати запис, необхідно вказати його ім'я, імена об'єктів, що становлять запис та їх типи. Загальний вигляд такий:
Type "ім'я запису" =Record "поле 1" : "тип 1"; "поле 2": "тип 2";. "поле n" : "тип n"End ;
Дані на вирішення завдання можна описати як запис так:
Type pupil =Record fam: String[15]; b1, b2, b3, b4, b5: 2. 5; sb: RealEnd; ;

Змінна типу puple матиме сенс структури, що містить інформацію, що характеризує одного учня. Організація цієї структури показано на рис.1.
Щоб зберігати в пам'яті ЕОМ інформацію про всіх 25 учнів класу, необхідно ввести масивklass, який представляє масив записів:
Var klass: Array[1.25] Of pupil;
Примітки
- Імена полів, що становлять запис, не повинні повторюватися.
- Кожне поле запису може мати будь-який тип (крім файлового), зокрема воно може бути знову записом.
Доступ до полів запису
Його можна здійснити двома способами.
-
Вказівкою імені змінної та імені поля. Наприклад, klass[2].fam, klass[3].sb, klass[1].b4. Тому введення прізвищ та оцінок учнів, тобто елементів масиву klass, можна задати так:
Для i: = 1 To 25 Do Begin Readln(klass[i].fam); Readln(klass[i].b1); Readln(klass[i].b2); Readln(klass[i].b3); Readln(klass[i].b4); Readln(klass[i].b5); End;
Використання оператора приєднання, який дозволяє здійснювати доступ до полів запису, так, якби вони були простими змінними. Його загальний вигляд:
With Do .
Всередині оператора до компонентів запису можна звертатись лише за допомогою імені відповідного поля.
Приклад
For i : = 1 To 25 Do З класом [i] Do Begin Readln (fam); ReadLn (b1, b2, b3, b4, b5); End;
Програма для розв'язання задачі може бути записана в наступному вигляді:
Program Example_54 ; Typepupil = Record fam : String[15]; b1, b2, b3, b4, b5: 2..5; sb: Real;End; Var klass: Array[1..25] Of pupil; p: pupil; i, m: Integer; sbmax: Real;Begin For i:=1 To 25 Do Якщо [i] Do Begin Writeln ('Введіть прізвище та п'ять оцінок') ; Readln(fam); ReadLn(b1, b2, b3, b4, b5); End; For i:=1 To m Do З klass[i] Do sb:=(b1+b2+b3+b4+b5)/5; sbmax:=0; Для i:=1 To m Do If klass[i].sb>=sbmax Thensbmax:=klass[i].sb; Для i:=1 To m Do If klass[i].sb=sbmax Then З klass[i] Do Writeln(fam:20,'-',sb:6:3); Readln;End.
Приклад
Визначте дату завтрашнього дня.
Нехай дата вводиться так:
1 2 1997
Перша цифра – це число, друга – місяць, третя – рік. Тоді можна описати запис дати таким чином:
Function Dmonth (mm: month; yy: year): day ;Begin Case mm Of 1, 3, 5, 7, 10, 12 : Dmonth := 31; 4, 6, 9, 11: Dmonth: = 30; If Leap (yy) Then Dmonth := 29 Else Dmonth := 28; End;End ;
Begin Writeln ('Введіть сьогоднішнє число, місяць і рік'); Readln(dat.d,dat.m,dat.y); Tomorrow(dat,next); Writeln('Завтра буде'); Writeln(next.d,'.',next.m,'.',next.y); Readln;End.
- Написати програму, яка визначає:
- дату наступного (попереднього) дня;
- дату, яка настане через mднів;
- дату, яка була за m днів до сьогодення;
- кількість діб, що пройшли від дати t1 до t2;
- день тижня, що випадає на дату t1, якщо відомо, що першого дня нашої ери був понеділок.
Type time =Record h : 0..23; m, s: 0..59End ;
- логічну функцію для перевірки, чи передує час t1 часу t2 (у межах доби);
- процедуру, що надає параметру t1 час, на 1 секунду більше часу t (врахувати зміну доби).
Const n = 300;Type MyRecord =Record Key : Integer; Name : String;End ;Var Table = Array[1..n] Of MyRecord;
Вважаючи, що у таблиці записи маютьрізні ключі, описати:
- процедуру, що впорядковує запис таблиці зі спадання значень поля Key;
- логічну функцію пошук (Т,К,Н), що визначає, чи є в таблиці Т (всі записи якої вже впорядковані за зростанням значень поля Key) запис зі значенням поля Key, рівним К, і, якщо є, присвоює номер параметру Н.