Комбінований тип даних

Комбінований тип даних (записи)

Розбір з прикладу

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

Приклад

Для кожного з 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;

Примітки

  1. Імена полів, що становлять запис, не повинні повторюватися.
  2. Кожне поле запису може мати будь-який тип (крім файлового), зокрема воно може бути знову записом.

Доступ до полів запису

Його можна здійснити двома способами.

    Вказівкою імені змінної та імені поля. Наприклад, 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.

  1. Написати програму, яка визначає:
  1. дату наступного (попереднього) дня;
  2. дату, яка настане через mднів;
  3. дату, яка була за m днів до сьогодення;
  4. кількість діб, що пройшли від дати t1 до t2;
  5. день тижня, що випадає на дату t1, якщо відомо, що першого дня нашої ери був понеділок.
  • Дано час, описаний наступним чином:
  • Type time =Record h : 0..23; m, s: 0..59End ;

    1. логічну функцію для перевірки, чи передує час t1 часу t2 (у межах доби);
    2. процедуру, що надає параметру t1 час, на 1 секунду більше часу t (врахувати зміну доби).

    Const n = 300;Type MyRecord =Record Key : Integer; Name : String;End ;Var Table = Array[1..n] Of MyRecord;

    Вважаючи, що у таблиці записи маютьрізні ключі, описати:

    1. процедуру, що впорядковує запис таблиці зі спадання значень поля Key;
    2. логічну функцію пошук (Т,К,Н), що визначає, чи є в таблиці Т (всі записи якої вже впорядковані за зростанням значень поля Key) запис зі значенням поля Key, рівним К, і, якщо є, присвоює номер параметру Н.
  • Дано масив, що містить інформацію про учнів деякої школи.
  • Заповнити другий масив даними про учнів лише дев'ятих класів;
  • З'ясувати, наскільки людей у ​​восьмих класах більше, ніж у дев'ятих.
  • Багаж пасажира характеризується кількістю речей та загальною вагою речей. Дано масив, що містить відомості про багаж кількох пасажирів. Відомості про багаж кожного пасажира є записом з двома полями: одне поле цілого типу (кількість речей) та інше - дійсне (вага в кілограмах).
  • Знайти багаж, середня вага однієї речі, в якому відрізняється не більше ніж на 0,3 кг від загальної середньої ваги однієї речі;
  • Знайти число пасажирів, що мають більше двох речей та кількість пасажирів, кількість речей яких перевищує середню кількість речей;
  • З'ясувати, чи є пасажир, багаж якого складається з однієї речі вагою менше 30 кг