Зверніть увагу на те, що для функції Ord нумерація серед значень йде, починаючи від нуля. Для останнього значення не можна застосовувати функцію Succ, для першого - Pred.
Змінні різних перераховуваних типів несумісні один з одним.
Безліч стандартних порядкових типів в мові Паскаль насправді визначені як перераховувані. Це типи Char, Integer, інші. Достоїнства стандартних порядкових типів лише в тому, що над кожним з них вже визначені специфічні дії. Наприклад, тип Boolean описаний так:
TypeBoolean = (False, True);
Єдина його відмінність від перераховуваних типів, визначуваних програмістом, полягає в тому, що значення типу Boolean можна виводити на екран. Можете перевірити, Ord(False)=0.
Цікаво, що змінна перераховуваного типу може бути лічильником в циклі "з параметром".
Під час виконання на екрані з'являться числа "2" і "5", що відповідає номерам значень Green і Magenta.
Наступний тип, який можна визначити в програмі, - тип-діапазон.
Тут не треба перераховувати усі значення цього типу, тому, що можливими для нього є значення піддіапазону вже визначеного до нього будь-якого порядкового типу (стандартного або описаного раніше перераховуваного типу). Досить лише вказати початкову і кінцеву величину відрізку порядкового типу. Єдина умова: початкове значення не повинне перевищувати кінцеве.
Формат опису отрезочного типу :Type<Ім'я типу>=<Нач.>.<Кон.>;
Приклади:Type
Age=0.150; {Ціле число в інтервалі від 0 до 150}Lat='A'. 'Z'; {Заголовні букви латинського алфавіту}Month=(January, February, March, April, May, June, July, August, September, October, November, December);Spring=March.May; {Весняні місяці}
Є ще одна можливість визначити новий тип, про існування якої можна було б і здогадатися.
Type<Ім'я типу>=<Ім'я раніше певного або стандартного типу>;
Приклад:TypeNumber=Byte;
Масиви
Досі ми розглядали змінні, які мали тільки одно значення, могли містити в собі тільки одну величину певного типу. Виключенням були лише строкові змінні, які є сукупністю даних символьного типу, але і при цьому ми говорили про рядок, як про окрему величину.
Ви знаєте, що комп'ютер призначений в основному для полегшення роботи людини з великими інформаційними об'ємами. Як же, використовуючи тільки змінні відомих вам типів, зберегти в пам'яті і обробити дані, що містять десяток, сотню, тисячу чисел або, приміром, рядків? Адже такі завдання зустрічаються у будь-якій області знання. Звичайно, можна завести стільки змінних, скільки даних, можна навіть занести в них значення, але тільки представте, якої величини буде текст такої програми, скільки часу знадобиться для його складання, як багато місця для можливих помилок? Природно, про це замислювалися і автори мов програмування. Тому в усіх існуючих мовах є типи змінних, що відповідають за зберігання великих масивів даних. У мові Паскаль вони так і називаються: "масиви".
Масивом називатимемо впорядковану послідовність даних одного типу, об'єднаних під одним ім'ям. До речі, під це визначення підходить безліч об'єктів з реального світу: словник (послідовність слів), мультфільм (послідовність картинок) і т. д. Найпростіше уявити собі масив у вигляді таблиці, де кожна величина знаходиться у власному осередку. Положення осередку в таблиці повинне однозначно визначатися набором координат (індексів). Найпростішою є лінійна таблиця, в якій для точної вказівки на елемент даних досить знання тільки одного числа (індексу). Ми з вами доки займатимемося тільки лінійними масивами, оскільки складніші структури будуються на їх основі.
Опис типу лінійного масиву виглядає так:
Type <Ім'я типу>=Array [<Діапазон індексів>] Of <Тип елементів>;
Індексами можуть виступати змінні будь-яких порядкових типів. При вказівці діапазону початковий індекс не повинен перевищувати кінцевий. Тип елементів масиву може бути будь-яким (стандартним або описаним раніше).
Описати змінну-масив можна і відразу (без попереднього опису типу) в розділі опису змінних :
Var <Змінна-масив> : Array [<Діапазон індексів>] Of <Тип елементів>;
Приклади опису масивів :
Var
S, BB: Array [1.40] Of Real;N: Array ['A'.'Z'] Of Integer;R: Array [- 20.20] Of Word;T: Array [1.40] Of Real;
Тепер змінні S, BB і T є масивами з сорока дійсних чисел; масив N має індекси символьного типу і цілочисельні елементи; масив R може зберігати в собі 41 число типу Word.
Єдиною дією, яку можливо зробити з масивом цілком, - привласнення. Для цього прикладу опису згодом допустимий наступний запис: S:=BB;
Проте, привласнювати можна тільки масиви однакових типів. Навіть масиву T присвоїти масив S не можна, хоча, здавалося б, їх описи співпадають, зроблені вони в різних записах розділу опису.
Ніяких інших операцій з масивами цілком зробити неможливо, але з елементами масивів можна працювати точно також, як з простими змінними відповідного типу. Звернення до окремого елементу масиву робиться за допомогою вказівки імені усього масиву і в квадратних дужках - індексу конкретного елементу. Наприклад:R[10] - елемент масиву R з індексом 10.
Фундаментальна відмінність компонента масиву від простої змінної полягає в тому, що для елементу масиву в квадратних дужках може стояти не лише безпосереднє значення індексу, але і вираження, що призводить до значення індексного типу. Таким чином реалізується непряма адресація
BB[15] - пряма адресація;
BB[K] - непряма адресація через змінну K, значення якої буде використано в якості індексу елементу масиву BB.
Така організація роботи з такою структурою даних, як масив, дозволяє використовувати цикл для заповнення, обробки і роздруку його вмісту.
Якщо ви пам'ятаєте, з такою формою організації даних ми зустрічалися, коли вивчали строкові змінні. Дійсно, змінні типу String дуже близькі за своїми властивостями масивам типу Char. Відмінності в наступному: строкові змінні можна було вводити з клавіатури і роздруковувати на екрані (із звичайним масивом це не проходить); довжина строкової змінної була обмежена 255 символами (255 B), а для розміру масиву критичним об'ємом інформації є 64 KB.
Тепер розглянемо декілька способів заповнення масивів і виведення їх вмісту на екран. В основному ми користуватимемося числовими типами компонент, але наведені приклади будуть справедливі і для інших типів (якщо вони допускають вказані дії).
Program M1;VarA : Array [1.20] Of Integer;Begin
A[1]:=7; {Заповнюємо масив значеннями (окремо кожен компонент)}A[2]:=32;A[3]:=-70;............. {Трудомістке завдання?}A[20]:=56;Writeln(A[1],A[2],A[3], ?,A[20])
End.
Як би не був примітивний наведений приклад, він все ж ілюструє можливість безпосереднього звернення до кожного елементу масиву окремо. Правда, ніякої переваги масиву перед декількома простими змінними тут не видно. Тому - інший спосіб: