Учебное пособие Новосибирск 2001


страница8/10
lit.na5bal.ru > Документы > Учебное пособие
1   2   3   4   5   6   7   8   9   10
ГЛАВА 8. Подпрограммы

8.1. Структура сложной программы

Любая программа в Турбо Паскале может быть разбита на ряд самостоятельных программных единиц - подпрограмм. Такое разделение вызвано двумя причинами.
1. Экономия памяти.

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

2. Структурирование программы.

Алгоритм решения задачи может быть достаточно сложным, поэтому целесообразно выделить самостоятельные смысловые части алгоритма и оформить их в виде подпрограмм. Любая подпрограмма в свою очередь может содержать подпрограммы низшего уровня. Такие структурированные программы легче понять, и они удобны в отладке.

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

Структура сложной программы



Раздел типов TYPE в основной программе может отсутствовать. Его назначение рассмотрим позднее.

Описания подпрограмм располагаются вслед за разделом описания переменных основной программы VAR. Число подпрограмм может быть произвольным.

В Турбо Паскале различают два вида подпрограмм: процедуры и функции. В отдельных программах могут отсутствовать либо процедуры, либо функции.

8.2. Процедуры

Любая процедура состоит из заголовка и тела процедуры. Тело процедуры оформляется по тем же правилам, что и основная программа, т.е. состоит из раздела описания переменных и раздела операторов. Однако заканчивается тело процедуры символом ‘;’.

Общий вид описания процедуры


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

В Турбо Паскале допускается запись заголовка процедуры без списка параметров:

PROCEDURE <имя>;

Обращение к процедуре

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

Общий вид оператора вызова процедуры

<имя процедуры>(<список фактических параметров>);

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

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

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

Пример программы с процедурой

Вычислить значение:

,

где заданное вещественное число.

Введем обозначения:

; .

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

, где

номер шага вычисления (умножения);

число шагов вычислений.

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

Программа

Program Primer_1;

Var

a, r1, r2, r3, z: real;

Procedure ST (x: real; n: integer; var P: real);

var

i: integer;

begin

P := 1;

for i := 1 to n do P := P x;

end;

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

writeln(‘Введите число а’);

read (a);

ST(a, 5, r1);

ST(1/a, 5, r2);

ST(a, 7, r3);

Z := (r1 + r2) / (2 r3);

writeln(‘Z=’, Z:6:2);

End.

В заголовке процедуры с именем ST указаны два входных формальных параметра (x, n) и один выходной (P).

Выполнение программы всегда начинается с операторов основной программы. В данном случае после ввода заданного числа () последовательно вызывается три раза процедура ST. При каждом вызове происходит соответствующая замена формальных параметров (x, n) на фактические, и вычисленный результат через формальный параметр Р присваивается фактическим переменным r1, r2, r3 соответственно. Далее вычисляется значение Z, и результат выводится на экран.

Согласование параметров

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

Механизм замены параметров

В списке формальных параметров выделяется два вида параметров: параметры-значения и параметры-переменные. Механизм замены для каждого вида параметров различен.

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

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

Рассмотрим два примера, иллюстрирующих понятие параметра-значения и параметра-переменной.

Пример 1.

Program P1;

Var

x: integer;

Procedure Z (y: integer);

begin

y := 1;

end;
Begin

x := 0;

Z(x); {вызов процедуры}

writeln(‘x=’, x);

End.

В описанной процедуре Z формальный параметр y является параметром-значением, поэтому его изменение в процедуре (y := 1;) не влияет на значение фактического параметра x. После выполнения программы на экран будет выведено: x = 0.
Пример 2.

Program P2;

Var

x: integer;

Procedure Z (var y: integer);

begin

y := 1;

end;

Begin

x := 0;

Z(x);

writeln (‘x=’, x);

End.

В данной процедуре Z формальный параметр y является параметром-переменной, поэтому его значение после выполнения процедуры присваивается фактическому параметру x. На экран будет выведено: x = 1.
8.3. Функции
Функция отличается от процедуры тем, что результат ее работы возвращается в основную программу в виде значения функции. Поэтому для функции необходимо указать тип результата, а в теле функции должен присутствовать оператор присваивания, в левой части которого записывается имя функции.

