Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка - Основи програмування і алгоритмічні мови.DOC
Скачиваний:
28
Добавлен:
02.05.2014
Размер:
512.11 Кб
Скачать

2 Лабораторна робота №2

Масиви та множина у мові Pascal

2.1 Стислі теоретичні відомості

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

Тип масиву визначається його конструкцією:

Array [діапазон] of ТипЕлементів;

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

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

Var V:Array[1..5] of Real;

оголошуючи тим самим структуру з п’яти значень типу Real, проіндексованих заданим діапазоном цілих чисел (V[1], V[2],…, V[5]).

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

У якості індексів можна також використовувати будь-які перелічувальні типи (у тому числі й упроваджені). При цьому індекси можна задавати як діапазоном, так і, замість нього, іменем перелічувального типу (якщо діапазон відповідає всьому типу):

Type

Month=(January,February,March,April,May);

Compl=Array[Month] of Byte;

Spring=Array[February..April] of Byte;

Var

Complect :Compl;

Spr : Spring;

Alpha : Array [‘A’..’Z’] of Char;

Logic : Array [Boolean] of Byte;

Тепер звертатися до елементів масивів можна, наприклад, наступним чином: Complect[March], Alpha[‘D’], Logic[False] і т. п.

Кількість вимірів масиву формально не обмежено, головне, щоб сума розмірів всіх компонентів не перевищувала 64 Кб.

Так можна оголосити двовимірний масив (матрицю):

Type

DimMatrix=Array[1..5] of Array[0..15] of Word;

або

Type

DimMatrix=Array[1..5,0..15] of Word;

Кожен вимір не залежить від інших, тобто можна оголосити наступний масив:

Var

Dim:Array[–5..5,‘F’..’K’,Boolean] of Byte;

Тут:

Dim[1] – масив типу Array[‘F’..’K’,Boolean] of Byte,

Dim[1,’H’] – масив типу Array[Boolean] of Byte,

Dim[1,’H’,True] – значення типу Byte.

Індекси можна записувати через кому або ізольовано, тобто

Dim[1,’H’,True] еквівалентно Dim[1][‘H’][True].

Компонентом масиву може бути будь-який інший тип. Так, наприклад, якщо Rec – масив записів (Record), то доступ до поля кожного запису проводиться так: Rec[i].ПолеЗапису.

В пам’яті ПЕОМ масиви зберігаються як суцільні послідовності компонентів. Адреса початку масиву у пам’яті відповідає адресі його першого елемента.

Ключ компіляції {$R+} перевіряє належність значення індексу масиву оголошеному діапазону. Програму необхідно відлагоджувати у режимі {$R+}, а експлуатувати у {$R-} для зменшення розміру exe-файлу та часу його виконання.

До двох спільних масивів X та Y застосовується операція привласнення (X:=Y), яка копіює поелементно масив Y у масив X.

Сортування масивів. При розв’язанні задачі сортування звичайно висувається вимога мінімального використовування додаткової пам’яті, з якої випливає недопустимість застосування додаткових (допоміжних) масивів.

Для оцінки швидкодії алгоритмів при застосуванні різних методів сортування, як правило, використовують два показники: кількість привласнень та кількість порівнянь.

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

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

- сортування вставкою (включенням).

- сортування вибором (виділенням).

