double arrow

Var


Uses

End.

Модули

Begin

Var

Begin

Begin

Begin

Var

Var

Uses

Begin

Uses

Begin

Var

Repeat

Var

Uses

Begin

Uses

Begin

Var

Begin

Var

Uses

Begin

Var

Uses

Type

Type

Подпрограммы

9.1. Основные понятия

Подпрограмма – логически законченная часть программы, которую по имени можно вызывать в разные места программы неограниченное число раз.

Она решает часть общей задачи. У нее есть имя, которое используется при вызове подпрограммы в основную программу.

Подпрограммы бывают 2 видов:

– процедуры и

– функции.

Процедура не возвращает значений (например, рисует) или возвращает несколько значений (корни квадратного уравнения).

Функция возвращает одно значение.

Программа без структурных элементов называется монолитной. Минимальный элемент такой программы - оператор. Она сложна в разработке, отладке и сопровождении.

Структурированная программа называется модульной. Она содержит более крупные компоненты - подпрограммы. Модульная программа проще создается, более понятна.




Модульная программа может иметь иерархическую структуру.

Работа с подпрограммой включает 2 этапа:

– описание подпрограммы;

– вызов подпрограммы.

Преимущества подпрограммы:

– в программе нет дублирования кода;

– повышается надежность программы;

– улучшается «читаемость» программы;

– облегчается процесс отладки.

Различают подпрограммы:

– без параметров,

– с параметрами.

9.2. Процедурный тип

Процедурный тип расширяет традиционное понятие подпрограмм, позволяя обращаться с подпрограммами как с переменными. Используется в программировании, где структура программы отражает структуру решаемой задачи. В результате алгоритм решения ясно виден из исходного текста.

Процедурный тип это внешние данные, используемые подпрограммой.

Процедурный тип объявляется следующим образом:

<имя1> = procedure;

<имя2> = procedure(<список параметр.>);

<имя3> = function (<список параметров>) :<тип результата>;

Этот тип определяет процедуру без параметров, процедуру с параметрами или функцию.

Например:

Proc1 = Procedure; // Тип – процедура без параметров

Proc2 = Procedure(x,y :real); //Тип – процедура с параметрами

Func1 = Function(x,y : real): real; //Тип – функция

9.3. Сравнение вариантов

Рассмотрим 2 варианта решения одной и той же задачи: вывод текстовых блоков с вставкой стандартного разделителя из трех строк из набора символов “ * ” в конце.

1 –й вариант (Монолитная программа)

program Example1;

{$APPTYPE CONSOLE}



SysUtils;

i, j : integer;

Writeln('Text 1'); // Вывод 1 текста

for j :=1 To 3 Do

begin// Вывод строки из 20 символов “ * ”

for i :=1 To 20 Do write( ' * ' );

writeln;

end;

Writeln('Text 2'); //Вывод 2 текста

for j :=1 To 3 Do

begin// Вывод строки из 20 символов “ * ”

for i :=1 To 20 Do write( ' * ' );

writeln;

end;

readln

end.

 
 


2 – й вариант (Модульная программа)

program Example2; DrawStr

{$APPTYPE CONSOLE}

SysUtils;

Procedure DrawStr; // Процедура “Рисовать строки”

i, j : integer;

for j :=1 To 3 Do

begin// Вывод строки из 20 символов “*”

for i :=1 To 20 Do write( ' * ' );

writeln; // Перейти к следующей строке

end;

end;

begin//основная программа

Writeln( ' Text 1 ' ); // Вывод 1 текста

DrawStr; // Вывод строк разделителя

Writeln( ' Text 2 ' ); // Вывод 2 текста

DrawStr; // Вывод строк разделителя

readln

end.

9.4. Аргументы и параметры

Параметры - данные, с которыми работает подпрограмма. Это внутренние данные для подпрограммы и перечисляются в ее заголовке с указанием типов.

Они связаны с аргументами.

Аргументы - данные, передаваемые в подпрограмму или возвращаемые из нее. Это внешние для подпрограммы данные, с которыми имеет дело вызывающая часть программы. В подпрограмме им соответствуют параметры. Указываются в списке аргументов при обращении к подпрограмме и являются фактическими параметрами.

Синонимы:

Параметры = формальные параметры,

Аргументы = фактические параметры.

------------------------------------------------------

Для аргументов и параметров надо соблюдать:

– одинаковое количество (An=Pn) ,

– одинаковый порядок следования (A1-P1, A2-P2..)

– совместимость типов.

Все формальные параметры разделяются на 4 категории:



– параметры-значения – в списке параметров указывается их тип, например (x,y : real); передаются через стек в виде копий и остаются неизменными в подпрограмме;

– параметры-константы – в списке параметров снабжаются служебным словом (const s : real); передаются подпрограмме в виде копий с помощью адресов, изменяться подпрограммой не могут;

– параметры-переменные – в списке параметров снабжаются служебным словом (x,y:byte; var s1 : real); передаются подпрограмме в виде копий с помощью адресов, инструкции подпрограммы могут изменить значение переменной, являющейся фактическим параметром;

– параметры процедурного типа – в списке задаются именами и являются параметрами-значениями.

9.5. Области действия имен

Структура подпрограммы идентична структуре программы.

Имена, объявленные в главной программе являются глобальными. Они доступны во всех внутренних точках, в том числе и в подпрограммах.

Имена, объявленные в подпрограмме являются локальными. Они доступны во всех внутренних точках подпрограммы.