Общий вид описания функции



Обращение к функции

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

.

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

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

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

Пример программы с функцией

Решить предыдущую задачу (см. параграф 8.2) с использованием функции.
Program Primer_2;

Var

a, Z: real;
Function ST (x: real; n: integer): real;

var

i: integer;

P: real;

begin

P := 1;

for i := 1 to n do P := P x;

ST := P;

end;

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

writeln(‘Введите число а’);

read(a);

Z := (ST(a, 5) + ST(1/a, 5)) / (2 ST(a, 7));

writeln(‘Z=’, Z:6:2);

End.

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

8.4. Параметры-массивы

Раздел типов

Если мы хотим передать в подпрограмму отдельный элемент

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

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

Type

Vect = array[1..10] of real;

Matr = array[1..5,1..8] of real;

В дальнейшем имена типов Vect и Matr можно использовать в разделе описания переменных, например:
Var

X: Vect;

A: Matr;

Объявленные типы указываются также в списке формальных параметров, например:

Function (X: Vect; A: Matr): real;

Если по условию задачи в подпрограмме требуется при разных обращениях обрабатывать массивы с разными размерами, то в разделе TYPE объявляется тип массива с наибольшим размером. Например, при передаче в подпрограмму массивов и в разделе TYPE надо записать:

Type

Vect = array[1..15] of real;

Тогда по описанию

Var

X, Y: Vect;

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

Примеры программирования задач с использованием подпрограмм

В приведенных ниже примерах для каждой задачи составим два варианта программы: с использованием процедуры и с использованием функции. На практике выбор того или иного варианта зависит от опыта программиста.

Задача 1

Даны два вектора: и .

Вычислить значение: , где

; ;

максимальные компоненты векторов и соответственно;

средние значения компонент векторов и соответственно.

Вариант 1. Использование процедуры.

Program P1_P;

Type

Vect = array[1..20) of real;

Var

X, Y: Vect;

i: integer;

Dx, Dy, D: real;

Procedure Mod_Otkl (A: Vect; n: integer; var Da: real);

var

ma, sa: real;

i: integer;

begin

ma := -1E6;

sa := 0;

for i := 1 to n do

begin

if a[i]>ma then ma := a[i];

sa := sa + a[i];

end;

sa := sa/n;

Da := abs(ma - sa);

end;

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

writeln(‘Введите массив X’);

for i :=1 to 8 do read(x[i]);

writeln(‘Введите массив Y’);

for i := 1 to 20 do read(y[i]);

Mod_Otkl(X, 8, Dx);

Mod_Otkl(Y, 20, Dy);

D := Dx / Dy;

writeln(‘D=’, D:6:2);

End.

Вариант 2. Использование функции.

Program P1_F;

Type

Vect = array[1..20) of real;

Var

X, Y: Vect;

i: integer;

Dx, Dy, D:real;

Function Mod_Otkl (A: Vect; n: integer): real;

var

ma, sa, Da: real;

i: integer;

begin

ma := -1E6;

sa:=0;

for i :=1 to n do

begin

if a[i]>ma then ma := a[i];

sa := sa +a i];

end;

sa := sa / n;

Da := abs(ma - sa);

Mod_Otkl := Da;

end;

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

writeln(‘Введите массив X’);

for i := 1 to 8 do read(x[i]);

writeln(‘Введите массив Y’);

for i := 1 to 20 do read(y[i]);

Dx := Mod_Otkl(X, 8);

Dy := Mod_Otkl(Y, 20);

D := Dx / Dy;

writeln(‘D=’, D:6:2);

End.

Задача 2

Даны две матрицы:

и .

Вычислить разность ,

где и - количество положительных элементов в матрице A и B соответственно.

Вариант 1. Использование процедуры.

Program P2_P;

Type

Matr = array[1..5, 1..7) of real;

