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




НазваниеУчебное пособие Новосибирск 2001
страница8/10
Дата конвертации11.02.2016
Размер1.46 Mb.
ТипУчебное пособие
источникhttp://bulletinsite.net/books/programmer/vorobeva-ap/2001/files/sistemaprogramm2001.rtf
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Учебное пособие новосибирск 2011 удк 338. 23: 658. 1(075. 8) Цевелев В. В
Цевелев В. В. Управление инвестициями. Учеб пособие. — Новосибирск: сгупс, 2011. — 104 с
Учебное пособие Новосибирск 2001 iconУчебное пособие предназначено в помощь социальным педагогам, социальным работникам и другим специалистам. Цена 850 тг. Арт. 201 Сарсенова Ж. Н. Культурология. Учебное пособие. Алматы: Нур-Принт, 2010 300 с. Учебное пособие «Культурология»
Учебное пособие «Культурология» предназначено для использования в обучении по кредитной технологии. В конце каждой главы учебного...
Учебное пособие Новосибирск 2001 iconУчебное пособие для магистрантов и студентов гуманитарных специальностей Павлодар
Учебное пособие предназначено для студентов и магистрантов, обучающихся по специальности «Культурология». Написанное на конкретном...
Учебное пособие Новосибирск 2001 iconКнига представляет собой антологию тематически сгруппированных философских текстов извлечений из трудов мыслителей разных эпох, включая и современность. Пособие
Хрестоматия по философии: Учебное пособие / Отв ред и сост. А. А. Радугин. – Москва: Центр, 2001.– 416с
Учебное пособие Новосибирск 2001 iconУчебное пособие Тамбов 2002 г. Авторы составители: Кузьмина Н. В, Инькова Н. А., Зайцева Е. А., Толстых С. Г. Основы работы в Интернет: Учебное пособие. Ч тамбов: Изд-во тгту, 2002. с. 40
Учебное пособие «Создание Web-сайтов» предназначено для слушателей курсов повышения квалификации на базе Тамбовского рц фио по программе...
Учебное пособие Новосибирск 2001 iconУчебное пособие для студентов специальности
А86 Арын Р. С., И79 Иренов Г. Н. Этнополитология: учебное пособие. ─ Павлодар: эко, 2008. – 215 с
Учебное пособие Новосибирск 2001 iconУчебное пособие по английскому языку Для студентов юридического факультета
Юридические профессии в Великобритании: Учебное пособие на английском языке. – М.: Импэ им. А. С. Грибоедова, 2008. – 16 с
Учебное пособие Новосибирск 2001 iconУчебное пособие «Основы работы в Excel», 2003
Учебное пособие предназначено для студентов имтп, а также может быть использовано при самостоятельном освоении современного программного...
Учебное пособие Новосибирск 2001 iconУчебное пособие Для студентов экономического факультета Москва
К66 Антикризисное управление: Учеб пос.: Ч. II. М.: Импэ им. А. С. Грибоедова, 2001. 71 с
Учебное пособие Новосибирск 2001 iconУчебное пособие омск 2008 федеральное агентство по образованию государственное образовательное учреждение высшего профессионального образования
Учебное пособие предназначено для студентов и аспирантов высших учебных заведений, специализирующихся в области физики конденсированного...
Разместите кнопку на своём сайте:
Документы


База данных защищена авторским правом ©kzdocs.docdat.com 2012
обратиться к администрации
Документы
Главная страница