Основні принципи модульного програмування та стеки (47918)

Посмотреть архив целиком

Якщо в деякій програмі використовуються власні процедури досить великого розміру, то ці процедури найкраще оформити в вигляді окремого модуля. Існує декілька причин для створення такого модуля. По-перше, модуль може зберігатися як в вихідному виді в PAS-файлі, так і в відкомпільованому файлі з розширенням TPU (Turbo Pascal Unit - модуль ТУРБО ПАСКАЛЬ). Усі процедури не компілюються щораз при перекомпіляції основної програми, а просто їхній код, що міститься в tpu-файлі, компонується з кодом основної програми. Це значно заощаджує час загальної компіляції задачі. По-друге, винесення множини процедур в окремий модуль розвантажує текст основної програми від зайвої захаращеності, робить його більш компактним і зрозумілим для сприйняття. По-третє, модулі з процедурами, що часто зустрічаються в різноманітних програмах, заощаджують час при написанні нових програм. Для цього достатньо помістити потрібний tpu-файл в каталог із новим проектом, в основній програмі підключити цей модуль в рядку uses і далі просто використовувати процедури з цього модуля в тексті основної програми. Будова модуля нагадує створення нової програми. в окремому pas-файлі записується заголовок модуля, константи, змінні, процедури і функції, які використовуються в цьому модулеві:


Unit ім'я_модуля; {це ж ім'я повинно бути іменем файла} Interface {розділ описів}


Const глобальні_константи;


Var глобальні_змінні;


Procedure Ім’я1 (параметри);


Procedure Ім’я2 (параметри); ..


.Procedure Ім’яM (параметри);


Function Ім’я11 (параметри): тип; ...


Function Имя1N (параметри): тип;


Implementation {розділ реалізації};


Const локальні_константи;


Var локальні_змінні;


Procedure Імя1; ...


Begin ...End;


Procedure Імя2; ...


Begin ...End; ...


Function Імя11; ...


Begin ...End; ...


End.


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

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


3.1. Приклад програми


unit mmm;


interface


procedure str(var a:array of integer);


procedure sts(var a:array of integer);


procedure bub(var a:array of integer);


procedure qui(var a:array of integer);


implementation


procedure str;


var


x,i,j:integer;


n1,n:integer;


begin


n:=high(a);


n1:=low(a);


for i:=n1 to n do


begin


x:=a[i];


j:=i-1;


while (j>=n1) and (a[j]>x) do


begin


a[j+1]:=a[j];


j:=j-1;


end;


a[j+1]:=x;


end;


end;


procedure sts;


var


x,k,i,j:integer;


n1,n:integer;


begin


n:=high(a);


n1:=low(a);


for i:=n1 to n-1 do


begin


k:=i;


for j:=i+1 to n do


if a[k]>a[j] then k:=j;


if k<>i then


begin


x:=a[i];a[i]:=a[k];a[k]:=x;


end;


end;


end;


procedure bub;


var


x,i,j:integer;


n1,n:integer;


begin


n:=high(a);


n1:=low(a);


for i:=n1 to n-1 do


for j:=n downto i+1 do


if a[j-1]>a[j] then


begin


x:=a[j];a[j]:=a[j-1];


a[j-1]:=x;


end;


end;


procedure qui;


var n1,n:integer;


procedure sort(l,r:integer);


var


x,w,i,j:integer;


begin


i:=l;j:=r;


x:=a[(i+j) div 2];


repeat


while a[i]


while a[i]>x do j:=j-1;


if i<=j then


begin


w:=a[i];


a[i]:=a[j];


a[j]:=w;


i:=i+1;


j:=j-1;


end;


until i>j;


if i


if j>l then sort(l,j)


end;


begin


n:=high(a);


n1:=low(a);


sort(n1,n);


end;


end.


program test;


uses mmm;


const n=100;


var a:array[1..n] of integer;


i:integer;


begin randomize;


for i:=1 to n do


a[i]:=random(100);


writeln('неупорядкований масив:');


for i:=1 to n do


write(a[i]:4);


writeln;


sts(a);


writeln('упорядкований масив :');


for i:=1 to n do


write(a[i]:4);


writeln;


end.


Реалізація роботи з графічними елементами на принципах модульного програмування


Для реалізації графічних зображень використовується графічний режим. Для ініціалізації графічного режиму необхідно підключити модуль graph.tpu за допомогою оператора USES GRAPH; та викликати процедуру ініціалізації графічного режиму:


