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

Тема 7 Організація масивів даних

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

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

Отже, масив – набір фіксованої кількості значень (елементів), що груповані під одним іменем. Кожному елементу масиву присвоюється свій порядковий номер – індекс, за яким ми отримуємо доступ до значення елемента. Елементи масиву повинні бути одного типу, котрий називається базовим типом масиву. Схематично масив поданий на рис. 14.

П

Рис. 14. Схематичне подання масиву

MAS ®

1

2

3

4

5

6

7

еред нами сукупність елементів одного типу, але різних за значенням. Кількість елементів 7. Елементи груповані під спільним ім’ям MAS. Для того щоб отримати значення певного елементу масиву MAS необхідно звернутися до нього за індексом. Наприклад, щоб отримати значення:

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

< ім’я масиву > [< номер елемента >]

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

Опис масиву в Паскаль – програмі задається так:

VAR

< ім’я масиву > : ARRAY [ < тип індексів > ] OF < тип елементів > ;

< тип індексів > - може бути або

  1. тип діапазон;

  2. тип перелічення.

< тип елементів > - будь – який тип мови Паскаль або тип, заданий користувачем в розділі TYPE.

Індексація елементів масиву

Тип діапазон

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

VAR

A : 1..10;

В : ‘a’ .. ‘n’;

Змінна А – це цілочисельна змінні, але її значення обмежене діапазоном від 1 до 10; В – символьна змінна, її значення обмежене діапазоном від ‘a’ до ‘n’.

Зручно тип діапазон описувати в розділі TYPE :

TYPE

< ім’я типу – діапазону > = <нижня межа> .. <верхня межа>;

Diapaz_int = 1 ..10;

Diapaz_char = ‘a’ .. ‘n’;

VAR

A : Diapaz_int ;

B : Diapaz_char ;

Цей опис змінних А і В аналогічний попередньому.

Типи Diapaz_int та Diapaz_char можна використовувати при описі масивів.

VAR

С : ARRAY [Diapaz_int] OF REAL;

D : ARRAY [Diapaz_char] OF REAL;

Масив С містить 10 елементів, елементи проіндексовані від 1 до 10, кожний елемент буде типу REAL. Наприклад:

Індекс

1

2

3

4

5

6

7

8

9

10

С

0,1

-3,75

5,2

3,7

-0,56

45,2

100,0

47,0

25,36

6,47

Масив D містить 14 елементів, кожний елемент буде типу REAL. Треба звернути увагу, що індекси елементів цього масиву будуть вже не цілочисельними, а символьними. Наприклад:

Індекс

‘a’

‘b’

‘c’

‘d’

‘e’

‘f’

‘m’

‘n’

D

1,1

1,8

2,4

-4,6

5,22

6,0

7,1

4,1

При зверненні до елементів масивів:

C[1] дає 0,1

D[‘a’] дає 1,1

C[2] дає -3,75

D[‘b’] дає 1,8

C[10] дає 6,47

D[‘n’] дає 4,1

Тип перелічення

Тип перелічення задається переліченням значень, які може приймати змінна. Кожне значення іменується певним ідентифікатором. Список цих ідентифікаторів подається в дужках. Наприклад:

TYPE

COLOR = ( RED, GREEN, BLUE);

Всередині типу COLOR елементи перелічення впорядковані : RED < GREEN < BLUE. Кожному елемент у перелічення відповідає певне значення цілого типу, яке визначається порядком перелічення: перший елемент у списку отримує значення 0, другий – 1, третій –2 і так далі. Максимальне припустиме значення 65536. Таким чином тип перелічення може розглядатися, як скорочений опис набору цілочисельних констант зі значеннями 0, 1, 2 …

Використання типу перелічення збільшує наочність програми.

До змінних типу перелічення застосовуються, окрім операцій порівняння, операції PRED, SUCC, ORD.

PRED ( GREEN) = RED ;

SUCC ( RED ) = GREEN ;

ORD ( RED ) = 0.

Нажаль для змінних типу перелічення не можна використовувати арифметичні операції та операції введення / виведення ReadLn та WriteLn.

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

TYPE

WEEK = (SUN,MON,TUE,WEN,TH,FRI,SAT);

VAR

W: ARRAY [WEEK] OF INTEGER ;

DAY: WEEK;

BEGIN

.........

FOR DAY:=SUN TO SАT DO

.........

END.

W

SUN

MON

TUE

WEN

TH

FRI

SAT

11

8

2

-4

22

6

1

Операції над масивами

А рифметичні та логічні операції, операції порівняння, присвоєння та введення / виведення виконуються тільки над окремими елементами масиву, а не над масивом в цілому.