- сортування обміном (сортування (‘бульбашки’).

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

Сортування вставкою. Масив поділяється на дві частини: відсортовану і невідсортовану. Елементи із невідсортованої частини почергово вибираються та вставляються у відсортовану частину так, щоб не порушити в ній упорядкованість елементів. На початку роботи алгоритму у якості відсортованої частини масиву приймають тільки один перший елемент, а у якості невідсортованої частини – всі інші елементи.

Таким чином, алгоритм буде складатися із (n-1)-го проходу (n – розмірність масиву), кожний з яких буде включати чотири дії:

- взяття чергового і-того невідсортованого елементу та зберігання його у допоміжній змінній;

- пошук позиції j у відсортованій частині масиву, в якій присутність взятого елементу не порушує упорядкованості елементів;

- зрушення елементів масиву від (і-1)-го до (j-1)-го вправо, щоб звільнити знайдену позицію вставки;

- вставка взятого елементу у знайдену j-ту позицію.

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

Сортування вибором. На першому етапі алгоритму перший елемент масиву по черзі порівнюється з наступними і при виконанні поставленої умови міняється з ними місцями. В результаті першого проходу алгоритму на першому місті масиву буде знаходитися найбільший або найменший елемент (в залежності від умови упорядкування). На наступних етапах аналогічному алгоритму обробки будуть підвержені другий, третій і т.д. до останнього елементи масиву. При цьому відсортована частина масиву із обробки виключається.

Сортування обміном. Зліва направо почергово, порівнюємо два сусідніх елемента, і якщо їх взаєморозташування не відповідає заданій умові упорядкованості, то вони змінюються містами. Після одного такого обходу на останній n-тій позиції масиву буде стояти найбільший або найменший елемент (в залежності від умови упорядкування), тобто ‘спливає’ перша ’бульбашка’. Кожний наступний обхід обмінів виконується тільки до вже упорядкованої частини масиву.

Порівняння прямих методів сортування. Теоретичні та практичні дослідження алгоритмів прямих методів сортування показали, що як по числу порівнянь, так і по числу привласнень вони мають квадратичну залежність від довжини масиву n. Виключенням є метод вибору, який має число привласнень порядку nln(n). Цю властивість алгоритму вибору корисно використовувати у задачах сортування у складних структурах даних, коли на одне порівняння виконується велике число привласнень. У таких задачах метод вибору успішно конкурує з самими швидкими поліпшеними методами сортування.

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

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

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

На другому кроці виконуються аналогічні дії над половиною масиву, яка залишилася. У результаті після другого етапу залишається ? частина масиву.

І так далі, поки або елемент буде знайдений, або довжина зони пошуку буде дорівнювати нулю. В останньому випадку шуканий елемент знайдено не буде.

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

В описанні множини використовується конструкція Set of з наступною за нею вказівкою базового типу, наприклад:

Type

SChar = Set of Char;

SByte = Set of Byte;

SMonth = Set of Month;

SDigit = Set of 0..9;

SCh = Set of ‘a’..’z’;

SM = January..March;

Можна конструювати, у круглих дужках, перелічувальний тип одразу у конструкції Set of… . Крім того можна опустити фазу описання типу у розділі Type і одразу задавати її у розділі Var:

Var

S1 : Set of …;

Дозволяється визначати множини, які складаються не більше ніж 256 елементів.

Множини мають компактне машинне представлення: один елемент витрачає один біт.

Елементи множини повинні міститися у квадратних дужках, наприклад:

S1:=[1, 2, 3, 4, 5, 10, 20, 30, 40, 50];

S2:=[‘A’, ‘B’, ‘C’];

S3:=[ January, February, March];

S4:=[10..20, 100..200];

S5:=[]; – пуста множина.

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

У якості елементів множин можуть використовуватись константи та змінні базових типів. Можна замість елементів підставляти вираз, якщо тип їх результату співпадає з базовим типом множини.

Множини неможливо виводити на екран.

Операції, які застосовуються до множин, приведені нижче.

Назва

Форма

Результат

= Перевірка на рівність

S1=S2

True, якщо S1 і S2 складаються із однакових елементів незалежно від порядку слідування; False – в противному випадку.

<> Перевірка на нерівність

S1<>S2

True, якщо S1 і S2 відрізняються хоча б одним елементом; False – в противному випадку.

<= Перевірка на підмножину

S1<=S2

True, якщо всі елементи S1 містяться в S2 незалежно від порядку слідування; False – в противному випадку.

>= Перевірка на підмножину

S1>=S2

True, якщо всі елементи S2 містяться в S1 незалежно від порядку слідування; False – в противному випадку.

in Перевірка входження елементу до множини

E in […]

E in S1

True, якщо значення Е належить базовому типу множини і входить у множину […] (S1) ; False – в противному випадку.

+ Об’єднання множин

S1+S2

Множина, яка одержана злиттям елементів множин S1 і S2 та виключенням елементів, які дублюються.

- Різниця множин

S1-S2

Множина, одержана із елементів, які входять до множини S1, але не входять до множини S2.

* Перетин множин

S1*S2

Множина, одержана тільки з тих елементів S1 і S2, які містяться одночасно і в S1 і в S2.