Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Опис типу

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

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

Загальний вигляд конструкції опису типу масиву такий:

 

array [< розмір >] of < назва базового типу >;

 

Масиви містять фіксоване число елементів одного типу, так званого типу елемента.

Для нумерації елементів масиву використовують індексний тип. При заданні індексних типів, окремо для кожної розмірності масиву указується число елементів. Допустимими індексними типами являются всі порядкові типи, за винятком довгого цілого і піддіапазонів довгого цілого. У паскалі є десять попередньо означених порядкових типів (Shortint, Integer, Longint, Byte, Word, Boolean, WordBool, LongBool, ByteBool, Char). Масив може бути проиндексованим по кожної розмірності всіма значеннями відповідного індексного типу; тому кількість елементів дорівнює числу значень у кожному индексному типі. Число размірностей не обмежено (проте є обмеження на максимальний розмір усієї структури масиву).

Наведемо приклад типу масив:

 

array[1..100] of Real

 

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

 

array[boolean] of array[1..100] of array[Size] of Real

 

інтерпретується компілятором точно так, як і масив:

 

array [boolean,1..10,Size] of Real

 

Крім того, можна записати вираз:

 

расked array[1..10] of расked array[1..8] of Boolean

 

як

 

расked array[1..10,1..8] of Boolean

 

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

Тип масив, вигляд, що має:

 

расked array[M..N] Char

 

де M менше N, називається упакованим рядковим типом (зарезервоване слово packed може бути префіксом опису масиву. Проте, це не має ніякого ефекту в Borland/Turbo Pascal, оскільки тут пакування відбувається автоматично). Упакований рядковий тип має деякі властивості, не характерні для інших типів масив.

Масив вигляду:

 

array[0..X] of Char

 

де X – позитивне ціле число, називають масивом з нульовою базою. Масиви з нульовою базою використовуються для зберігання рядків з завершальним нулем, і коли дозволений розширений синтаксис (за директиви компілятора {$X+}), символьний масив з нульовою базою сумісний із значенням типу PChar.

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

Розмір (кількість елементів) масиву найчастіше задають у вигляді діапазону або назви деякого перерахованого типу даних. Ця кількість фіксується при описі і в процесі виконання програми не міняється.

Описати масив можна у розділі опису типів type, у розділі констант const, або у розділі оголошення змінних var. Назви типів масивів і змінних-масивів придумує користувач відповідно до визначених правил.

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

Приклади опису масиву:

1) опис типу масивів (назва типу mymasyv),

2) оголошення сталого масиву (масиву-константи) vydatky типу mymasyv

3) оголошення змінних-масивів а, а1 типу mymasyv та масивів: b (він має 7 елементів цілого типу), с (має 100 елементів символів, тобто даних типу char).

 

type

mymasyv = array [ 1.. 10] of real;

day = (mon, tue, wed, the, fri, sat, sun);

const vydatky: mymasyv =(1.2, 1, 1, 2, 18, 2.4, 8.97, 3, 7, 1.3);

var a,al: mymasyv;

b: array[day] of integer;

c: array [1..100] of char;

 

1.2. Дії над масивами

Для роботи з масивом як єдиним цілим використовується ідентифікатор масиву без вказівки індексу в квадратних дужках. Масив може брати участь тільки в операціях відношення "рівно", "не рівно", та в операторі присвоєння. Масиви, що беруть участь в цих діях, повинні бути ідентичні по структурі, тобто мати однакові типи індексів і однакові типи компонентів. Наприклад, якщо масиви А і В описані, як Var А, В: array[1..20] of real; то застосування до них допустимих операцій дасть наступний результат

вираз результат

А = В True, якщо значення кожного елементу масиву А рівне відповідному значенню елемента масиву В.

А <> В True, якщо хоч би одне значення елементу масиву А не рівне значенню відповідному елементу масиву В.

А:= В Всі значення елементів масиву В прирівнюються відповідним елементам масиву А. Значення елементів масиву В залишаються незмінними.

1.3. Дії над елементами масиву

Після оголошення масиву кожен його елемент можна обробити, вказавши ідентифікатор (ім'я) масиву і індекс елементу в квадратних дужках. Наприклад, запис Mas[2], vektorZ[10] дозволяє звернутися до другого елементу масиву Mas і десятого елементу масиву vectorZ. При роботі з двовимірним масивом вказуються два індекси, з n-мірним масивом – n індексів. Наприклад, запис MATRU[4,4] робить доступним для обробки значення елементу, що знаходиться в четвертому рядку четвертого стовпця масиву MATRU.

Індексовані елементи масиву називаються індексованими змінними і можуть бути використані так само, як і прості змінні. Наприклад, вони можуть знаходитися у виразах як операнди, використовуватися в операторах for, while, repeat, входити як параметри до операторів read, readln, write, writeln; їм можна присвоювати будь-які значення, відповідні їх типу.

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

 

Var A, D: array [1..4] of real;

B: array[1..10,1..15] of integer;

L, J: integer;

K: integer;

S: real;

 

Ініціалізація масиву полягає в приcвоєнні кожному елементу масиву одного і того ж значення, відповідного базовому типу, найефективніше ця операція виконується за допомогою оператора for:

 

for I:= 1 to 4 do A[I]:= 0;

 

Для ініціалізації двомірного масиву зазвичай використовується вкладений оператор for:

 

for I:= 1 to 10 do

for J:= 1 to 15 do B[I, J]:= 0;

 

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

Значення елементам масиву можна присвоїти за допомогою оператора присвоєння, як показано в прикладі ініціалізації, проте найчастіше вони вводяться з екрану за допомогою оператора read або readln з використанням оператора організації циклу for:

 

for І:=1 to 4 do readln (A[I]);

 

Значення двомірного масиву вводяться за допомогою вкладеного оператора for:

 

for I:= 1 to 10 do

for J:= 1 to 15 do readln (B[I, J]);

 

Аналогічним чином здійснюються вивід значень елементів масиву.

Копіювання масивів називається присвоєнням значення всіх елементів одного масиву всім відповідним елементам другого масиву (аналог операції присвоєння масиву).

Інколи необхідно здійснювати пошук в масиві деяких елементів, що задовільняють певні умови. Наприклад треба з’ясувати скільки елементів масиву А мають нульове значення:

 

K:=0;

For I:=1 to 4 do

If A[I]=0 then K:=K+1;

 

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

 

Vs:=A[5];

A[5]:=A[1];

A[1]:=Vs;

 

Елементи масиву можуть виступати фактичними параметрами при звертанні до процедур та функцій.

2. Ідентифікатори

-----------------------------------------------------------------------------------------------------

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

Ідентифікатор може мати будь-яку довжину, проте тільки перші його 63 символи є значущими. Ідентифікатор повинен починатися з букви і не може містити пропусків. Після першого символу ідентифікатора можна використовувати букви, цифри і символи підкреслення (значення ASCII $5F). Як і в зарезервованих словах, в ідентифікаторах можна використовувати як рядкові, так і прописні букви (компілятор їх не розрізняє).

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

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

Code

Data

Result

Ідентифікатори Code і Data представляють поточні сегментикоду і даних відповідно. Їх слід використовувати тільки впоєднанні з операцією SEG:

 

asm

mov ах,SEG Data

mov ds,ax

end;

 

Ідентифікатор Result в операторній частині функції змінну-результат функції. Наприклад, у функції:

 

function Sum(X, У: Integer): Integer;

begin

Sum:= X + У;

end;

 

в операторі, що привласнює результат функції змінної Sum, можна було б при записі на вбудованому асемблері використовувати змінну Result:

 

function Sum(X, У: Integer): Integer;

begin

asm

mov ах,X

add ах, У

mov Result,ax

end;

end;

 

У виразах вбудованого асемблера не можна використовувати наступні ідентифікатори:

 

- стандартні процедури і функції (наприклад, Writeln, Chr);

 

- спеціальні масиви Mem, MemW, MemL, Port, PortW;

 

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

 

- мітки, які не описані в поточному блоці;

 

- ідентифікатор Result поза функцією.

 

Локальні змінні (змінні, описані в процедурах і функціях) завжди розподіляються в стеку і доступні відносно SS:BP, а значення ідентифікатора локальної змінної представляє собою її зсув із знаком від SS:BP. Асемблер автоматично додає [BP] до посилань на локальні змінні. Наприклад, з обліком описів:

 

procedure Test;

var

Count: Integer;

 

інструкції:

 

asm

mov ах,Count

end;

 

асемблюються в MOV АХ,[BP-2].

 

Вбудований асемблер завжди інтерпретує параметр-змінну, як 32 розрядний покажчик, а розмір параметра-змінної завжди рівний 4 (розміру 32 розрядного покажчика). В Паскалі синтаксис для доступу до параметра змінній і до значення параметра однаковий. У разі вбудованого асемблера це не так. Тому для доступу до вмісту параметра-змінної вам спочатку доведеться завантажити 32-розрядний покажчик, а потім звернутися до осередку, на яку він указує. Наприклад, якщо X і У - параметри-змінні приведеної вище функції Sum, то вона може виглядати наступною чином:

 

function Sum(var X, У: Integer): Integer;

begin

asm

les bx,X

mov ах,es:[bx]

les bx,Y

add ах,es:[bx]

mov Result,ax

end;

end;

 

Деякі ідентифікатори, такі, як змінні типу запис мають область дії, що дозволяє поводитися до них з допомогою операції вибору елементи структури-крапки (.). Наприклад, з обліком описів:

 

type

Point = record

X, У: Integer;

end;

Rect = record

А, B: Point;

end;

var

P: Point;

R: Rect;

 

для доступу до полів в змінних P і R можна використовувати наступны конструкції:

 

asm

mov ах,P.X

mov dx,P.Y

mov cx,R.A.X

mov bx,R.B.Y

end;

 

Для безпосередньої побудови змінної можна використовувати ідентифікатор типу. Кожна з приведених нижче інструкцій генерує один і той же машинний код, що завантажує в АХ ES:[DI+4]:

 

asm

mov ах,(Rect PTR es:[di]).B.X

mov ах,Rect(es:[di].B.X

mov ах,es:Rect[di].B.X

mov ах,Rect[es:di].B.X

mov ах,es:[di].Rect.B.X

end;

 

Область дії задається типів, полем і ідентифікатором перемінної типу запису або об'єктного типу. Крім того, идентификатора модуля відкриває область дії конкретного модуля (як повністю уточнень ідентифікатор в Паскалі).

 

3. Підпрограми

----------------------------------------------------------------------------------------

Підпрограми призначені для реалізації алгоритмів опрацювання окремих частин деякої складної задачі. Вони дають змогу реалізовувати концепцію структурного програмування, суть якого полягає в розкладанні складної задачі на послідовність простих підзадач і в складанні для алгоритмів розв'язування кожної підзадачі відповідних підпрограм. Розрізняють два види підпрограм — підпрограми-процедури та підпрограми-функції. Підпрограми поділяються на стандартні та підпрограми користувача. Стандартні підпрограми створювати не потрібно — вони містяться у стандартних модулях System, Crt, Dos, Graph тощо. Підпрограма користувача — це пойменована група команд, яку створюють і описують в основній програмі в розділах procedure або function і до якої звертаються з будь-якого місця програми потрібну кількість разів.

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

 

X:= Sin(A);

 

тоді як процедура викликається для виконання однієї або більше задач:

 

Writeln (’Це провірка’);

 

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

 




Дата добавления: 2015-01-29; просмотров: 123 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.094 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав