- •Программирование на языках высокого уровня
- •1. Основные понятия
- •1.1. Алфавит и словарь языка
- •1.2. Скалярные, стандартные типы данных
- •1.3. Встроенные функции
- •1.4. Структура программы
- •2. Программирование вычислительных процессов
- •2.1. Линейные процессы вычислений
- •2.2. Разветвляющийся вычислительный процесс
- •2.3. Программирование циклов
- •3. Программирование данных
- •3.1. Конструирование простых пользовательских типов
- •3.2. Массивы. Регулярные типы
- •3.3. Сортировка одномерного массива
- •3.4. Многомерные массивы
- •4. Работа со строковыми данными
- •4.1 Массив символов
- •4.2 Манипулирование строками string
- •7.4. Массив строк типа string
- •5 Подпрограммы, определенные пользователем
- •5.1 Описание функций
- •5.2 Передача имени объекта в качестве параметра функции
- •5.3 Рекурсивные вычислительные процессы
- •5.4. Описание процедур
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. Если бы была такая необходимость, то в теле функции можно бы было прочитать значение этих переменных и даже присвоить им новые значения, что, впрочем, делать не рекомендуется из соображений трудностей, возникающих при отладке.
Если функций несколько, то в них могут быть идентификаторы переменных и констант с одинаковыми наименованиями, но область их действия будет распределяться только на тот блок, где они описаны, поэтому их описания (типы данных) могут различаться. Если в функции локальная константа или переменная имеют тот же идентификатор, что и глобальная константа или переменная, то глобальная из этой функции становится невидимой (недоступной).