Тема 3 Регулярні та змінні типи даних. Процедури і функції

Лекція 8

 

Класифікація типів в мові Паскаль. Регулярні типи даних — масиви. Доступ до елементів масиву. Стрічкові типи даних

Структуровані типи даних:

  Раніше розглядалися скалярні дані. Це означає, що здійснювалася обробка неподільних значень деякого типу. Навіть, якщо в програмі викликається багато скалярних величин одного типу, але вони не є незалежними, то їх не можна вважати деякими структурами даних. Структурування передбачає об’єднання складених даних в єдині складені структури, що обробляються і розміщуються в пам’яті як одне ціле. Одним із способів структурування є формування так званих регулярних структур даних. До них відносять масиви, рядки, множини.

а) Регулярні типи – масиви.

Масиви – структури даних, які є об’єднанням в одне ціле деякої фіксованої кількості однотипних елементів. Оголошуються масиви за допомогою службового слова array, після якого вказується розмір масиву, кількість елементів, а також тип самих елементів масиву.

TYPE<ідентифікатор типу >= ARRAY[<діапазон індексів>, <діапазон індексів >,…] OF<тип елементів > ;

Отже, масив (array) – це скінчений набір елементів одного (базового) типу, які зберігаються в послідовно розташованих комірках оперативної пам’яті і мають спільну назву.

Масив даних характеризуються іменем, кількістю елементів і типом елементів.

Імена масивам надає користувач. Елементи визначають тип масиву. Кількість елементів (розмір) масиву найчастіше задають у вигляді діапазону або назви деякого перерахованого типу даних. Кожний елемент масиву можна відшукати, знаючи його номер та ім’я масиву. Номер елемента називають індексом.

В якості діапазонів індексів можуть викликатися інтервали одного із дискретних типів.

Кількість діапазонів визначає розмірність масиву:

1 діапазон – одновимірний масив;

2 діапазони – двовимірний ( таблиці, матриці);

n діапазонів – n-вимірний.

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

Наприклад:

Type

rainbow =(red, orange, yellow, blue, dark blue, magenta);

vector = array [1..3] of real;

mas1 = array[‘A’..’Z’] of byte;

mas2 = array[1..8,’A’..’H’] of byte;

mas3 = array[false,true, red..yellow] of char;

mas4 =array[-100..-50] of vector;

 

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

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

x:= mas1; y:= mas4;

або явним чином

a: array[1..26] of byte;

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

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

У випадку багатовимірних масивів елементи їх розміщуються послідовно в пам’яті в порядку задання розмірностей.

Якщо масиви використовуються в якості типізованих констант, то їх константні значення задаються переліком значень всіх елементів по кожній розмірності, елементи 1-ї розмірності обмежуються дужками. Якщо ж більше ніж одна, то кожен наступний рівень передбачає зовнішньою парою дужок.

Над елементами масиву можна виконувати такі дії: введення, присвоєння, виведення та всі інші дії, які визначені над даними відповідного типу.

Робота з масивами складається з 3-х етапів:

1)     заповнення масиву даними (введення даних у масив);

2)     перетворення масиву (дії з даними);

3)     виведення масиву чи окремих даних на екран.

Масив даних можна створити або за результатами дослідів, або знаючи формулу його елементів.

Якщо відома формула, за якою задаються елементи масиву, то масив створюють (заповнюють) за допомогою циклу for (або while, або repeat).

Наприклад, створити масив з перших 20 цілих чисел і обчислити суму всіх його елементів.

program Sum_massiv;

coust n=20;

var a: array [1…20] of integer;

i, s : integer;

begin

                   for i := 1   to    n    do

                    begin

                   a [i] := i;

                             s:= s + a [i]

 end;

writeln (s)

end.

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

Головні прийоми опрацювання масивів:

- щоб визначити елементи масиву, які задовольняють умову задачі, потрібно переглянути і проаналізувати всі елементи масиву за допомогою команд циклу і розгалуження;

- з елементами масиву можна виконувати такі ж дії, як і з простими даними відповідних типів (числовими чи текстовими);

-   опрацьовують масиви поелементно (тобто виконують дії не з масивом, а з кожним його елементом). Доступ до кожного елемента забезпечує змінна з індексом (наприклад, a[i]). Такий вид доступу називається прямим.

Ми розібралися, як використовуються одновимірні масиви (лінійні таблиці). З двовимірними масивами (двовимірними таблицями) будь-хто з вас вперше зустрілися ще на уроках математики у молодших класах.

