Інтервальні типи даних. Оператор TYPE. Масиви b>
p>
С.А. Григор'єв p>
Інтервальний тип - це деякий підтип порядкового
типу даних (згадаємо, що порядкові типи - це ShortInt, Byte, Integer, Word,
LongInt, Char і Boolean). Нехай, наприклад, деяка мінлива в програмі
може приймати значення від -1 до 99. Ми могли б описати її як LongInt або
Integer (безглуздо!), Могли б описати її як ShortInt, що досить розумно. Але
можна створити для неї і спеціальний тип даних, який об'єднує лише числа від -1
до 99: p>
VAR x:
-1 .. 99; p>
Замість імені одного з стандартних типів ми
використовували в описі змінної побудований нами власний інтервальний
тип. Таким чином описана мінлива x може приймати лише значення
-1,0,1 ,..., 99, в іншому вона нічим не відрізняється від інших цілих змінних.
Її можна вводити, виводити, використовувати в якості змінної циклу,
підставляти у вирази і т.п. Будь-інтервальний тип є підтип деякого
стандартного базового типу, в нашому випадку - типу ShortInt. Але якщо б ми стали
використовувати інтервальний тип -1 .. 200, то він би вже був підтипом типу Integer,
а 0 .. 200 - підтипом типу Byte. Компілятор Паскаля самостійно аналізує
інтервальні типи і підбирає для них мінімальний відповідний базовий тип. Це
потрібно знати, щоб визначати розмір та спосіб кодування ваших змінних. Ви
можете виконати оператор p>
WRITE ( 'мінлива x: -1 .. 99 займає
', SizeOf (x),' байт'); p>
і переконатися, що її розмір дійсно дорівнює 1. p>
Як базовий типу можна використовувати не тільки
арифметичні типи, але і типи Char і Boolean (правда, в останньому випадку це
досить безглуздо). Опишемо, наприклад, змінну, значення якої можуть
бути тільки маленькі латинські літери: p>
VAR Letter: 'a' .. 'z'; p>
або змінну, в якій можуть зберігатися російські
літери: p>
VAR
RusLetter: 'А' .. 'я'; p>
У загальному випадку інтервальний тип описується як p>
константні
вираз 1 .. вирази зі сталими 2, p>
де обидва вирази мають один порядковий тип і друга
з них не менше першого. Створеним вами типами ви можете давати імена, для
цього використовується оператор TYPE: p>
TYPE ім'я типу = опис типу; p>
Оператори TYPE так само, як і всі інші оператори
опису, записуються в розділі описів. У програмі може бути скільки
завгодно операторів TYPE, і їх можна чергувати з іншими операторами опису,
але будь-які ідентифікатори, використані в описі типу, мають бути описані
раніше. Після того, як певний тип отримав ім'я, ви надалі можете
користуватися цим ім'ям замість повного опису типу: p>
CONST Tmin =- 5; p>
Tmax = 15; p>
TYPE T_Range_Type = Tmin .. Tmax; p>
VAR
t: T_Range_Type; p>
TYPE T_Range_SubType = Tmin +3 .. Tmax-5; p>
VAR
t1: T_Range_SubType; p>
Зауважимо, що хороший програміст завжди дає імена
власним типами, причому старається, щоб ці імена були осмисленими. p>
Тепер, знаючи про інтервальних типах, ми можемо говорити
про масивах. Масив у всіх мовах програмування - це безліч
індексованих (пронумерованих) однотипних елементів. У Паскалі опис
одновимірного масиву має вигляд: p>
ARRAY [тип індексу] OF тип елементу p>
Тут тип індексу - ShortInt, Byte, Char, Boolean або
інтервальний тип; тип елемента - будь-який тип, у тому числі і масив. Ви помітили,
що не всі порядкові типи можна використовувати як тип індексу, це не означає,
що, наприклад, тип Word чимось гірше типу Byte. Таке обмеження обумовлене
тим, що в Паскалі ніякої об'єкт не може мати розмір більше (64К - 2) байти,
або 65534 байти. Це обмеження діє і для інтервальних типів, так ви
можете описати масив VAR a: ARRAY [1 .. 65534] OF BYTE; p>
але не масив VAR a:
ARRAY [1 .. 65535] OF BYTE; p>
і не масив VAR a: ARRAY [1 .. 33000] OF WORD; p>
Більше ніяких обмежень на тип індексу не
накладається. Тип елементів масиву може бути будь-яким - цілочисельності,
речовим, символьним, логічним, інтервальним. Елементи масиву можуть бути
масивами, тоді ви отримаєте масив розмірністю більше ніж 1. Опишемо кілька
масивів: p>
VAR a: ARRAY [Char] OF 1 .. 5; p>
- масив із 256 елементів, кожен з яких є
ціле число від 1 до 5, індекси елементів змінюються від 0 до # # 255; p>
CONST Max = 99; p>
Min = 10; p>
TYPE Nums =
Min .. Max; p>
TYPE ArrayType =
ARRAY [-10 .. 0] OF Nums; p>
VAR a:
ArrayType; p>
- масив з 11 елементів з індексами від -10 до 0,
кожен елемент - ціле позитивне число з двох цифр; p>
TYPE IndexType =
'a' .. 'z'; p>
VAR a:
ARRAY [IndexType] OF BOOLEAN; p>
- масив з 26 елементів з індексами від 'a' до 'z',
кожен елемент - логічна змінна. p>
У програмі ви можете використовувати як масиви
цілком, так і окремі елементи масивів. Елемент одновимірного масиву
записується у вигляді: p>
ім'я
масиву [індексне вираз] p>
індексне вираз - це будь-який вираз
відповідного типу. Якщо елемент масиву - не масив, то з ним можна
виконувати будь-які операції, дозволені для простих змінних відповідного
типу. Цілому масиву можна лише привласнювати масив того ж типу. Зауважимо, що
якщо масиви описані в програмі таким чином: p>
VAR a:
ARRAY [1 .. 3] OF REAL; p>
b, c, d: ARRAY [1 .. 3] OF REAL; p>
TYPE Massiv = ARRAY [1 .. 3] OF REAL; p>
VAR e, f: Massiv; p>
g
: Massiv; p>
h, i
: Massiv; p>
то масиви b, c, d - однотипні і масиви e, f, g, h, i теж
однотипні, але масиви a і b (a і c, a і d) мають різний тип; і масиви b
(c, d, a) і e (f, g, h, i) теж мають різний тип! Компілятор вважає, що дві
змінні мають один і той же тип, тільки якщо вони описані в одному операторі
через кому, або імена їх типів однакові! Запам'ятайте це дуже важливе
правило. p>
Запишемо приклад програми, що використовує (поки
одномірні) масиви: p>
(програма вводить масив із N цілих чисел, де N не
перевершує 20, і виводить його в порядку неубиванія) p>
CONST Nmax = 20; p>
TYPE IndexType = 1 .. Nmax; p>
Massiv = ARRAY [IndexType] OF Integer; p>
VAR a: Massiv; i, j, N: IndexType; t:
Integer; p>
BEGIN
WRITELN; p>
REPEAT
WRITE ( 'Введіть довжину масиву від 1 до', Nmax, ''); p>
READ (N);
WRITELN; p>
UNTIL (N> = 1) AND (N <= Nmax); p>
(
Вводимо масив поелементно) p>
WRITELN ( 'Введіть
елементи масиву'); p>
FOR i: = 1 TO N DO
READ (a [i ]); p>
(
Сортуємо елементи масиву за неубиванію. Використовуємо дуже простий, але p>
неефективний алгоритм сортування - порівнюємо
кожен елемент з кожним p>
і, якщо перша більше друге, міняємо їх місцями) p>
FOR i: = 1 TO N-1 DO FOR j: = i 1 TO N DO p>
IF a [i]> a [j] THEN BEGIN t: = a [i];
a [i]: = a [j]; a [j]: = t; END; p>
(
Виводимо відсортований масив поелементно) p>
WRITELN ( 'Результат сортування :'); p>
FOR i: = 1 TO N DO WRITE (a [i]: 8); p>
END. p>
Зверніть увагу на алгоритм перестановки двох
елементів! Запис a [i]: = a [j]; a [j]: = a [i];, очевидно, привела б до невірного
результату. Використаний нами алгоритм сортування цілком надійний, але не дуже
гарний, тому що виконує багато зайвих операцій. Чи не становить праці
удосконалити його - для кожного i від 1 до N-1 знайдемо найменший з
елементів ai, ai +1, ... , AN і помістимо його на i-те місце; такий алгоритм
виконує стільки ж порівнянь, скільки і початковий, але вимагає
істотно меншої кількості перестановок. p>
FOR i: = 1 TO N-1 DO BEGIN p>
a_max: = a [i]; n_max: = i; p>
FOR j: = i 1 TO N DO p>
IF a [j]
IF n_max <> i THEN BEGIN
a [n_max]: = a [i]; a [i]: = a_max; END; p>
END; p>
Як бачите, запис алгоритму декілька довше, і
треба було два нових змінних a_max - типу Integer і n_max - типу
IndexType. Це дію універсального закону збереження - з двох вірних
алгоритмів кращий, як правило, складніше. p>
Тепер перейдемо до розгляду багатовимірних масивів.
Розмірністю, або кількістю вимірів масиву, називається кількість індексів
у елемента масиву, але не кількість елементів у масиві. Ми вже знаємо, що
елемент масиву може бути масивом, тому двовимірний масив можна описати,
наприклад, так: p>
VAR a:
ARRAY [1 .. 10] OF ARRAY [1 .. 20] OF Real; p>
змінну a можна розглядати як одновимірний масив
одновимірних масивів і використовувати в програмі запис виду a [i]; але можна
розглядати і як двовимірний масив дійсних чисел. Елемент цього масиву
записується в програмі у вигляді a [індексне вираз, індексне вираз]
і є змінною типу Real, наприклад, a [i 1,3]. Втім, можна записати і
так: a [i +1] [3], обидві ці записи еквівалентні. Опис багатовимірних масивів
також можна записувати компактно: замість p>
ARRAY [t1] OF ARRAY [t2] OF ARRAY ... OF t; p>
можна записати p>
ARRAY [t1, t2, ... ] OF t; p>
Втім, бувають випадки, коли перший опис
краще. Тепер, вміючи працювати з багатовимірними масивами, напишемо
програму, перемножуються два квадратні речові матриці: p>
CONST Nmax = 20; (максимальний розмір матриці) p>
TYPE IndexType = 1 .. Nmax; p>
Matrix
= ARRAY [IndexType, IndexType] OF Real; p>
VAR
a, b, c: Matrix; n, i, j, k: IndexType; p>
BEGIN
WRITE ( 'введіть розмір матриць'); READ (n); p>
IF (n <1) OR (n> Nmax) THEN BEGIN p>
WRITELN ( 'невірний розмір!'); Halt; END; p>
WRITELN ( 'введіть
матрицю A порядково'); p>
FOR i: = 1 TO n DO
FOR j: = 1 TO n DO READ (a [i, j ]); p>
WRITELN ( 'введіть
матрицю B порядково'); p>
FOR i: = 1 TO n DO
FOR j: = 1 TO n DO READ (b [i, j ]); p>
FOR i: = 1 TO n DO FOR j: = 1 TO n DO
BEGIN p>
c [i, j]: = 0; FOR k: = 1 TO n DO
c [i, j]: = c [i, j] + a [i, k] * b [k, j]; END; p>
WRITELN ( 'матриця A * B :'); p>
FOR i: = 1 TO n DO FOR j: = 1 TO n DO WRITE (c [i, j ]); p>
WRITELN; p>
END. p>
Наша програма спрацювала правильно, але отриману
матрицю вивела погано - всі елементи підряд без поділу на рядки. Виправимо алгоритм виведення: p>
FOR i: = 1 TO n DO BEGIN p>
FOR j: = 1 TO n DO WRITE (c [i, j]: 8); p>
WRITELN; p>
END; p>
Тепер матриця виводиться акуратно. p>
У Паскалі допускаються типізовані константи --
масиви, список значень елементів масиву задається в круглих дужках і
розділяється комами: p>
CONST a: ARRAY [1 .. 5] OF Byte = (1,2,3,4,5); p>
c: ARRAY [0 .. 3] OF
Char = ( 'a', 'b', 'c', 'd'); p>
b: ARRAY [1 .. 1] OF
Boolean = (FALSE, TRUE, FALSE); p>
Символьні масиви можна ініціалізувати і більше
простим способом: p>
CONST c: ARRAY [0 .. 3] OF Char = 'abcd'; p>
Якщо ініціалізується багатовимірний масив, то,
оскільки кожен його елемент є масив, потрібно використовувати вкладену
скобочную структуру: p>
CONST A: ARRAY [1 .. 3,1 .. 2] OF Real =
((0,1), (2,4), (3,5 )); p>
Яким саме чином згрупувати значення елементів,
легко зрозуміти, згадавши, що масив ARRAY [1 .. 3,1 .. 2] OF Real є насправді
компактна запис опису ARRAY [1 .. 3] OF ARRAY [1 .. 2] OF Real. p>
Отже, ми дізналися, що крім величин відомих нам
арифметичних, символьного, логічного типу та інтервальних типів, кожна з
яких має одне значення, існують масиви - сукупності багатьох значень.
Перші величини називаються скалярними, а масиви і ряд інших типів, поки нам
не відомих, структурованими величинами. p>
Список літератури h2>
Для підготовки даної роботи були використані
матеріали з сайту http://elib.albertina.ru/
p>