Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию.doc
Скачиваний:
7
Добавлен:
17.04.2019
Размер:
1.6 Mб
Скачать

5 Подпрограммы, определенные пользователем

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

• появляется возможность поблочной отладки больших программ, возможно, создаваемых несколькими программистами с последующим объединением от­лаженных подпрограмм в единое целое;

• экономится оперативная память, так как многократно используемые компонен­ты (подпрограммы) заносятся в память ЭВМ один раз;

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

Подпрограммы могут использоваться пятью способами:

• основная программа и подпрограммы располагаются в одном файле (программ­ном, а после трансляции — в объектном модуле);

• тексты подпрограмм расположены в различных файлах и подключаются ди­рективами компилятора;

• подпрограммы организуются как оверлейные структуры и поочередно загру­жаются на одно и то же место в оперативной памяти ЭВМ;

• подпрограммы пишутся на другом языке программирования и подключаются одним из вышеописанных способов;

• подпрограммы оформляются как внешние и вызываются из основной программы. В языке Паскаль подпрограммы реализуются в виде процедур или функций.

5.1 Описание функций

Функцией называется часть программы, имеющая уникальное имя, предназ­наченная для решения определенной задачи и возвращающая в точку вызова ска­лярное значение как значение имени этой функции.

Функция, определенная пользователем, содержит заголовок и тело. Заголовок функции имеет вид:

FUNCTION <имя функции> (<список параметров>):<тип результата>;

где FUNCTION – служебное слово; имя функции – идентификатор функции; спи­сок параметров – перечень формальных параметров (то есть исходных данных) с указанием их типов; тип результата – данное скалярного типа, значение которо­го должно приобрести имя функции. На рис. 5.1 представлена в виде «Черного ящи­ка» функция, имеющая список входных параметров и использующая переменные, описанные на более высоком уровне. Выходной параметр у функции всегда один, его называют результатом. Как правило, это данное любого скалярного типа или строка типа STRING.

Глобальные или локальные переменные

более высоких уровней

Параметры функции (параметры значения)

Формальные параметры

Алгоритм функции

Результат

Рис. 5.1 Структура функции, имеющей входные параметры

Допускается описание функции и без формальных параметров, примерами встроенных функций без входных параметров являются: PI (возвращает значение числа ) и RANDOM (возвращает случайное вещественное число в интервале от 0 до 1). Заголовок функции без параметров имеет вид:

FUNCTION <имя>:<тип результата>;

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

Алгоритм функции

Р езультат

Рис. 5.2 Структура функции без входных параметров

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

Примеры применения арифметических функций

Пример 45. Вычислить выражение:

В формуле многократно используются операции возведения в степень и извлечения корней, которые реализуются с помощью показательной функции. Та­кая функция не входит в список встроенных функций языка Паскаль. Поэтому для решения этой задачи предлагается создать пользовательскую, показательную функ­цию PW(Z, W), где Z — основание, a W — показатель степени. Эта функция реали­зует вычисление по формуле Zw.

PROGRAM PR45;

VAR X, Y, А, В: REAL;

FUNCTION PW(Z, W: REAL): REAL;

BEGIN

PW := EXP(Z * LN(W))

END;

BEGIN

WRITELN('Введите значения X, A, B'); READ(X, A, B); Y := (PW(A, X+l) + PW(ABS(X*X + 1), B) * COS(PW(X/2 + PI/8,1/3)) /PW(X*X + B*B, 1.5);

WRITELN('Y=', Y)

END.

На этом примере хорошо виден важнейший принцип использования функций, а именно, работу механизма передачи в тело функции значений параметров для осуществления расчетов. При вычислении Y функция PW вызывается четыре раза. Первый раз фактическими параметрами являются А и Х+1. При вызове функции PW происходит подстановка Z = A, W = Х+1. Теперь, когда формальные парамет­ры Z и W определены, управление передается операторам тела функции PW. По завершении расчетов результат (вещественное число) помещается в переменную с именем PW, то есть становится доступным в исходном выражении Y, откуда и был произведен вызов. При втором вызове функции PW опять происходит вычисление и подстановка значений фактических параметров во входные переменные функ­ции (называемые формальными параметрами) Z = ABS(X*X + 1) и W = В и т.д.

Пример 46. Вычислить выражение:

Z = F(A*B,A + B,| A-B|)-2.5-F(Sin(| А| + |В|),А*В,1.5-В).

где

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

PROGRAM PR46;

VAR А, В, Z: REAL;

FUNCTION F(X, Y, Z: REAL): REAL;

VAR F1: REAL;

BEGIN

F1:= X * Y * Z;

IF F1<0 THEN F:=X+Y+Z ELSE

IF F1=0 THEN F:=X*X+Y*Y + Z*Z ELSE

F=F1

END;

BEGIN

WRITELN('Введите значения А, В'); READ(A, В);

Z := F(A*B, A + B, ABS(A-B))-2.5*F(SIN(ABS(A) + ABS(B)), A*B, 1.5*B);

WRITELN('Z = ', Z: 12: 6)

END.

При программировании функции можно обратить внимание на то, что выра­жение X*Y*Z встречается четыре раза. Обычно в таком случае вводят рабочую переменную, в нашем примере F1 = X*Y*Z. Эта переменная используется только в теле функции, а в основной программе не нужна. Поэтому переменная F1 объявля­ется в разделе VAR функции и поэтому доступна только из операторов этой функ­ции. Такая переменная называется локальной переменной. Локальная переменная существует только во время выполнения функции и недоступна из тела основной программы. Переменные, объявленные в разделе описания VAR основной програм­мы, называются глобальными, они доступы из основной программы и из всех функ­ций этой программы. В нашем примере таких переменных три А, В, Z. Если бы была такая необходимость, то в теле функции можно бы было прочитать значение этих переменных и даже присвоить им новые значения, что, впрочем, делать не ре­комендуется из соображений трудностей, возникающих при отладке.

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