Лабораторна робота №5 (2 год)
модуль 1
Тема: Організація обміну даними між процедурами та функціями.
Мета: Формування навичок роботи з процедурами і функціями
Література:
Архангельский А.Я. Язык Pascal и основы программирования в Delphi
Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов.– М.: Мир, 1979.– 536 с.
Культин Н.Б. Turbo Pascal в задачах и примерах
М.С.Львов, О.В. Співаковський. Основи алгоритмізації та програмування.
Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7.0
Меженный О.А. Turbo Pascal
Немцова Т.И., Голова С.Ю., Абрамова И.В. Программирование на языке высокого уровня. программирование на языке Object Pascal
Окулов С.М. Основы программирования.– М.: ЮНИМЕДИАСТАЙЛ, 2002.– 424 с.
Павловская Т.А. Паскаль. Программирование на языке высокого уровня
Пильщиков В.Н. Сборник упражнений по языку Паскаль. Москва, Наука, 1989 г., 160 с.
Короткі теоретичні відомості
В розділі формальних параметрів перераховуються імена формальних параметрів, а потім називається їх тип. Таким чином, кожне опис формальних параметрів з точки зору синтаксису виглядає так само, як і опис змінних в розділі змінних. Перед деякими описами ставиться службове слово Var. Такі параметри називаються параметрами-змінними. Якщо перед описом службове слово Var не варто, це - параметри-значення.

Оператор процедури має вигляд:
< им’я > або < им’я > (< список фактичних параметрів >)

Приклад операторів процедури:

Picture
Power(( a + b )/2, 3, degree, root )
Integral ( 0, P/2, 1E-6, SUMMA)
Зверніть увагу на відповідність між заголовком процедури і оператором процедури. Між списками формальних і фактичних параметрів встановлено взаємно-однозначна відповідність, певну їх місцями в списках. Це відповідність ілюструється наступним прикладом:
Приклад. Розглянемо заголовок процедури і оператор цієї процедури:
Procedure Integral ( a, b, eps: real; var s: real );
Integral ( -Pi/2, Pi/2, 1E-6, summa );

Відповідність:

Формальний параметр Фактичний параметр

Значение a Выражение - Pi/2
Значение b Выражение Pi/2
Значение eps Данное 1E-6
Переменная s Переменная Summa
Як було зазначено вище, параметри бувають 2-х видів: параметри-значення та параметри-змінні. Якщо перед описом параметрів ніякого службового слова ні, мова йде про параметри-значеннях. Перед описом параметрів-змінних ставиться службове слово Var. При зверненні до процедури (в процесі виконання оператора процедури) формальним параметрам-значенням присвоюються значення відповідних фактичних параметрів, а замість імен формальних параметрів-змінних підставляються відповідні фактичні параметри-імена змінних, а потім виповнюється підпрограма, описана процедурою.Якщо х1, х2 ,..., хn - фактичні параметри-змінні, відповідні формальним параметрам-змінним v1, ... , Vn, то x1, x2, ..., xn повинні бути різними. Фактичними параметрами-значеннями можуть бути вирази або дані відповідних типів.Розглянемо приклад: Приклад. Програма обчислює координати точки (x0, y0) при послідовних поворотах і паралельних перенесення системи координат.
Program Coordinates;
Const Pi = 3.141592;
Var Alfa, Beta : Real;
x0, y0, x1, y1, x2, y2 : Real;
x, y : Real;
Procedure Rotate(x, y, Fi: Real; var u, v: Real );
var cosFi, sinFi : Real; { локальные переменные }
begin
Fi := Fi*Pi/180 ;
cosFi := Cos(Fi); sinFi := Sin(Fi);
{ параметры x, y защищены от глобальных переменных x, y }
u := x * cosFi - y * sinFi ;
v := x * sinFi + y * cosFi
end ;

Procedure Move(x, y, a, b : Real; var u, v: Real);
begin
u := x + a ; v := y + b
end;