Локальное имя во внешней программе недоступно. Память под них выделяется автоматически в момент вызова подпрограммы.

Если используются одинаковые локальное и глобальное имя, то внутри процедуры локальное имя блокирует глобальное.

Формат доступа к глобальному имени:

<имя программы>.<глобальное имя> //имя составное

Чтобы получить доступ к такому глобальному имени в подпрограмме его надо указывать составным.

9.6. Функция

Объявление функции в общем виде

Function <Имя> (p1,p2:T1;...):T; // Заголовок функции: Имя функции

//объявление локальных переменных - параметров

------------ // тело функции

Имя :=<выражение>; //или

Result := <выражение>; //глобальное имя

------------

end;

--------------------------------------------------------

Имя - имя функции (имя существительное) используется для ее вызова,

T - тип возвращаемого функцией результата.

p1, p2 - имена формальных параметров, значение которых используются для вычисления значения функции. Объявляется в заголовке функции. Конкретные значения параметры получают во время работы программы в результате вызова функции из основной программы.

T1 - их тип.

Обращение при обычном синтаксисе.

Форма вызова функции:

program Example3;

{$APPTYPE CONSOLE}

SysUtils;

var//Объявление аргументов.

a1: integer;

a2,a3: real;

Function MyFunc(p1: integer; p2: real): real; //Заголовок функции

// Разделы локальных определений

//Тело функции

MyFunc:=<выражение>;

. . .

end;

begin//Основная программа

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

a3:=3+MyFunc(a1,a2); //Вызов функции по имени в выражении

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

end.

-----------------------------------------------------

Соответствия: p1 - a1, p2 - a2

Задача1 . Написать функцию, проверяющую, является ли целое число, введенное с клавиатуры четным. Программа должна использовать эту функцию, проверять является ли число четным или нет, и выводить соответствующее сообщение.

 
 


program Example4;

{$APPTYPE CONSOLE}

SysUtils;

m: integer; //вводимое с клавиатуры число

function Chet(n:integer): boolean; //Заголовок функции

begin//Тело функцииChet

if n mod 2 = 0 then Chet:=True

else Chet:=False;

end;

begin// Основная программа

readln (m); // Проверка условия на четность числа m

// с помощью функции Chet

if chet(m) then writeln(m,' - chetnoe chislo')

else writeln(m,' - nechetnoe chislo');

until m=0;

readln

end.

9.7. Процедуры

Объявление процедуры в общем виде

Procedure <Имя>( p1, p2 : T1; ... // Параметр-значение

var p3, p4 :T2; ... // Параметр-переменная

const p5, p6 : T3; ...); //Параметр-константа

//объявление локальных переменных - параметров

//тело процедуры

end;

--------------------------------------------------------

Имя - имя процедуры (глагол) подпрограмму-, используется для ее вызова

var - признак параметров-переменных,

const -признак параметров констант;

p1, p2, p3, p4, p5, p6 - имена параметров,

T1, T2, T3 - их типы.

Обращение. Форма вызова процедуры:

program Example5;

{$APPTYPE CONSOLE}

SysUtils;

var// Объявление аргументов

a1: integer;

a2 : real;

{..........…..}

Procedure MyProc( var p1: integer; p2 : real);

//Разделы локальных определений

//Тело подпрограммы

end;

begin // Основная программа

{...............}

MyProc(a1, a2); //Вызов процедуры по имени в строке кода

{...............}

end.

----------------------------------------------------------

Соответствия: p1 - a1, p2 - a2

Задача2. Вывести таблицу квадратных корней.

Для оформления таблицы использовать процедуру Line. Line

program Example6;

{$APPTYPE CONSOLE}

SysUtils;

i:byte;

Procedure Line(n:integer; c:char);

k:byte;

for k:=1 to n do write(c);

writeln;

end;

begin

writeln('Tabl kvadratnyx korney');

Line(15,'=');

writeln('Chislo | Koren');

Line(15,'=');

for i:=1 to 5 do

writeln(i:5,' ',sqrt(i):6:2);

Line(15, '-');

end;

readln

end.

9.8. Процедура или функция?

Процедура и функция два способа оформления подпрограммы. Одну и ту же подпрограмму можно оформить как процедуру или как функцию.

Пример вычисления сопротивления цепи (Sopr), состоящей из трех параллельных сопротивлений (R1, R2, R3).

Procedure SoprPar(r1, r2, r3:real; var sr:real);

sr := (r1+r2+r3)/(r1*r2*r3);

end;

Function SoprPar(r1, r2, r3:real; var sr:real):real;

sr : real;

sr := (r1+r2+r3)/(r1*r2*r3);

SoprPar:=sr;

end;

Оформление подпрограммы в виде функции более предпочтительно, т.к. целью вычисления является получение одного значения.

Правило:

Если подпрограмма должна изменить значение только одной переменной основной программы, то ее следует оформить как функцию, в остальных случаях подпрограмму следует оформить как процедуру.

Модуль – повторное использование функций и процедур, оформленный в виде отдельного файла.

Создание модуля:

Командой File => New => Unit (Файл => Новый => Модуль) в редактор кода проекта добавляется страничка с заготовкой модуля, которая затем заполняется кодом:

Шаблон модуля:

unit MayUnit; // имя модуля изменяется после его сохранения

interface//описательная часть

implementation// реализация

. . .// код модуля

Использование модуля MayUnit :

Добавить этот модуль по имени к проекту в список модулей.

program Blank;

SysUtils, MayUnit;







Сейчас читают про: