Міністерство освіти і науки України
НУ „Львівська політехніка”
Кафедра ЕОМ
ЗВІТ
Про виконання лабораторної роботи №7
Процедури та функції мови Turbo Pascal
Кохалик Р.В.
(Студент)
ІКТА КІ-17
(Група)
Мітьков В.С.
(Керівник лаб. Занятть)
Львів 2003
Процедури та функції мови Turbo Pascal
Мета роботи: Метою роботи є здобуття навикiв побудови структурованих програм, що базуються на розбиттi програми на пiдпрограми - процедури та функцiї.
.
Теоретичний вступ: Пiдпрограми-процедури та функцiї призначенi для багаторазового використання у програмi оформленої по певних правилах синтаксису групи операторiв. Для цього групу операторiв, якi необхiдно використати у рiзних частинах програми, оформляють у виглядi окремої пiдпрограми i розмiщують в описовiй частинi основної програми. В необхiдних мiсцях операторної частини програми розмiщують звертання до пiдпрограми.
Основна вiдмiннiсть процедури вiд функцiї полягає в тому, що процедура може повертати у викликаючу програму декiлька значень рiзних типiв, а функцiя - тiльки одне значення неструктурованого типу.
Звертання до процедури здiйснюється за допомогою оператора процедури, а звертання до функцiї - тiльки у виразi.
Процедури та функцiї мають структуру, подiбну до структури основної програми, тобто складаються з описової та операторної частини. Процедури та функцiї можуть бути вкладеними одна в одну. Для цього оголошення процедур та функцiй розмiщуються в описовiй частинi охоплюючої процедури чи функцiї.
Структура процедури
Procedure iм'я_процедури(список формальних параметрiв);
Блоки оголошень label, const, type, var;
Описи вкладених пiдпрограм;
Begin
Операторна частина процедури
End;
Оголошення процедури починається iз заголовка процедури. Заголовок включає зарезервоване слово Procedure, пiсля якого вказується iм'я процедури, а в круглих дужках список формальних параметрiв. Список формальних параметрiв не є обов'язковим i може бути опущений разом з круглими дужками. Заголовок процедури завершується символом "крапка з комою".
Далi в описовiй частинi процедури оголошуються локальнi для даної процедури мiтки, константи, типи, змiннi та вкладенi пiдпрограми.
Звертання до вкладених пiдпрограм здiйснюється з блоку операторної частини процедури. Крiм того допускається звертання однiєї пiдпрограми до iншої, розмiщеної вище неї по тексту програми на одному або вищому рiвнi вкладеностi.
Структура функцiї
Function iм'я_функцiї(список формальних параметрiв):тип_функцiї;
Блоки оголошень label, const, type, var;
Описи вкладених пiдпрограм;
Begin
Операторна частина функцiї;
iм'я_функцiї:=вираз;
End;
Заголовок функцiї починається iз зарезервованого слова Function, пiсля якого задається iм'я функцiї i в круглих дужках - необов'язковий список формальних параметрiв. Список формальних параметрiв може бути опущений разом з круглими дужками. Пiсля списку формальних параметрiв (або пiсля iменi функцiї, якщо список вiдсутнiй) через символ "двокрапка" вказується iдентифiкатор типу функцiї - будь-який простий тип, стрiнг або вказiвник.
Описова частина функцiї мiстить оголошення локальних мiток, констант, типiв даних та вкладених пiдпрограм, звертання до яких може бути розмiщене в операторнiй частинi основної програми.
При роботi функцiї хоча б один раз має виконатися оператор, який iменi функцiї присвоює сумiсний з типом функцiї результуючий вираз.
Досяжнiсть пiдпрограм
У Турбо Паскалi визначенi тiльки вкладенi пiдпрограми. Це означає, що внутрiшнi пiдпрограми розмiщуються в описовiй частинi охоплюючої пiдпрограми. Рiвень вкладеностi пiдпрограм не обмежений, але загальна довжина програми не повинна перевищувати 64 Кбайт. Крiм того загальний об'єм даних, оголошених всерединi пiдпрограм, не повинен пеpевищувати 64 Кбайт.
В загальному випадку схема вкладеностi пiдпрограм є деревовидною, тобто основна програма може мати декiлька вкладених пiдпрограм, кожна з яких в свою чергу може мати вкладенi пiдпрограми.
Кожна пiдпрограма може звернутися до iншої пiдпрограми, заголовок якої розмiщений вище по тексту програми на одному з нею або вищому рiвнi вкладеностi. Кожна пiдпрограма (крiм основної програми) може звернутися також сама до себе. Таке звертання називається прямим рекурсивним.
В наступному прикладi допускається звертання процедури W до процедури C, розмiщеної вище по тексту програми, а також процедур C та W до себе.
Передача даних мiж пiдпрограмами
Обмiн даними мiж пiдпрограмами може здiйснюватися або за допо могою глобальних параметрiв, або за допомогою списку фактичних i формальних параметрiв.
Глобальнi, локальнi та статичнi данi
Глобальними називаються данi, оголошення яких розмiщенi в описовiй частинi основної програми. Глобальнi данi зберiгаються в сегментi даних та iснують на протязi всього часу виконання програми. Глобальнi данi доступнi як в основнiй програмi, так i в усiх пiдпрограмах будь-якого рiвня вкладеностi, розмiщених нижче по тексту в описовiй частинi основної програми.
Локальними називаються данi, розмiщенi всерединi пiдпрограми. Локальнi данi зберiгаються в сегментi стеку i iснують вiд моменту входу у пiдпрограму до моменту завершення її роботи. Локальнi данi доступнi з мiсця їх оголошення в усiх вкладених пiдпрограмах, розмiщених нижче по тексту охоплюючої пiдпрограми. Якщо iм'я локальної змiнної, оголошеної в пiдпрограмi, спiвпадає з iменем глобальної змiнної основної програми, або з iменем локальної змiнної, розмiщеної в однiй iз охоплюючих пiдпрограм, то воно перекриває область дiї цiєї змiнної.
Для доступу до глобальних змiнних у пiдпрограмах, перекритих областю дiї одноiменних локальних змiнних, можна використати пунктуацiю main.iдентифiкатор_змiнної, де main - iм'я основної програми. Якщо у пiдпрограмi необхiднi використати значення перекритої змiнної охоплюючої пiдпрограми, то його необхiдно передати через список параметрiв.
Iтеративнi та рекурсивнi пiдпрограми
В задачах обчислювальної математики широко використовуються алгоритми наближення, в яких кожне наступне значення обчислюється через модифiковане попереднє значення. Такi алгоритми називаються iтерацiйними. В залежностi вiд виду модифiкацiї значення виразу розрiзняють мультиплiкативнi, аддитивнi або комбiнованi iтерацiйнi алгоритми.
Для програмування iтерацiйних алгоритмiв використовуються рiзнi види операторiв циклу. Iншим способом запису iтерацiйних алгоритмiв є використання рекурсiї.
У Турбо Паскалi в операторнiй частинi допускається звертання пiдпрограми до самої себе. Пiдпрограми, побудованi таким чином, називаються рекурсивними. Рекурсивнi пiдпрограми обчислюються у два етапи: прямий та зворотнiй хiд. Пiд час прямого ходу результати промiжних обчислень при рекурсивних викликах пiдпрограм записуються у стек. Кiлькiсть iтерацiй рекурсивного алгоритму повинна бути обмеженою. Як вiдомо, загальний об'єм стеку не повинен перевищувати 64 Кбайт. Останнє значення рекурсiї повинно бути iнiцiалiзоване. При зворотньому ходi цi результати читаються зi стеку i приймають участь в обчисленнi iтерацiйного алгоритму.
Завдання для роботи: Визначити чи задана цiла квадратна матриця є ортонормованою, тобто такою, в якiй скалярний добуток кожної пари рiзних рядкiв дорiвнює 0, а скалярний добуток кожного рядка на себе дорiвнює 1.
Текст програми:
program p;
Uses crt;
Const n=4;
Type TMatrix=array [1..n,1..n] of real;
Function Ort(A:TMatrix):Boolean;
Var i,j,k:integer; s:real; b:boolean;
begin
b:=true;
s:=0;
For i:=1 to n do
For j:=i+1 to n do
begin
For k:=1 to n do
s:=s+A[i,k]*A[j,k];
if s<>0 then b:=false;
end;
For i:=1 to n do
begin
s:=0;
For k:=1 to n do
s:=s+ A[i,k]*A[i,k];
if s<>1 then b:=false;
end;
Ort:=b;
End;
Var i,j:integer;
A:TMatrix;
q:char;
Begin
Repeat
clrscr;
For i:=1 to n do
for j:=1 to n do
Begin
Write ('A[',i,' ',j,'] = ');
Readln (A[i,j]);
End;
If Ort(A) then writeln ('Матриця ортонормована')
else Writeln('Матриця не ортонормована');
writeln('------------------------');
Writeln ('Для виходу натисніть "q"');
q:=readkey;
Until q='q';
End.