Так, наприклад, таблиця додавання і множення чисел від 1 до 9 – приклади двовимірних таблиць, масивів з 2 вимірами. Щоб вказати елемент такої таблиці, потрібно задати 2 індекси – номер рядка (індекс m) і номер стовбця (індекс n). Так, напраклад, а[5,6]=11.

У прямокутні (двовимірні) масиви записують результати експериментів, спостережень, обчислень.

Елементи двовимірного масиву визначаються іменем масиву та двома індексами: перший індекс означає номер рядка, а другий – номер стовпця, на перетині яких стоїть елемент. Індекси записують у прямокутних дужках і відокремлюють комою. Наприклад, a[1,2], a[3,5].

Оголошення типу двовимірного масиву, який має n рядків і m стовбців описують у розділі type так:

type MyMassiv=array [1..n, 1..m] of <базовий тип>;

або у розділі оголошення змінних:

var a: array [1..n,1..m] of <базовий тип>;

Двовимірні масиви можна оголошувати як статичні масиви з наданням значень їхнім елементам у розділі const.

Двовимірні масиви створюють і виводять на екран у вигляді таблиці за допомогою циклу for. Проте у пам’яті комп’ютера елементи масиву розташовані в послідовних комірках, рядок за рядком, а саме: b[1,1], b[1,2], …, b[1,n], b[2,1], b[2,2], …, b[2,n], …, b[m,1], b[m,2], …, b [m,n].

Над елементами масиву визначені дії, характерні для даних базового типу.

Розглянемо приклад програми для формулювання таблиці множення (таблиця Піфагора), занесення її до двовимірного масиву й виведення на екран:

program Pifagor;

coust n=9;

var p: array [1…n, 1…n] of integer;

     i, j, s : integer;

begin

                   for   i :=1   to    n   do                     

for   j :=1   to   n    do

                             a [i, j] := i*j;

for i := 1  to    n  do                   

begin

for j :=1    to    n   do

                             write (a [i, j]: 5)

writeln;

end;

end.

  б) Регулярний тип – рядки символів:

Структура даних, елементи якої є символами у Pascal є рядки символів. За способом організації і розміщення у пам’яті подібні до масивів. Їх відносять до однієї групи складених типів – регулярних.

Рядок – це деякий набір однотипних елементів. Проте їх кількість може змінюватися, але не перевищує деякої фіксованої межі

У ранніх версіях Pascal рядки навіть оголошувалися як масиви (упорядковані масиви символів).

В Turbo Pascal рядки символів оголошуються службовим словом STRING. При оголошенні може задаватися граничне значення довжини рядка, що слідує після слова string у квадратних дужках.

Це значення може лежати в межах від 0 до 255.

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

Величини записуються в апострофах.

Наприклад:

Var

S1: string;

S2: string[6];

S1:=’ABCDEFGH’;

S2:=S1; {S2=’ABCDEF’}

Для того, щоб апостроф сам став символом, а не лише його обмеженням, він повинен бути записаний двічі.

В пам’яті під рядки символів відводяться ділянки, кількість байт яких на одиницю більше від вказаної граничної довжини. Додатковий байт, який має нульовий номер, містить символ, код якого дорівнює реальній межі рядка. Якщо реальна менша від граничної, відведенні, але не використанні байти містять пусті символи, код яких дорівнює нулю.

Реальну довжину рядка легко змінити, при цьому інформація, яка знаходиться в хвості ділянки не втрачається і відновлюється, якщо повернутися до початкової довжини.

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

При роботі із окремими елементами рядка слід пам’ятати, що цей елемент матиме типу char і для окремих стандартних підпрограм, що працюють з рядками він буде незастосовний.

Зауваження Рядок з одного символу і окремий символ типу char не одне і теж.

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

Об’єднання (конкатенація).

Конкатенація – приєднання одного рядка в кінець іншого.

Наприклад:

S:=’і’ + ‘ стань’ + ‘ зіркою’; {і стань зіркою}

Якщо результат конкатенації перевищує граничну довжину, то надлишок просто ігнорується.

Операція порівняння

Два рядки рівні, якщо вони мають однакову кількість елементів і елементи відповідні рівні.

Наприклад:

S1: string;

S2:string;

S1:= ‘ABCD’;                 {S1=S2}

S2:= ‘ABCD’;

Порівняння рядків проводиться по-байтно, починаючи з першого символа.

 

Контрольні запитання:

1. Що таке масив.

2. Доступ до елементів масиву.

3. Рядки символів.