begin
Read (x0, y0); Read (Alfa);
Rotate(x0, f0, alfa, x, y);
Read (x1, y1);
Move(x, y, x1, y1, x, y);
Read (Beta);
Rotate(x, y, Beta, x, y);
Read ( x2, y2 );
Move(x, y, x2, y2, x, y);
Writeln (‘================================’);
Writeln (‘абсцисса точки : ‘, х);
Writeln (‘ордината точки : ‘, y);
end.
Параметри-значення використовуються для передачі даних у процедуру. Це означає, що для параметра-значення на час виконання процедури резервується пам'ять, розмір якої визначений типом параметра і яка заповнюється при виклику процедури. Таким чином, використання параметрів-значень при передачі даних великого об'єму може призвести до невиправданих витрат часу процесора й адресовані пам'яті.Нехай, наприклад, мінлива A типу Sequence - масив з 1000 дійсних чисел і Procedure MaxMin (X: Sequence; var Max, Min: Real) - пошук максимального і мінімального елементів масиву X. Тоді при зверненні до процедури MaxMin за допомогою оператора MaxMin (A, Sup, Inf) компілятор виділить пам'ять (6 - 10 байт на кожен елемент масиву - всього 6000 - 10000 байт) і здійснить 1000 циклів пересилання чисел з A в X. Якщо ж параметр X визначити як параметр-змінну: Procedure MaxMin (var X: Sequence; var Max, Min: Real) ні пам'яті, ні пересилань не знадобиться.
Параметри константи. 
Ці параметри подібні параметрами значень за тим винятком, що їх значення не можна змінювати в підпрограмі. Їх не можна також передавати (усередині підпрограми) іншим підпрограми як параметри змінні. Разом з тим, коли передається посилання на об'єкт (як параметр константа), властивості об'єкта модифіковані можна. Використання параметрів констант дозволяє компілятору оптимізувати код для строкових і структурних параметрів. Крім того, це забезпечує також захист від ненавмисному передачі параметра другий підпрограмі як параметр змінної. 
Вихідні параметри. 
Ці параметри (out parameters), подібно параметрам змінним, також передаються по посиланню. Разом з тим початкове значення вихідного параметра ігнорується, так як він призначений тільки для повернення результату. Наприклад, procedure GetInfo (out Info: SomeRecordType);
Задачі для самостійного розв’язування
Скласти програму, що за поданими a і b міняє їх значення на квадратний корінь відповідно іншого числа без використання додаткової змінної. Розв’язати задачу, використовуючи процедури та функції. Результат округлити до тисячних.
Баба-Яга записалася на курси водіїв літаючих апаратів. Але справи в неї були кепські, бо вона ніяк не могла запам'ятати, яким чином визначається тривалість польоту, якщо відомі швидкість і відстань. Довелося їй звернутися по допомогу до Хлопчика-Мізинчика, який швиденько написав їй шпаргалку, куди Бабі-Язі треба було лише підставити свої значення. Як виглядала послідовність дій у цій шпаргалці і як нею користувалася Баба- Яга? Очевидно, що шпаргалку Хлопчика-Мізинчика можна оформити як допоміжний алгоритм. Параметрами, що передаються в цей алгоритм, будуть швидкість літаючого апарату та відстань, яку необхідно подолати, а вихідним параметром - шукана тривалість польоту. Скласти програму, яка б знаходила тривалість польоту за заданими швидкістю та відстанню. Результат виконання програми округлити до сотих.
У Білосніжки наближався день народження, і її вирішили привітати друзі. Перш за все це були гноми, далі зібралися звірята, а потім і пташки прилетіли. Кожен з гостей приніс квіти, кількість яких зберігається у відповідному масиві: а1, а2, ... an - квіти гномів, b1, b2, … bm - квіти звірят та c1, c2, …, ck - квіти пташок. Скласти програму, яка б визначала, хто з гостей (gnomes, animals, birds) приніс найбільшу кількість квітів та серед кого з гостей опинився найщедріший гість?
Скласти програму, яка б із тексту S вилучала вказаний символ х і обчислювала кількість вилучень. Розв’язати задачу за допомогою процедур та функцій.
Дано рядок. Скласти програму, яка знаходить слова, що мають подвоєння букв. Розв’язати задачу за допомогою процедур або функцій.
Дано натуральні числа k, l, m, дійсні числа x1,...,xk, y1,...,yl, z1,...,zm. Отримати Результат виконання програми округлити до тисячних.
Дано натуральні числа l, m. Отримати . Результат виконання програми округлити до тисячних.