Теоретические сведения. Подпрограмма – это специальным образом оформленный алгоритм, который может многократно использоваться при решении более общей задачи

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

В языке Pascal подпрограмма является частью основной программы, ее описание располагается в описательной части программы, т.е. перед первым begin программы.

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

Описание подпрограмм можно сравнить с записываемой в математике формулой «в общем виде», в которую при расчетах подставляются конкретные значения. Поскольку далеко не каждую задачу можно свести к некоторой формуле, но можно записать алгоритм ее решения, то можно сказать, что подпрограмма – это та же инструкция по решению некоторой задачи. Как и формулу, подпрограмму можно использовать для различных данных, передаваемых из главной программы или других подпрограмм.

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

Структура описания функции имеет вид:

procedure <имя> [(<список формальных параметров>)];

[<раздел описаний>]

Begin

<перечисление операторов и программных единиц>

End;

Таким образом, процедуры имеют структуру, аналогичную главной программе и содержат:

· заголовок со специальным словом procedure – признаком подпрограммы, именем процедуры и необязательным списком формальных параметров – данных, передаваемых на обработку и получаемых из процедуры;

· все разделы описаний, необходимые для работы подпрограммы: метки, константы, типы, переменные и подпрограммы;

· раздел операторов, содержащий собственно алгоритм подпрограммы.

При работе с подпрограммой всегда выделяется два этапа:

· описание подпрограммы, т.е. запись алгоритма решения задачи в специальной форме;

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

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

Обмен данными между процедурой и вызывающей программой

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

Program Example1;

{Описание процедуры}

Procedure Hello; {Заголовок процедуры}

Begin

Writeln (‘Привет!’) {Исполняемый оператор процедуры}

End;

{Раздел операторов основной программы}

Begin

Hello; {Вызов процедуры}

Hello;

Hello

End.

Процедура Hello при каждом вызове (а их в основной программе три) делает одно и то же – просто выводит слово на печать.

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

Исходные данные à Алгоритм процедуры à Результат.

Для передачи исходных данных из основной программы в процедуру и возвращение результата из процедуры в основную программу используют либо глобальные переменные, либо параметры.

Использование глобальных переменных для обмена данными

Все описания (включая описания переменных), сделанные в главной программе до описания подпрограммы, видны и могут использоваться в этой подпрограмме. Такие описания называются глобальными, их значения и подпрограмма, и главная программа берут из общих ячеек памяти.

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

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

Задача 1. Найти минимальное из трех вещественных чисел

z = min (a, b, c), где z, a, b, c Î R.

Для решения задачи напишем процедуру, находящую минимальное из двух чисел и дважды последовательно вызовем ее для решения задачи, т.е. вначале найдем z = min (a,b), а затем z = min (z,c).

Program Min1;

{Описание переменных}

Var a,b,c, {исходные данные задачи}

x,y, {исходные данные функции}

z: real; {результат функции и результат задачи}

{Описание процедуры}

Procedure Min;

Begin

If x < y then z:= x

else z:= y

End;

Begin

{Ввод исходных данных задачи}

Writeln(‘Введите три числа’);

Readln(a,b,c);

{Присваивание исходных данных для функции}

x:= a;

y:= b;

Min; {Первый вызов функции}

{После вызова функции z=min (a,b) }

{Присваивание новых исходных данных для функции}

x:= z;

y:= c;

Min; {Второй вызов функции}

{Вывод результата}

Writeln (‘Наименьшее из введенных чисел - ’, z);

End.

Использование параметров для обмена данными

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

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

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

Формальные и фактические параметры должны соответствовать друг другу по количеству, типу и порядку следования.

Формальные параметры, описанные в заголовке процедуры, больше нигде не описываются. Их описание похоже на описание данных в разделе переменных и может также содержать слово var. Существуют параметры-значения и параметры-переменные.

Параметры-значения описываются без слова var. Для их хранения на время выполнения подпрограммы выделяются дополнительные ячейки в памяти. При вызове подпрограммы значения фактических параметров копируются в ячейки формальных параметров и алгоритм подпрограммы обращается именно к этим копиям. После окончания работы подпрограммы доступ к этим ячейкам теряется. Следствиями этого для параметров-значений являются следующие факты:

· в качестве фактического параметра при вызове подпрограммы в общем случае может быть выражение, в частности, переменная или константа;

· если фактическим значением параметра была переменная, то изменение значения формального параметра при выполнении подпрограммы не влечет за собой никакого изменения значения фактического параметра;

· параметры-значения могут использоваться только для передачи в подпрограмму исходных данных.

Параметры-переменные описываются со словом var. Для их хранения на время выполнения подпрограммы в памяти не выделяются дополнительные ячейки. При работе алгоритма подпрограммы переменные – формальные параметры – используют ячейки памяти фактических параметров и обращаются непосредственно к ним. Следствиями этого для параметров-переменных являются следующие факты:

