Опис свого типу даних.

В основній програмі в розділі опису типів описується структурований тип. Змінні в основній програмі і відповідний формальний параметр в заголовку підпрограми повинні бути змінними цього типу.

Type

тm = array [1....10] оf real;

var

mas: тм;

prоcedure prоc (var mass: тm); {заголовок п/п}

:

:

end;

begin

:

Prоc (mas); {Виклик п/п}

:

end.

 

2. Використання безтипових змінних.

В заголовку підпрограми не вказується тип параметру-змінної. В підпрограмі в розділі опису типів описується відповідний тип до якого буде приведено безтиповий параметр. Цей тип повинен бути сумісним з типом відповідного переданого параметру.

Var

b1: array [1. .100] оf byte;

b2: array [‘a’. .’z’] оf byte;

prоcedure pr (var b);

type

Tb = array [1....32500] оf byte;

:

:

{Звернення до масиву b в п/п: ТВ(b)[I]}

Tb(b)[i]:=34;

End;

Begin

:

pr(b1);

:

end.

 

3. Масиви і рядки невизначеної довжини.

В заголовку підпрограми при описі параметру вказується його тип але не вказується його розмір. При використанні масивів значення розміру масиву можна отримати за допомогою функції High(<Ім’я масиву>). Нумерація елементів в масиві буде починатись з 0 (нуля) і закінчуватись значенням функції High(<Ім’я масиву>)-1

 

Function Sum(var X: array of Real): Real;

Var

I: Word;

S: Real;

Begin

S := 0;

For I := 0 to High(X)-1 do

S := S + X[I];

Sum := S;

End;

Розробка програм з використанням підпрограм.

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

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

 

Program PAR; Var a,b: integer; S: real; Procedure avrg(x,y:integer; VAR S:real); Begin S:= (x+y)/2; End;   Begin write (‘введи два числа’); readln (a,b); avrg (a,b,s); writeln (‘середнє арифметичне чисел’, а:5,b:5,’дорівнює’, S:10:2); End.  

       
   

 


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

 

Program PAR; Var a,b: integer; S: real; Function avrg(x,y:integer):real; Begin avrg:= (x+y)/2; End;   Begin write (‘введи два числа’); readln (a,b); avrg (a,b,s); writeln (‘середнє арифметичне чисел’, а:5,b:5,’дорівнює’, avrg (a,b,s):10:2); End.  

 

Приклад 1 і приклад 2 демонструють використання процедури і функції для одного завдання для порівняння. В даному випадку ефективніше використовувати функцію.

 

Приклад 3. Знайти кількість сполучень з використанням функції:

 

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

 

           
   
     
program komb; var c,n,m: word; functiїn fakt (n: word): word; var i: word; f:longint; begin f:= 1; for i:= 1 to n do f:= f*i; fakt:= f; end;   begin writeln (‘введи m,n’); readln (m,n); c:= fakt (n) div (fakt(m) + fakt(n-m)); writeln (‘кількість сполучень ’,n:3,‘по’, m:3,‘=’,c:7); end.  
 

 

 


 

Завдання для самоперевірки.

 

1. Чим вiдрiзняється процедура вiд функцiї

2. Записати заголовок для функцiї, що приймає 2 аргументи цiлого типу i повертає результат дійсного типу

3. Записати заголовок для функцiї, що приймає масив 10 елементiв цiлого типу i повертає результат цілого типу

4. Записати заголовок для функцiї, яка отримує в якостi параметра 2 цiлих значення і повертає значення цілого типу

5. Записати заголовок процедури, яка отримує в якостi параметра 2 цiлих значення і повертає значення цілого типу

6. Перелічити типи формальних параметрiв.

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

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

 

Посилання. Динамічні структури

 

1) Визначення.

2) Операція роз’іменування.

3) Використання „кучі”.

 

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

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

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

Основний механізм організації динамічних даних - виділення в спеціальній області пам’яті, "кучі", безперервної ділянки потрібного розміру і зберігання адреси початку цієї ділянки в спеціальній змінній. Такі змінні мають посилальний тип і називаються посиланнями.

Формат визначення типу:

TYPE

< ім’я посилального типу>=^<ім’я барового типу>;

 

Формат визначення посилальної змінної:

<ім’я змінної>:^<ім’я базового типу>;

<ім’я змінної>:<ім’я посилального типу>;

 

Наприклад:

TYPE

TM=array [1..50] of real;

TZ=record

A,b,c:real;

End;

TPi=^integer;

TPr=^real;

TPm=^TM;

TPz=^TZ;

Відповідні змінні:

VAR

i:TPi;

r:TPr;

mas:TPm;

z:TPz;

b:^byte;

 

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

Щоб посилання ні на що не вказувало, змінній присвоюється значення NIL.

 

Операція роз’іменування

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

Ця операція позначається символом " ^ " який записується після імені посилальної змінної.

Якщо J - посилальна змінна, то J^ - значення, на яке вказувало посилання.

Посилання можуть зрівнюватись між собою.

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

MAS^[і] - доступ до і-го елементу динамічного масиву.

REC^.<ім’я поля> - доступ до поля запису або об’єкту.

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

 

Використання „кучі”.

Для роботи з динамічними змінними їх завжди необхідно спочатку розмістити в пам’яті. Для розміщення динамічних змінних використовується "куча". Місце для даних в "кучі" відводиться тільки під час роботи програм.

Програма на TP може сама призначати розмір "кучі" для своєї роботи .

Для цього використовується директива компілятора

{$M<розмiр стеку>,<min кучі>,<max кучі>}

Якщо директива $M не вказана , то використовується вся вільна пам’ять.

 

Процедури керування кучею:

Процедура або функція Дія
NEW(P) Відводить місце для динамічної змінної P^ і присвоює її адресу посиланню P
NEW(<тип посилання>) Функція створює динамічну змінну заданого базового типу.
DISPОSE(P) Знищує зв’язок між посиланням P та областю пам’яті на яку вона вказувала
GETMЕМ(P,<розмір>) Відводить місце вказаного розміру в кучі і його адресу присвоює P.
FREEMEM(P,<розмір>) Звільняє пам’ять вказаного розміру, починаючи з адреси, вказаної в P
MARK(P) Запам’ятовує в P поточний стан кучі
RELEASE(P) Повертає кучу в стан, що був запам’ятований в MARK
MaxAvail Функція, повертає розмір в байтах самого більшого простору в кучі
MemAvail Функція, повертає суму всіх просторів в кучі

 








Дата добавления: 2015-12-10; просмотров: 874;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.019 сек.