Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шутка.doc
Скачиваний:
2
Добавлен:
05.12.2018
Размер:
998.91 Кб
Скачать

3. Структуровані типи даних. Масиви

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

Опис масиву у програмі має вигляд

<ім’я типу> array [<список індексних типів>] of <тип>;

де <ім’я типу> – правильний ідентифікатор; array, of – зарезервовані слова (масив, із); <список індексних типів> – список з одного або декількох індексних типів (розмірність масиву не обмежується), розділених комами; <тип> – тип елементів масиву, може бути будь-яким крім файлового. В ролі індексних типів може використовуватися будь-який порядковий тип (частіше використовується діапазон).

Масив можна описати в розділі Var безпосередньо або за допомогою раніше описаного ідентифікатора типу:

Type Tm= array[1..10] of integer;

Var a, b: array[1..100] of double;

r: array[1..100] of double;

s: array[1..100] of double;

c, d: Tm;

x: array[1..10, 1..10] of integer;

y: array[1..10] of array[1..10] of integer;

тут масиви a, b, r, s описані безпосередньо, масиви c, d описані за допомогою ідентифікатора типу, а матриці x, y описані безпосередньо ідентичними способами.

Для масивів у цілому допускається тільки операція присвоєння, якщо вони описані одним ідентифікатором типу. Тому оператор a:=b; буде вірним і присвоїть елементам масиву a відповідні елементи масиву b, а оператор r:=s; буде невірним.

Для доступу до окремого елемента масиву потрібно за іменем масиву вказати у квадратних дужках його індекс (положення у масиві): a[5], x[3,4] або y[5][6]. З елементами масиву можна працювати як із звичайними скалярними змінними.

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

Var a: array of integer;

b: array of array of char;

c: array of array of array of double;

i, j: integer;

Begin

{Розподіл пам’яті}

SetLength(a,10);

{Довжина першого виміру (кількість рядків)}

SetLength(b,10);

{Довжина кожного рядка)}

for i:=0 to 9 do

SetLength(b[i], 20);

{Кубічний масив c[0..2, 0..2, 0..2]}

SetLength(c,3);

for i:=0 to 2 do

begin

SetLength(c[i],3);

for j:=0 to 2 do

SetLength(c[i,j],3);

end;

{Робота з масивами}

………………

{Звільнення пам’яті}

a:=NIL;

Finalize(b);

Finalize(b);

End.

У наведеному прикладі: а – одновимірний масив цілих чисел, якому виділена пам’ять для десяти елементів; b – двовимірний масив символів із 10 рядків по 20 символів у рядку; c – тривимірний масив дійсних чисел. Нижня межа індексів по кожному виміру динамічного масиву завжди дорівнює нулю. У багатовимірних масивах спочатку встановлюється довжина його першого виміру, потім другого, третього і т. д.

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

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

Program LABR3_1;

{$APPTYPE CONSOLE}

uses Sysutils;

VAR a: array[1..300] of integer;

maxa: integer;

n, i: integer;

BEGIN

{Введення початкових даних}

writeln(‘Введіть розмір масиву а, (n<=300)’);

readln(n);

writeln(‘Введіть елементи масиву а’);

for i:=1 to n do

read(a[i]);

{Пошук максимального елемента масиву}

maxa:=a[1];

for i:=2 to n do

if maxa < a[i] then maxa:=a[i];

writeln(‘Максимальний елемент =’, maxa);

readln;

END.

Розглянемо алгоритм побудови перерізу двох масивів. Нехай задано два масиви цілих чисел , . Розробити програму, яка будує переріз масивів . Переріз масивів  це всі елементи масиву , які містяться у масиві і взяті по одному разу. Переріз масивів буде нараховувати не більше 200 елементів. Помістимо їх у масив .

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

Program LABR3_2;

{$APPTYPE CONSOLE}

uses Sysutils;

VAR a, c: array[1..200] of integer;

b: array[1..300] of integer;

n, m, k, i, j: integer;

f1, f2: boolean;

BEGIN

{Введення початкових даних}

writeln(‘Введіть розмір масиву а, (n<=200)’);

readln(n);

writeln(‘Введіть елементи масиву а’);

for i:=1 to n do

read(a[i]);

writeln(‘Введіть розмір масиву b, (m<=300)’);

readln(m);

writeln(‘Введіть елементи масиву b’);

for i:=1 to m do

read(b[i]);

{Побудова перетину масивів}

k:=0;

for i:=1 to n do

begin

j:=1; f1:=false;

while (j <= m) and (not f1) do

if a[i]=b[j] then f1:=true else j:=j+1;

if f1 then begin

j:=1; f2:=true;

while (j <= k) and f2 do

if a[i]=c[j] then f2:=false else j:=j+1;

if f2 then begin k:=k+1; c[k]:=a[i];end;

end;

end;

{Виведення перетину по п’ять елементів у рядку}

if k=0 then writeln(‘Перетин порожній’)

else

for i:=1 to k do

if i mod 5 <> 0 then write(c[i]:6)

else writeln(c[i]:6);

readln;

END.