initgraph(ім'я драйвера, режим, шлях до драйвера);


Можливе автоматичне визначення відеоадаптера. Для цього на місці першого параметра треба вказати ім'я Detect:


INITGRAPH(Detect,Regim,”);


Після роботи в графічному режимі його закривають процедурою closegraph.


Перелік процедур та функцій роботи з графічними елементами надана в додатку.

Приклад програми


Умова задачі: Дослідити область визначення і побудувати графік функції Y=3+2/X+3/X2


Алгоритм


1. Ініціалізація графічного режиму


2. Відображення координатних осей, асимптот, надписів.


3. Відображення графіка.


3.1. Перебір точок з абсцисами від лівого до правого кінця екрана


3.2. Визначення масштабу відображення точки на екрані


3.3. Визначення ординати точки


4. Кінець


uses crt,graph; { Підключення модуля GRAPH }


var grDriver,grMode:integer; {Змінні застосовуються процедурою


InitGraph}


x,y:real; { Змінні умови }


i:integer; { Змінна циклу }


function f(x:real):real; {функція , що досліджується}


begin


f:=3+2/x+3/sqr(x);


end;


procedure koordinate; {зображення координатних осей}


begin


setcolor(5); {колір осей червоний}


setbkcolor(15); {колір фону білий}


Line(320,0,320,350); {координатна вісь Х }


Line(0,300,640.300); {координатна вісь Y}


Line(318,10,320.0); {стрілка на осі Y }


Line(322,10,320.0): {стрілка на осі Y }


Line(630,298,640,300); {стрілка на осі Х }


Line(630,302,б40,300); {стрілка на осі Х }


SetLineStyle(DashedLn,0,1); { штрихова лінія }


Line(0.240,640,240); {асимптота графіка}


OutTextXY(310,305,'0'); {надписи на осях}


OutTextXY(310,5,'Y');OutTextXY(630.305.'X');


end;


begin {---------------------головна програма---------------------}


grDriver:=Detect; {визначення номера драйвера }


lnrtGraph(grDriver.grMode,'c:\tp7\bgi');{ініціалізація графічного


режиму}


koordinate; {зображення координатних осей}


for i:=-320 to 320 do begin {зображення графіка}


x:=0.05 *i; { визначити значення абсциси }


{масштаб представлення графіка в системі координат хОу дорівнює


20}


if x<>0 then { область визначення }


begin


y:=f(x); {визначити значення ординати}


PutPixel(round(320+20*x),round(300-20*y),1);


{зобразити піксель в заданих }


end; {координатах синім кольором}


end;


readin; closegraph; { закриття режиму графіки }


end.




ЧЕРГИ ТА СТЕКИ


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


var ім'я_змінної : ^ідентифікатор типу;


Наприклад:

type point=^data;


data=record


r: integer;


next: point;


end;


var a:point;


Змінна А є покажчиком на структуру типу DATA. При виконанні програми змінна А набуває значення адреси даних типу DATA. Визначення змінної типу покажчик відбувається при виконанні стандартної процедури NЕW(покажчик). Система знаходить вільну область пам'яті, в якій може розміститися вказаний тип даних. Початкове значення покажчика задається константою NIL (A^.NEXT:=NIL;).

За допомогою процедури DISPOSE (ідентифікатор_типу_покажчик) звільнюється пам'ять, зайнята даними, на які вказує покажчик.

Значення, що знаходиться за адресою, на яку вказує покажчик, визначається за форматом ім'я_змінної^, де змінна описана типом покажчик.

У мові Паскаль також можна використовувати нетипізовані покажчики, які, на відміну від типізованих, не зв'язані з конкретним типом. Такі покажчики мають тип POINTER, наприклад:

VAR P1,P2:POINTER;

Ці покажчики сумісні із будь-якими типізованими покажчиками. Процедура GETMEM(P1,Size) виділить пам'ять розміром Size байтів, покажчик Р1 матиме значення адреси початку такої пам'яті (обмежена числом 64К). Значення Size визначається функцією sіzеоf(тип_даних). Процедура FREEMEM(P1,Size) звільняє пам'ять. Покажчику можна присвоїти значення NIL, що визначає значення "пусто".


Случайные файлы

Файл
58357.rtf
61771.rtf
kontrolnaya BD.doc
3551-1.rtf
1886-1.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.