Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Pascal.rtf
Скачиваний:
11
Добавлен:
19.02.2016
Размер:
2.69 Mб
Скачать

Тема 9 Структура типів даних мови Паскаль

Загальна характеристика типів даних мови Паскаль

Всю множину типів мови Паскаль можна розділити на декілька груп (рис. 23).

До простих типів даних відносяться порядкові та дійсні типи.

Порядкові типи відрізняються тим, що кожний з них має обмежену кількість можливих значень. Наприклад, змінні цілочисельного типу byte може змінюватися в діапазоні від 0 до 127 і приймає тільки цілі значення. Таким чином кількість можливих значень обмежена. Тип char включає 256 символів, тобто кількість можливих значень, що приймає змінна цього типу також кінцеве. Не говорячи вже про логічний тип boolean, для якого змінна може приймати тільки 2 значення: true або false.

На відміну від порядкових типів для дійсні типи неможливо перелічити всі значення, які може приймати змінна. Довести це дуже просто. Розглянемо інтервал від 0.1 до 0.2. До нього входять 0.11, 0.111, 0.1111 і так далі. Хіба можна перелічити всі дійсні числа, що потрапляє у цей маленький інтервал?

Але треба пам’ятати те, що при поданні в ЕОМ кількість припустимих значень дійсних типів все ж таки обмежена внутрішнім форматом, але навіть це не дає можливості перелічити всі можливі значення.

В темі №2 цього лекційного курсу детально були розглянуті цілочисельні, символьні, логічні та дійсні типи даних. Тема №7 присвячена масивам та рядкам, також в ній розглядаються тип перелічення та діапазон. Тема №8 стосується файлового типу. Об’єктний тип даних буде розглянутий при вивченні теми “Об’єктно-орієнтований підхід до розробки програмного забезпечення”, типи покажчиків в темі “Динамічний розподіл пам’яті”, процедурний тип після теми “Підпрограми”, що не ввійшли до першої частини конспекту.

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

Тип запис мови Паскаль

Дуже часто у програмах необхідно обробляти набори даних різних типів як єдине ціле. Наприклад, якщо вводити у програму дані з екзаменаційної відомості: прізвище студента (описується типом string), номер залікової книжки (цілочисельний тип), екзаменаційна оцінка (тип-діапазон 2..5 на базі цілочисельного). Всі ці дані пов’язані між собою і повинні оброблятися як єдине ціле. Враховуючи те, що студентів в групі не більше 30, можна було би використовувати масив, але дані різнотипні, тому простий масив використати неможна.

У таких випадках для найдоцільнішим буде використання типу запис.

Запис – це складний тип даних, що включає декілька частин – полів запису і кожне поле описується певним типом. Змінна – запис описується типом record , після якого задаються назви полів запису та їх тип. Опис закінчується ключовим словом end:

Var

<ім’я запису> = record

<ім’я поля 1> : <тип поля 1>;

<ім’я поля 2> : <тип поля 2>;

. . .

<ім’я поля М> : <тип поля М>;

end;

Для того щоб спростити собі процедуру опису змінної – запису, подамо необхідні дані у вигляді таблиці з назвою “СТУДЕНТ”:

Прізвище студента

Номер заліков. книжки

Оцінка

Шапка цієї таблиці складається з трьох полів, тобто і запис буде мати три поля. Залишилося визначитися з типом кожного поля:

Прізвище студента

Номер заліков. книжки

Оцінка

string [20]

word

2..5

Тепер опишемо змінну типу запис для збереження даних про студента:

Var

Student : record

FIO : string[20]; { поле для зберігання прізвища}

Numb : word; { поле з номером заліковки}

Mark : 2..5; { поле - оцінка}

end;

Для того щоб змінній студент присвоїти значення, необхідно звертатися окремо до кожного поля:

Student.FIO:=’Іваненко П.П.’;

Student.Numb:= 345;

Student.Mark:= 5;

Тепер змінна Student зберігає дані про студента Іваненко П.П., у якого номер заліковки 345, і який на іспиті отримав оцінку 5.

Таким чином, для того щоб полю запису присвоїти якісь значення необхідно вказати ім’я запису та через крапку ім’я поля. Це називається операцією розкриття запису:

< ім’я запису > . < ім’я поля > := < значення > ;

Оператор приєднання

Для того щоб спростити доступ до полів і не повторювати кожен раз ім’я запису, використовується оператор приєднання:

with < ім’я запису > do

< ім’я поля > := < значення > ;

Присвоєння даних запису Student буде виглядати так:

with Student do

begin

FIO:=’Іваненко П.П.’;

Numb:= 345;

Mark:= 5;

end;

Зверніть увагу на те, що в наведеному прикладі використовується операторні дужки (begin – end), тому що після do, згідно з правилами мови Паскаль, може виконуватися тільки один оператор, а необхідно – три, тому вони згруповані в один складений оператор.

Опис власного типу даних

Найчастіше при роботі з записом описують спочатку тип запису, а потім цей тип використовують при описі змінних. Опис типів, як вже говорилося в попередніх темах, здійснюється в розділі TYPE. Давайте опишемо тип запису для “нашого бідного студента”:

Type

StudentType = record

FIO : string[20];

Numb : word;

Mark : 2..5;

end;

Тепер можна описати змінну:

Var

Student : StudentType;

Використання масиву записів

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

StudentGroup : array [1..30] of StudentType;

Для доступу до елементів масиву використовується операція індексування та розкриття запису:

StudentGroup [1] . FIO := ‘Андрейченко‘;

StudentGroup [1] . Numb := 367;

StudentGroup [1] . Mark := 5;

або з оператором приєднання:

with StudentGroup [1] do

begin

FIO:=’Андрейченко’;

Numb:= 367;

Mark:= 5;

end;

Якщо проводити, наприклад, введення елементів масиву, то підійде такий оператор циклу:

for i:=1 to 30 do

with StudentGroup [i] do

begin

Write (‘Введіть прізвище ’ , i:3, ‘ студента :’);

Read (FIO);

Write (‘Введіть номер його заліковки :’);

Read (Numb);

Write (‘Введіть його оцінку :’);

Read (Mark);

end;

Використання вкладених записів

Будь-яке поле запису може мати також складну структуру, тобто бути також записом. Наприклад, розглянемо структуру даних, в якій повинно зберігатися прізвище людини та її адреса (місто, вулиця, № будинк, № квартири). У табличній формі ці дані будуть виглядати так:

Прізвище

Адреса

Місто

Вулиця

будинку

Квартира

Відповідно поля будуть мати такі типи:

Прізвище

Адреса

Місто

Вулиця

будинку

Квартира

string[20]

string [12]

string[20]

byte

word

Поле “Адреса” складається з 4 частин і є також записом. Мовою Паскаль тип для запису такої структури описується так:

Type

ManType = record

FIO: string[20];

Address: record

Misto: string [12];

Vul: string[20];

Bud: byte;

Kv: word;

end;

end;

Для адреси також можна записати окремий тип, тоді загальний опис запису зміниться так:

Type

AddressType = record

Misto: string [12];

Vul: string[20];

Bud: byte;

Kv: word;

end;

ManType = record

FIO: string[20];

Address: AddressType ;

end;

Опишемо змінну цього типу:

Var

Man: ManType ;

Для доступу до полів поля адреси необхідно використовувати подвійну операцію розкриття запису:

Man . Adress . Misto := ‘Київ’;

Man . Adress . Vul := ‘Хрещатик’;

Man . Adress . Bud := 1;

Man . Adress . Kv := 26;

Якщо до оператора приєднання занести повторювану частину, о отримаємо:

with Man . Adress do

begin

Misto := ‘Київ’;

Vul := ‘Хрещатик’;

Bud := 1;

Kv := 26;

end;

Запис з варіантною частиною*

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

Type

Figure = (Square, Triangle, Circle);

Param = record

X, Y: Real;

Case Figе: Figure of

Square: (Side: Real);

Triangle: (Side1, Side2, Angle: Real);

Circle: (Radiuse: Real);

end;

Var

MySquare, MyTriangle, MyCircle: Param;

Варіантна частина починається зі слова Case, за яким слідує змінна вибору варіанта (в наведеному прикладі Figе) з описом типу. Далі вказуються константи, значення яких може приймати змінна вибору (у прикладі Square, Triangle, Circle, які були описані в типі-переліченні Figure). За кожною константою після двох крапок у дужках описуються поля варіантної частини запису з описом типу. Дужки є необхідними, навіть якщо варіантна частина відсутня для даного варіанту. Треба відмітити, що варіантна частина не завершується своєю операторною дужкою end, так як звичайна конструкція Case, так як далі йде завершальна операторна дужка end всього типу.

В стандарті мови Паскаль перед тим як використовувати один з варіантів запису, змінній вибору варіанта треба присвоїти відповідне значення:

MySquare. Fige:= Square;

MySquare. Side:= 15.5;

MySquare.x:=0.5;

MySquare.y:=7.5;

В Turbo Pascal цю операцію виконувати не обов’язково, але, якщо змінна вибору задана, її значення можна переглянути в програмі, для того щоб визначити, який був заданий варіант. [1]

Тип множина

З терміном множина всі знайомляться в курсі математики. Множина – це набір однотипних логічно пов’язаних між собою об’єктів [3]. Мова програмування Паскаль надає для утворення множин спеціальний тип даних, який будується на базі порядкових типів (аналогічно типу-діапазон):

set of <перелічення припустимих значень>;

Розглянемо приклади опису власних типів-множин на базі символьного і цілочисельного типів:

Type

Digits = set of ‘0’..’9’;

AlphaBet = set of ‘A’..’Z’;

Alpha_Dig = set of ‘0’..’9’, ‘A’..’Z’;

Dig_int = set of 0..9;

Double_dig= set of 10..99;

Var

D:Digit;

A:AlphaBet;

Dig:Double_dig;

Кількість елементів множини не може перевищувати 256. Елементи внутрі множини нумеруються від 0 до 255 (номер можна отримати за допомогою функції ord).

Ініціалізація змінних відбувається за допомогою конструктору множини – списку елементів множини, які перелічуються через кому:

D:=[ ‘0’, ’3’..‘5’, ‘9’];

A:= [];

Dig:=[11, 22, 33, 44, 55, 66, 77, 88, 99];

Зверніть увагу на те, що елемента, які записуються до множина задаються у квадратних дужках. Якщо вказати путі квадратні дужки (змінна А), то множина буде пустою.

Операції над множинами

Над множинами припустимі такі операції:

* пересічення множин. Результат містить елементи, що є спільними для обох множин. Припустимо задані дві множини:

Var

A,B,С:set of 1..10;

Їм присвоєні такі значення:

A:=[1,3,5,7,9]; B:=[3,4,8,9,10];

Тоді С:=А*В дасть [3,9].

+ об’єднання множин. Результат містить елементи обох множин. С:=А+В дає [1,3,4,5,7,8,9,10].

- різниця множин. Результат містить елементи першої множини, що не входять до другої. С:=А-В дає [1,5,7].

= перевірка еквівалентності множин. Результат дорівнює true, якщо множини еквівалентні.

< > перевірка нееквівалентності множин. Результат дорівнює true, якщо множини нееквівалентні.

<= перевірка входження, повертає true, якщо перша множина включена до другої.

>= перевірка входження, повертає true, якщо друга множина включена до першої.

in перевірка належності певного значення до елементів множина, повертає true, якщо елемент належить множині. Першим операндом цієї операції має бути вираз, результат, якого співпадає з базовим типом множини. Другий операнд – множина, або конструктор множини:

3 in A дає true;

7*7 in B дає false.

Додатково до цих операцій можливо використовувати дві процедури:

INCLUDE (< множина > , < елемент > ) – включає новий елемент до множини.

EXCLUDE (< множина > , < елемент > ) – виключає з множини заданий елемент.

На різницю від операцій + та – ці процедури виконують дії над елементом і множиною, а не над двома множинами.

Опис типізованих констант-записів та констант-множин

Визначення типізованих констант-записів має вигляд:

< ім’я константи > : < тип запису > = (< список значень полів >) ;

< ім’я константи > - довільний правильний ідентифікатор;

< тип запису > - ідентифікатор типу запису, який декларований в розділі type;

< список значень полів > включає ідентифікатори полів, дві крапки, значення полів, які задаються у круглих дужках і розділяються крапкою з комою:

(< ідентифікатор поля 1> : < значення поля 1 >;

< ідентифікатор поля 2> : < значення поля 2 >; і так далі );

Наприклад;

type

TZero = record

x,y,z:real;

end;

Const

Zero: TZero = (x:0; y:0; z:0);

Визначення типізованих констант-множин має вигляд:

< ім’я константи > : < тип множини > = < конструктор множини > ;

< ім’я константи > - довільний правильний ідентифікатор;

< тип запису > - ідентифікатор типу множини, який декларований в розділі type;

< конструктор множини > - перелічення значень елементів, що подаються у квадратних дужках.

Type

Seconds = set of 0..59;

Digits = set of ‘0’..’9’;

Const

Half_min: Seconds = [0..29] ;

Empty : Digits = [ ];

Контрольні запитання за темою

  1. На які групи можна розділити всю множину типів мови Паскаль? Дайте коротку характеристику типів кожної групи.

  2. Для чого використовується тип запис мови Паскаль? Як описуються змінна цього типу?

  3. Як проводиться ініціалізація полів запису? Що таке розкриття запису?

  4. Для чого використовується оператор приєднання? Наведіть синтаксис його опису.

  5. Як описується власний тип даних запис?

  6. Як описується масив записів? Як здійснюється доступ до елементів цього масиву та їх полів?

  7. Як здійснити введення / виведення елементів масиву записів?

  8. Для чого і як використовуються записи з варіантною частиною? Чи може бути в записі дві варіантні складові?

  9. Що таке множина і як вона описується у програмі мовою Паскаль?

  10. Чи обмежена кількість елементів множини? Чи може бути пуста множина?

  11. Що таке конструктор множини, для чого він використовується і який в нього синтаксис опису?

  12. Які операції над множинами ви знаєте і які правила їх застосування?

  13. Для чого використовуються процедури INCLUDE та EXCLUDE? Чим вони відрізняються від операцій + та - ?

  14. Як описуються типізовані константи-записи?

  15. Як описуються типізовані константи-множини?