Var

A, B: Matr;

i, j, KA, KB, C: integer;

Procedure CP(D: Matr; m, n: integer; Var KD: integer);

var

i, j: integer;

begin

KD := 0;

for i := 1 to m do

for j := 1 to n do

if d[i,j]>0 then KD := KD + 1;

end;

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

writeln(‘Введите матрицу A’);

for i := 1 to 5 do

for j := 1 to 6 do read(a[i,j]);

writeln(‘Введите матрицу В’);

for i := 1 to 4 do

for j := 1 to 7 do read(b[i,j]);

CP(A, 5, 6, KA);

CP(B, 4, 7, KB);

C := KA - KB;

writeln(‘C=’, C:6:2);

End.


Вариант 2. Использование функции.

Program P2_F;

Type

Matr = array[1..5, 1..7) of real;

Var

A, B: Matr;

i, j, C: integer;

Function CP(D: Matr; m, n: integer): integer;

var

i, j, KD: integer;

begin

KD := 0;

for i := 1 to m do

for j := 1 to n do

if d[i,j]>0 then KD := KD + 1;

CP := KD;

end;

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

writeln(‘Введите матрицу A’);

for i := 1 to 5 do

for j := 1 to 6 do read(a[i,j]);

writeln(‘Введите матрицу В’);

for i := 1 to 4 do

for j := 1 to 7 do read(b[i,j]);

C := CP(A, 5, 6) - CP(B, 4, 7);

writeln(‘C=’, C);

End.
1   2   3   4   5   6   7   8   9   10

Похожие:

Учебное пособие Новосибирск 2001 iconУчебное пособие географического практикума для обучающихся профильных классов Новокузнецк
Учебное пособие предназначено для обучающихся общеобразовательных и инновационных школ с углубленным изучением географии

Учебное пособие Новосибирск 2001 iconУчебное пособие Рекомендовано умо вузов России по образованию в области социальной работы
...

Учебное пособие Новосибирск 2001 iconУчебное пособие (для студентов) Тема: «Приемное отделение больницы»
...

Учебное пособие Новосибирск 2001 iconУчебное пособие включает программу для дошкольных образовательных...
Л18 Авдеева Н. Н., Князева О. Л, Стеркина Р. Б безопасность: Учебное пособие по основам безопасности жизнедеятельности детей старшего...

Учебное пособие Новосибирск 2001 iconМеталлы подгрупп
Щая химия в формулах, определениях, схемах. Справочное руководство. Под ред. В. Ф. Тикавого. Минск: Университетское, 1987; Глинка...

Учебное пособие Новосибирск 2001 iconКураков Л. П., Тимирясов В. Г., Кураков В. Л. К 93 Современные банковские...
К 93 Современные банковские системы: Учебное пособие. — 3-е изд., перераб и доп. — М.: Гелиос арв, 2000. — 320 с

Учебное пособие Новосибирск 2001 iconУчебное пособие для самоподготовки к практическим занятиям по нейрохирургии...
Учебное пособие предназначено для унификации требований к знаниям и умениям студентов при проведении практических занятий по нейрохирургии,...

Учебное пособие Новосибирск 2001 iconУчебное пособие для самоподготовки к практическим занятиям и самостоятельной работы
Учебное пособие для самоподготовки к практическим занятиям и самостоятельной работы студентов 4 курса педиатрического факультета...

Учебное пособие Новосибирск 2001 iconУчебное пособие для самоподготовки к практическим занятиям и самостоятельной работы
Учебное пособие для самоподготовки к практическим занятиям и самостоятельной работы студентов 6 курса педиатрического факультета...

Учебное пособие Новосибирск 2001 iconУчебное пособие для студентов Специальность: 09. 02. 03 Программирование в компьютерных системах
Химия. Самостоятельная внеаудиторная работа. Учебное пособие для студентов. Специальность: 09. 02. 03 Программирование в компьютерных...


Литература




При копировании материала укажите ссылку © 2000-2017
контакты
lit.na5bal.ru
..На главную