Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка_1_05_ВНУ.doc
Скачиваний:
4
Добавлен:
08.09.2019
Размер:
2 Мб
Скачать
☆

Стандартні файли input і output

Стандартні файли input та output є текстовими. У програмі їх не описують. З ними не можна використовувати процедури reset та rewrite. Уважають, що ці файли описані й на початку програми ці процедури виконані. Операційна система пов'язує файл input з пристроєм уведення (у режимі діалогу це клавіату­ра), а файл output - з пристроєм виведення (у режимі діалогу це екран дисплея).

У процесі читання з файлу input і записування у файл out­put імена цих файлів можна пропускати. Наприклад, еквіва­лентні такі записи:

read(x) і read(input.x); write(x) і write(output,x).

Те ж саме стосується і функцій Eoln і Eof:

Eoln і Eoln(input); Eof і Eof(output).

Для текстових файлів визначена стандартна функція page, яка виконує перехід на наступну сторінку під час виведення інформації на пристрій виведення.

Далі розглянемо використання стандартного текстового файлу output для виведення даних за допомогою стандартної процедури

write(x1,x2 хn),

яка еквівалентна

write(x1), write(x2),…,write(xn).

Послідовності символів, що виводяться у файл output, бу­дуть розділені на рядки по 80 символів у випадку виведення на екран дисплея.

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

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

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

Модулі Модуль і його структура

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

Структура модуля має такий вигляд:

unit <ім'я>

interface

uses <список модулів>

{відкриті оголошення}

implementation

uses <список модулів>

{власні оголошення}

{реалізація процедур і функцій}

begin

{коди ініціалізації}

end

Модуль починається зі слова unit, яке разом з іменем є заго­ловком модуля. Наступне службове слово interface означає по­чаток секції інтерфейсу модуля, доступного для всіх інших модулів і програм, які використовують цей модуль. В інтерфейсі модуля можуть бути оголошені сталі, типи даних, змінні, про­цедури і функції. Будь-яка програма, що застосовує цей модуль, має доступ до всіх елементів, оголошених у його інтерфейсі. Щодо процедур і функцій, то в секції інтерфейсу зазначені тіль­ки їхні заголовки, а самі оператори, що реалізують їх, описані в наступній секції реалізації.

Секція інтерфейсу закінчується словом implementation, яке одночасно розпочинає секцію реалізації. Все, що описане в І секції інтерфейсу, є доступним секції реалізації. Крім цього, в секції реалізації можуть бути свої описи, уже недоступні програмам, що використовують цей модуль. Ці описи використовують процедури і функції, зазначені у секції інтерфейсу. Ці процедури і функції повторно описують в секції реалізації, їхній заголовок може бути такий же, як у секції інтерфейсу, або мати коротку форму, що містить слово procedure (function), після якого йде ім'я без зазначення параметрів і типу. Підпрограми секції реалізації, не описані в секції інтерфейсу, повинні мати повний заголовок.

Слово uses можна застосовувати як у секції інтерфейсу, так і в секції реалізації. В першому випадку його записують відразу після слова interface і воно означає те, що сталі, типи даних і змінні, оголошені в інтерфейсі модулів, імена яких пелічені після слова uses, можна використати в будь-якому оголошенні в інтерфейсі цього модуля. В другому випадку слово uses записують відразу після слова implementation і воно означає те, що сталі, типи даних і змінні, оголошені в інтерфейсі перелічених після uses модулів, доступні тільки в секції реалізації цього модуля.

Секція реалізації розміщена між словами implementation і end. Якщо ж перед end є слово begin і деякі оператори, то одержаний складений оператор стає секцією ініціалізації модуля. В цій секції відбувається ініціалізація структур даних, що їх використовує модуль або які доступні програмам, що застосовують цей модуль. Також тут відкриваються файли, які використовуються в програмах. Під час виконання програми секцію ініціалізації викликає тіло програми, що застосовує мо­дуль. Якщо ж у програмі є декілька модулів, то спочатку будуть викликані секції ініціалізації всіх модулів, а потім послідовно виконуються оператори з тіла програми.