Тому для зручної роботи з елементами масиву використовують цикли (найчастіше – цикли з параметром).

Приклад 4.

Знайти суму елементів цілочисельного масиву А (10).

VAR

A : array [1..100] of integer;

S, i : integer;

Begin

S:=0;

for i:=1 to 10 do

begin

ReadLn (A[i]);

S:=S+A[i];

end;

WriteLn (‘S = ‘ , S);

End.

Багатовимірні масиви

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

Двомірний масив (матриця) задається так:

ім’я масиву >: array [<тип інд_рядків >, <тип інд_стовпців >] of <тип елементів >;

Звернення до елемента масиву :

<ім’я масиву > [<індекс рядка >, <індекс стовпця >].

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

Тривимірний масив задається так:

< ім’я масиву >: array [<тип інд1 >, <тип інд_2 >, <тип інд_3 >] of <тип елементів >;

Звернення до елемента масиву :

<ім’я масиву > [<індекс_1>, <індекс_2>, <індекс_3>].

Var

MAS : array [1..3, 1..3] of < тип елементів >;

Рис. 16. Двовимірний масив

MAS

1

2

3

1

2

3

MAS[2,1] MAS[1,2] MAS[3,3]

CUB : array [1..3, 1..3, 1..3] of < тип елементів >;

Введення / виведення масивів

Одномірні масиви

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

Const N=10;

Var i:byte;

A: array [1..N] of real;

Далі у програмі необхідно задати цикл, у якому будуть перебиратися елементи масиву, починаючи з 1 до N:

for i:=1 to N do

ReadLn ( A[i] );

Таким чином на першій ітерації циклу буде введений елемент А1, на другій – А2, на третій – А3 і так далі, доки не буде введений А10.

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

for i:=1 to N do

WriteLn ( A[i] );

Схема алгоритму для введення / виведення елементу масиву наведена на рис. 18.

Для формування рядка-підказки під час введення масиву можна трошки модифікувати наведений вище цикл:

for i:=1 to N do

begin

Write (‘Введіть А[’ , i, ‘]: ’);

ReadLn ( A[i] );

end;

Тоді на екрані для першого елемента з’явиться підказка:

Введіть А [1] :

для другого:

Введіть А [2] :

і так далі, що значно прикрасить та полегшить введення.

Двовимірні масиви

Індексація елементів двовимірного масиву здійснюється за допомогою двох індексів – індексів рядка та стовпця. Тому при введенні / виведенні необхідно використовувати два цикли. Припустимо, що необхідно ввести елементи матриці В, що описується так:

C onst N=10;

Var i, j : byte;

В: array [1..N, 1..N] of real;

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

for i:=1 to N do

for j:=1 to N do

ReadLn ( B[i, j] );

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

for i:=1 to N do

for j:=1 to N do

WriteLn ( B[i, j] );

Схема алгоритму для введення / виведення елементу двовимірного масиву наведена на рис. 19.

Для формування рядка-підказки під час введення:

for i:=1 to N do

for j:=1 to N do

begin

Write (‘Введіть А[’ , i, ‘,’ , j , ‘]: ’);

ReadLn ( A[i] );

end;

Правила використання вкладених циклів

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

for i:=1 to N do

for j:=1 to N do

ReadLn ( B[i, j] );

Такі цикли називаються вкладеними. В даному випадку можна сказати, що цикл з параметром і є зовнішнім циклом, а цикл з параметром j – внутрішнім (або цикл з параметром j вкладений в цикл з параметром і).

При першому входженні в зовнішній цикл і=1.

Далі потрапляємо во внутрішній цикл j=1. Вводиться елемент В [1,1].

j=2. Вводиться елемент В [1,2].

j=3. Вводиться елемент В [1,3].

І так далі, доки j=N. Вводиться елемент В [1,N].

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

Знову потрапляємо во внутрішній цикл j=1. Вводиться елемент В [2,1].

j=2. Вводиться елемент В [2,2].

І так далі, доки j=N. Вводиться елемент В [2,N].

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

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

Спакований масив

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

Var

<ім’я масиву>:packed array [<тип індексу>] of <тип елементів>;

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

Рядок – це спакований масив символів. Кількість елементів у рядку не може перевищувати 256. Рядок описується типом string:

VAR

S1:string ;

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

VAR

S2:string [10] ;

Рядок S2 має довжину 10 символів.

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

  • присвоєння:

S2:=’Це рядок !’;

S1:=S2;

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

S2[1]=’Ц’; S2[2]=’е’; S2[3]=’ ‘ і так далі.

  • порівняння;

Вважається, що рядок S1=S2 , якщо S1i = S2i, де і змінюється від 1 до кінця рядка, тобто всі символи рядків співпадають.

