Лекція №12 Комбіновані типи



Скачати 73.74 Kb.
Дата конвертації23.05.2017
Розмір73.74 Kb.
Лекція №12


Комбіновані типи

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

Часто на практиці виникають в описі характеристик (властивостей) деякого об'єкту. Наприклад, об'єкт «чоловік» можна описати наступними характеристиками:


  • прізвище, ім'я і по батькові (символьні масиви і рядки);

  • рік народження (ціле);

  • сталь (тип, що перераховує, з двох значень);

  • домашня адреса (строковий тип);

Для того, щоб зв'язати цю різнорідну, але логічно зв'язану інформацію і передбачається в Turbo Pascal комбінований тип. Компоненти комбінованого типу не можна ідентифікувати порядковими номерами як в масивах, тому для їх позначення використовуються ідентифікатори. Таким чином, опис запису складається із списку описів елементів, які називаються полями запису. Кожне поле запису схоже на опис змінною.

Запис record.end;

Наприклад:

Type Person = record


Surname: String [15]; {прізвище}

Name: String [15]; {ім'я}

Fathername: String [15]; {по батькові}

Year: Integer; {рік народження}


Sex: (male, female) {стать}

Homeaddress: String; {домашня адреса}

End;

Фіксовані записи

Структура запису складається з фіксованого числа полів (компонент), кожне з яких має ім'я і тип. Імена всередині запису не повинні співпадати, але можуть бути однаковими в різних записах, наприклад:



Type Person = record

Name: String [15];

Surname: String [15];


Man = record

Surname: String [20];

Name: String [10];

End;
Записи відображаються в пам'яті, як і масиви, тобто послідовно компонента за компонентою. У структурі типу array всі компоненти мають однакову розмірність (r1= r2 =.rn) Адреса i- ої компоненти обчислюються ai = (i- 1)*r, тобто адреса знаходиться зсувом щодо початкової адреси.

У записі ai = r 1+ r2+.+ri-1, тобто обчислювати значення зсув при кожному зверненні до компоненти не дробно. Зсув обчислюється один раз для всіх компонент, результати заносяться в таблицю, яка пов'язує ім'я поля з його зсувом.

Для звернення до поля запису використовується конструкція, звана селектором запису, який вимагає вказівки імені поля, а не його індексу. Ім'я поля указується після імені змінної типу запису через крапку.
Наприклад, в розділі

Var


P1, p2: Student;

P3: Man;


звернення до полів матиме вигляд:

P1.Name= ‘Ганна’;

P2. Sex= female;

P3. Surname= ‘Іваненко’;

P1.Sex= p2. Sex;
Комбіновані типи можна використовувати для побудови складніших структур. Наприклад, масивів тих, що складаються із записів або записів, що складаються із записів.


  1. Масив, що складається із записів.

Type


Group = array [1..30] of student;

Var


Group Ia-61, Ia-62, Ia-63: Group;

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

Group_61[1]. Name: =’Piter’;

Group_62[2]. Year:=1978;

If Group_62[I]. Name=Group.63 [I]. Name then

Writeln (Group_62[I]. Name);




  1. Записи містять поле, що мають тип запис. Наприклад, ввести рік народження і оцінки.

Type


Student=record

Surname: String [15];

Name: String [15];

FatherName: String [15];

BirthDay: record

Month: (Jan, Feb, Mar, Apr, May, June, July, Aug, Sept

Oct, Nov, Dec);

Day: 1..31;

Year: integer;

End;


Marks: record

Prog: byte; { програмування}

Math: byte; { математика}

Nach: byte; {нар. геометрія}

End;

End;


Можна:

Type


TbirthDay=record

Month: (jar.dec);

Day: 1..31;

Year: integer;

End;

Tmarks: record



Prog: byte;

Math: byte;

Nach: byte;

End;


Student=record

SurName: String [15];

Name: String [15];

FatherName: String [15];

BirthDay: TbirthDay;

Sex: (male, femeal);

HomeAddres: string;

Marks: Tmarks;

End;

Var P1, P2: Student;



P1.marks.prog: =5;

P1.birthday.year: =1978;

P2.birthday.month: =may;
Праворуч від ‘.’ (крапки) – ідентифікатор поля запису.

Зліва – змінна типу запис.


При зверненні до поля запису використовуються складені імена. Програма стає громіздкою.

Можемо загальний для всіх ідентифікатор запису винести в заголовок з допомогою



оператора приєднання.
Наприклад.

Можна представити у вигляді

With P1.BirthDay do

Begin P1.BirthDay.Month: =may;

P1.BirthDay.Day: =15;

P1.BirthDay.Year: =1978;


Month: =may;

Day: =15;

Year: =1978;

End;


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

Наприклад, оцінки за семестри, в кожному семестрі різні предмети.

Якщо використовувати фіксовані записи, то в типі Student необхідно передбачити поле для всіх предметів що вивчаються за час навчання у вузі. Це приводить до


  • зниження читаності програми;

  • не економічному використанню пам'яті, оскільки д.б. виділена пам'ять під всі поля оцінок, а в кожному семестрі фактично використовуватиметься тільки декілька полів, що описують оцінки за останній семестр (тобто пам'ять виділяється тільки під max варіант, а останні накладаються на неї)

Type

Tmarks1 = record

Math1: byte;

Prog1: byte;

Nach: byte;

End;


Tmarks2 = record

Math2: byte;

Prog2: byte;

Phys1: byte;

End;

Student = record { фіксована частина запису}



Surname: String [15];

Name: String [15];

FatherName : String [15];

BirthDay: TbirthDay;

Sex: (male, female);

HomeAddres: String;

{ варіантна частина запису}

Case Semestr: Byte of

1: (Marks1: Tmarks1);

2: (Marks2: Tmarks2);

End;


  1. Починається варіантна частина службовим словом case, потім поле-ознака і декілька варіантних компонент. Semestr – поле ознаки; Marks1 і Marks2 – альтернативні.




  1. Закінчується варіантна частина службовим словом end, тлбто у визначенні комбінованого типу може бути тільки одна варіантна частина, яка задає такі записи.




  1. Ідентифікатори полів у всіх варіантах повинні бути різні і відрізнятися від ідентифікаторів полів фіксованої частини.




  1. Якщо варіантна частина відсутня, то після ‘:’ коштує порожній список вигляду ( ).

Змінна типу «запис» може брати участь тільки в операціях привласнення Group.Ia_61:=Group.Ia_62.

Поле запису може брати участь у всіх операціях застосовних до типу цього поля.
Type

Zap = record

X, Y: integer;

End;


Var

Z: zap;


With zap do

Begin


. {X: =5, у: =100}

End;
Всередині оператора with можуть використовуватися і змінні, що не відносяться до запису.


Program main;

Var а, b: integer;

Zap: record

X, у: integer;

End;

Begin


A: =1; B: =2;

With zap do

Begin

X: =a+7;


Y: =b-1;

End;


Якщо імена змінних співпадають:
Program main;

Var x, у: integer;

.

With zap do begin



X:=7+main.x;

y:=main.y-1;

End;

Типізовані константи тпу запис
Приклади константи типу «запис»
Type

Rec = record

R: real;

B: Boolean;

C: char;

End;


Array of Rec = array [1.3] of Rec;

Rec of Array = record

ArrInt: array [1.. 3] of integer;

ArrChar: array [1..3] of Char;

End;

Rec of Rec = record



I: integer;

S: String;

Z: Rec;

End;


Const Crec = (R: 2.7; B: true; C: ‘ A’);

ArrRec: array of Rec = ((R: 1.7; B: True; C:’A’), (R: 2.7; B: false; C: ‘ B’),

(R: 3.7; B: true; C: ‘ C’));

RecArr: Rec of Array = (ArrInt: (1,2,3); ArrChar: (‘1’,’2’,’3’));



RecRec: Rec of Rec = (I: 15; S:’Year’; z: (R: 1.7; B: true; C:’*’));

У варіантних константах-записах допускається вказівка тільки того варіанту полів, який відповідає встановленою заздалегідь константі поля ознаки.


База даних захищена авторським правом ©lecture.in.ua 2016
звернутися до адміністрації

    Головна сторінка