Відтрансльовані модулі зберігаються в спеціальному двійковому форматі, стандартні - у файлі TURBO.TPL (вони автоматично завантажуються в пам'ять разом з Турбо Паскалем).

Для використання модулів треба, щоб після заголовка програми було речення uses, а далі зазначений список імен усіх модулів, що їх використовує програма. Наприклад:

program PRG;

uses MOD1, MOD2, MODS;

Імена модулів розділяють комами, вони можуть бути оголошені в будь-якому порядку. Якщо ж речення uses нема, то Турбо Паскаль приєднує стандартний модуль System, який забезпечує виконання стандартних підпрограм (процедур і функцій).

Наведемо приклад використання модулів і посилання на елементи, оголошені в модулі. Нехай є модуль

unit MODL;

interface

const

MV=75;

type

MS=(A,B,C);

var

MW: string[30];

procedure SMW(s: MS);

function ТА: integer;

implementation

...............................

end.

Наведена нижче програма використовує елементи, оголо­шені в секції interface цього модуля:

program TS;

uses MODL;

const

MV=12;

type

TP=1..30;

var

i: integer;

AS: MS;

function ТА: ТР;

begin

TA:=-1;

end;

begin

AS:=A;

SMW(AS);

writeln(MODL.MV);

writeln(MV);

I:=TA;

writeln(l);

end.

У програмі деякі індентифікатори, оголошені у використо­вуваному нею модулі, можна перевизначити (MV, ТА). Під час виконання програма застосовує свої власні описи, оскільки вони зроблені пізніше, ніж у модулі. Якщо ж треба використати . оголошення ідентифікатора з модуля, то для цього перед ідентифікатором зазначають ім'я модуля з крапкою. В нашому при­кладі в програмі TS для функції ТА використано її опис у самій програмі, тоді як для сталої MV має сенс її визначення, оголо­шене в секторі інтерфейсу модуля MODUL.

Може трапитися, що описи перетинаються в модулях, які використовує програма чи модуль. Тоді дійсні ті описи (видимі), які містяться в інтерфейсній частині модуля, зазначеного піз­ніше в списку uses цієї програми чи модуля.

В Турбо Паскалі можна робити рекурсивні посилання мо­дулів. У секції реалізації кожного з двох модулів може бути звертання до процедури, оголошеної в секції реалізації іншого з цих двох модулів. Для забезпечення такої можливості по­трібно в реченні uses секції реалізації кожного модуля зазна­чити ім'я іншого модуля, на який є посилання.

Приклад програми опрацювання матриць (множення мат­риць, додавання вектора до рядка матриці):

unit MODI;

interface

const

М=100;

t=2;

type

VECT=array [1..M] of integer,

TABL=array [1..M, 1..M] of integer;

var

i,j,r: integer;

procedure MULT(var A,B,C: TABL; m,n,k: integer);

procedure ADD(var A: TABL; var Q: VECT; m,n: integer);

implementation

procedure MULT;

{Множення матриць}

begin

for i:=1 to m do

for j:=1 to k do

begin

C[i,j]:=0;

for r:=1 to n do C[I,j]:=C[I,j]+A[I,r]*B[r,j]

end

end;

procedure ADD;

{Додавання вектора до 1-го рядка матриці}

begin

for i:=1 to n do A[l,i]:=A[l,i]+Q[i];

end

end.

unit MOD2;

interface

uses MOD1 ;

procedure VVD(var A: TABL; m,n: integer);

procedure VYV(var A: TABL; m,n: integer);

implementation

procedure VVD;

{Уведення матриці}

begin

for i:=1 to m do

for j:=1 to n do read(A[i,j])

end; {ofVV}

procedure VYV;

{Виведення матриці}

begin

for i:=1 to m do

begin

for j:=1 to n do write(A[i,j]);

writeln

end;

end; {of VYV}

end. {of MOD2}

program MATR(input.output);

uses MOD1,MOD2;

{Опрацювання матриць}

var

A1,B1,C1:TABL;

P: VECT;

m1,n1,k1: integer;

t,i: integer;

begin

VVD(A1,m1,n1);

VVD(B1,n1,k1);

MULT(A1,B1,C1,m1,n1,k1);

VYV(C1,m1,k1);

for i:=1 to n1 do read(P[i]);

read(t);

ADD(A1,P,t,n1);

{Якщо в ADD замість t записати MODl.t, то відповідний ідентифікатор t буде переданий з модуля MOD1}

VYV(C1,m1,n1)

end.