Рядок S1 < S2, якщо існує будь-який символ у рядку S1, який менший за символ з тим же індексом рядка S2:

S1i < S2i

Наприклад:

S1 := ‘Петров’

S2 := ‘Абрамов’

S3 := ‘Петрищенко’

Для цих рядків S1 > S2, тому що вже при порівнянні перших символів рядків S1 та S2 символ ‘П’ буде більший за ‘А’ (Насправді, як ви пам’ятаєте, при порівнянні символів порівнюються їх коди і вважається, що один символ більший (або менший) за інший, якщо його код більший (або менший) за код іншого символу).

За таким же принципом рядок S1 > S3, тому що при порівнянні перші 4 символи обох рядків співпадають, але на п’ятому різняться і символ ‘o’ більший за ‘и’.

Під час порівняння рядків треба пам’ятати, що рядки різної довжини порівнювати неможна.

В наведеному прикладі вважається, що рядки S1, S2, S3 були оголошені одним типом:

Var

S1, S2, S3:STRING [20];

Введення / виведення рядків символів

Для введення рядків використовується процедури Read, ReadaLn, для виведення – Write, WriteLn. Не зважаючи на те, що рядок це масив при введенні рядків не треба використовувати цикли. Рядки вводяться та виводяться як прості змінні:

ReadaLn (s);

WriteLn (‘ Був введений рядок ’, s);

Крім цього для рядків припустиме використання форматного виведення (вказується кількість символів в полі виведення рядка):

WriteLn (s : 10);

Процедури роботи з рядками

  • Delete (Var S:string; Index:integer; Count:integer) - видаляє підрядок з рядка S. Index - номер першого символу, що видаляється ;Count - кількість символів, що видаляються;

  • Insert (Source: string; Var S:string; Index:integer) - вставляє підрядок Source до рядка S . Якщо виходить рядок великого розміру, він скорочується до 255 символів. Index - номер позиції вихідного рядка, починаючи з якого буде вміщений поданий підрядок Source.

  • Str(X ; Var S:string) - перетворює число цілого типа чи типа real в послідовність символів.

  • Val(S:string; Var X ; Var Code:integer) - перетворює рядок символів в змінну цілого типа чи типа real. Змінна Code дорівнює нулю: якщо перетворення відбулося без помилок.

Функції роботи з рядками

  • Concat (s1,s2,...,sn : string) : string - конкатенація (склеювання ) поданих рядків s1,s2,...,sn.

  • Copy ( S : string; n,k : integer) : string - копіювання з поданого рядка S підрядка, який починається з позиції n та має довжину k.

  • Length (S : string ) : integer - обчислення довжини рядка S.

  • Pos (S : string; Substr : string ) : string - пошук підрядка у рядку. Результатом функції є номер позиції, починаючи з якої підрядок Substr входить в рядок S. Якщо підрядка не знайдено , функція повертає 0.

Опис типізованих констант-масивів та констант-рядків

Загальний опис типізованих констант було наведено в темі №3. Для того щоб описати типізовану константу масив необхідно вказати ім’я константи, описати її тип-масив, а потім в круглих дужках через “;” перелічити значення елементів цього масиву. Якщо масив двовимірний, то кожний рядок береться в окремі дужки ( ).

Const

Zero : array [1..3] of byte = (0, 0, 0);

Double_zero : array [1..2, 1..3] of byte = ( (0, 0, 0), (0, 0, 0) );

{опис константи - рядка}

Prog : string [20] = ‘Turbo Pascal 7.0 !!!’;

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

  1. Для чого у програмах використовують масиви даних?

  2. Як розташовуються елементи масиву в пам’яті? Чи можуть елементи одного масиву бути розташовані в різних областях пам’яті?

  3. Що таке одномірний масив, його опис у Паскаль – програмі?

  4. Як здійснити введення та виведення одномірного масиву. Наведіть приклад?

  5. Що таке індексація елементів масиву? Якіми типами можуть описуватися індекси?

  6. Як задається тип діапазон та тип перелічення?

  7. Якого типу можуть бути елементи масиву? Чи може один масив містити елементи різних типів?

  8. Багатовимірні масиви, їх опис у Паскаль – програмах?

  9. Як здійснити введення та виведення двовимірного масиву? Наведіть приклад.

  10. Які правила роботи вкладених циклів?

  11. Як описуються багатовимірні масиви даних?

  12. Які операції припустимі над масивами?

  13. Що являє собою тип string? Для чого він використовується?

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

  15. Як застосовуються процедури роботи з рядками: Delete, Insert та функції роботи з рядками Copy, Length, Concat, Pos?

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