· в качестве фактического параметра при вызове подпрограммы может быть только переменная;

· изменение значения формального параметра при выполнении подпрограммы приводит к такому же изменению значения фактического параметра;

· параметры-переменные могут использоваться как для передачи в подпрограмму исходных данных, так и для передачи результата из подпрограммы в вызывающую программу.

Напишем новую программу, решающую задачу 1 с использованием подпрограммы с параметрами. Исходные данные подпрограммы (x, y) могут быть описаны как параметры-значения, а результат (z) должен быть описан как параметр-переменная.

Program Min2;

{Описание переменных}

Var a,b,c, {исходные данные задачи}

z: real; {результат функции и результат задачи}

{Описание функции}

Procedure Min (x,y: real; var z:real);

Begin

If x < y then z:= x

else z:= y

End;

Begin

{Ввод исходных данных задачи}

Writeln(‘Введите три числа’);

Readln(a,b,c);

{Первый вызов функции}

Min (a,b,z);

{После вызова функции z=min (a,b) }

{Второй вызов функции}

Min (z,c,z);

{Вывод результата}

Writeln (‘Наименьшее из введенных чисел - ’, z);

End.

Пример выполнения лабораторной работы

Задание. Найти разность R между максимальным и минимальным элементами массива

Программа расчета:

program lab_8_2;

uses crt;

const MaxDim = 10; {максимальный размер матрицы}

type arr=array[1.. MaxDim,1.. MaxDim] of integer; {описание типа arr}

{для массива А }

var A: arr; {массив А}

R: integer; {разность}

Amax: integer; {максимальный элемент}

Amin: integer; {минимальный элемент}

m: word; {реальный размер квадратной матрицы}

fi,fo: text; {файловые переменные}

{описание процедуры чтения массива из файла}

{f, a1, MaxD, m1 – формальные параметры}

Procedure ReadFromFile (var f:text; var a1:arr; MaxD:word;var m1:word);

{Исходные данные: f – файл исходных данных,

MaxD – максимальная размерность массива a1.

Результат: заполненный массив a1 и его реальный размер – m1.. }

Var i, j: word; {счетчики по строкам, столбцам –

локальные переменные }

begin

readln (f,m1); {чтение размера матрицы из}

{первой строки файла}

if m1> MaxD then {проверка размера матрицы}

begin

m1:= MaxD;

writeln(‘Матрица из файла урезана до размера массива’);

end;

for i:=1 to m1 do {чтение из файла матрицы А}

begin

for j:=1 to m1 do read (fi,a1[i,j]);

readln(fi); {перевод указателя файла на новую строку}

end;

end;

{описание процедуры нахождения минимального и максимального элементов массива}

Procedure MaxMin(a1:arr; m1:word; var min, max: integer);

{Исходные данные: массив a1 и его реальный размер – m1.

Результат: min, max – минимальный и максимальный его элементы.}

Var i, j: word; {счетчики по строкам, столбцам –

локальные переменные }

begin

min:=a1[1,1]; {начальные установки}

max:=a1[1,1];

{поиск минимального и максимального элементов:}

for i:=1 to m1 do

for j:=1 to m1 do

begin

if a1[i,j] < min then min:=a1[i,j];

if a1[i,j] > max then max:=a1[i,j];

end;

end;

{описание процедуры вывода результата в файл и на экран}

Procedure SaveToFile(var f:text; min, max, R: integer);

{Исходные данные: f – файл для сохранения результата, min, max, R – выводимые в файл и на экран данные. Результатом подпрограммы является вывод результатов программы в файл и на экран}

begin

writeln (fo,' Amax=',max,' Amin=',min,' Разность=',R);

writeln ('Amax=',max,' Amin=',min,' Разность=',R);

end;

{начало основной программы}

begin

clrscr;

assign (fi, 'input8_2.pas');

reset (fi);

{вызов процедуры чтения данных из файла}

{ fi, A, MaxDim, m – фактические параметры}

ReadFromFile (fi, A, MaxDim, m);

close(fi);

{вызов процедуры решения основной задачи}

{A, m, Amin, Amax – фактические параметры}

MaxMin(A, m, Amin, Amax);

R:=Amax-Amin; { вычисление разности}

assign (fo, 'out_8_2.pas');

rewrite (fo);

{вызов процедуры вывода результатов в файл}

{ fo, Amin, Amax, R – фактические параметры}

SaveToFile(fo, Amin, Amax, R);

close (fo);

repeat until keypressed;

end.

Файл исходных данных Input8_2.pas:

12 4 -7 6 1 7 -8 3 2

Файл результата Out_8_2.pas:

Amax=12 Amin=-8 Разность=20

Варианты заданий взять из лабораторной работы № 5 (для задачи 2).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



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