что такое подпрограмма функция

Процедуры и функции: обзор

Что такое процедуры и функции

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

Описание процедур и функций

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

Описание процедуры имеет вид:

procedure имя ( список формальных параметров );
раздел описаний
begin
операторы
end;

Описание функции имеет вид:

function имя ( список формальных параметров ): тип возвращаемого значения ;
раздел описаний
begin
операторы
end;

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

Вызов подпрограммы

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

begin
var x := ReadInteger;
var y := ReadInteger;
var res: integer;
DoAdd(x,y,res);
Print(res);
DoAdd(2*x,y,res);
Print(res);
end;

Для вызова функции используется выражение вызова функции.

Переменная Result

function MinElement(a: array of real): real;
begin
Result := real.MaxValue;
foreach var x in a do
if x

begin
var a := Seq(1,5,3);
writeln(MinElement(a) + Sum(2,3));
end.

Если внутри функции не присвоить переменной Result некоторое значение, то функция вернет в результате своего вызова непредсказуемое значение.

Упрощенный синтаксис описания подпрограмм

В PascalABC.NET имеется упрощенный синтаксис описания однооператорных процедур:

Аналогичный синтаксис имеется для функций, вычисляющих одно выражение:

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

Источник

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

Тема урока: “Процедуры и функции. Понятие подпрограмм. Механизм реализации подпрограмм с помощью процедур”.

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

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

Развивающая: развитие речи, умение делать выводы, выделять главное.

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

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

Ход урока

Приветствие, проверка присутствующих. Объяснение хода урока.

II. Актуализация и проверка знаний.

III. Теоретическая часть. Лекция.

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

Подпрограммы имеют структуру, аналогичную главной программе. Они содержат заголовок со специальным словом — признаком подпрограммы, имя и, при необходимости, списки передаваемых на обработку и получаемых из подпрограммы данных. Затем могут располагаться все имеющиеся в главной программе разделы описаний: меток, констант, типов и переменных. В этих разделах описываются данные, используемые только внутри подпрограммы и являющиеся промежуточными при её выполнении. Такие данные называются локальными. В подпрограмме могут участвовать переменные, описанные в главной программе. Эти данные называются глобальными, их значения и подпрограмма, и главная программа берут из общей памяти.

Подпрограммы могут быть стандартными, определёнными системой Pascal, и собственными, т.е. созданные отдельным пользователем.

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

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

Любая процедура начинается с заголовка, который является её обязательной частью. Он состоит из служебного слова Procedure, за которым следует имя процедуры, а в круглых скобках — список формальных параметров. После заголовка могут идти те же разделы, что и в программе.

Procedure [(формальные параметры)]

Результат выполнения процедуры — это одно или несколько значений. Оно передаётся в основную программу как значение её параметра. При вызове процедуры её формальные параметры заменяются фактическими в порядке их следования.

СЛАЙД 1. ПРОЦЕДУРЫ БЕЗ ПАРАМЕТРОВ

Описание процедуры без параметров имеет вид:

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

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

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

СЛАЙД 2. ПРОЦЕДУРЫ С ПАРАМЕТРАМИ

Процедура NOD c параметрами может иметь заголовок:

procedure NOD (a,b: integer; var k: integer);

Вызов этой процедуры: NOD (x,y,m);

IV. Практическая часть.

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

Учащиеся решают задачу в группах (в среде редактора Pascal ) :

Учитель контролирует работу групп. После того, как все группы справились с задачей, учитель демонстрирует слайды с правильным решением.

Процедура вычисления наименьшего общего кратного

двух натуральных чисел с использованием процедуры с параметром.

что такое подпрограмма функция. Смотреть фото что такое подпрограмма функция. Смотреть картинку что такое подпрограмма функция. Картинка про что такое подпрограмма функция. Фото что такое подпрограмма функция

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

— выучить материалы лекции.

— Задача: Используя процедуру, упорядочить значения трёх переменных a, b и c в порядке их убывания.

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

Источник

Подпрограмма

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

Содержание

Назначение подпрограмм.

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

Механизм подпрограмм, их описание и вызов

В простейшем случае (в ассемблерах) подпрограмма представляет собой последовательность команд (операторов), отдельную от основной части программы и имеющую в конце специальную команду выхода из подпрограммы. Обычно подпрограмма также имеет имя, по которому её можно вызвать, хотя ряд языков программирования допускает использование и неименованных подпрограмм. В языках высокого уровня описание подпрограммы обычно состоит по меньшей мере из двух частей: заголовка и тела. Заголовок подпрограммы описывает её имя и, возможно, параметры, то есть содержит информацию, необходимую для вызова подпрограммы. Тело — набор операторов, который будет выполнен всякий раз, когда подпрограмма будет вызвана.

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

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

Результатом выполнения такой программы станет вывод строки «Hello» и трёх строк «Bye».

Некоторые языки программирования (например, Паскаль, Ада, Модула-2) допускают описание вложенных подпрограмм, то есть помещение подпрограмм внутрь других подпрограмм. Такие вложенные подпрограммы могут использоваться только в той подпрограмме, в которой они описаны. В иных случаях (например, в языке Си) вложение подпрограмм не допускается. Никаких принципиальных преимуществ вложение подпрограмм не даёт, но может быть удобно для более логичной структуризации программы (если какая-то подпрограмма используется только в некоторой другой подпрограмме, логично поместить первую во вторую).

Параметры подпрограмм

Назначение параметров

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

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

В приведённом примере параметр Line подпрограммы subprog в каждом вызове получает различное значение, благодаря чему выводятся не одинаковые строки, а разные.

Формальные и фактические параметры

Способ передачи параметров в подпрограмму

Существует несколько способов передачи параметров в подпрограмму.

Язык программирования может предоставлять возможность передавать параметры в подпрограммы либо только по значению (так сделано в языке Си), либо по значению и по ссылке (это реализовано в Паскале, Аде, C++), либо по имени и значению (это реализовано в языках Алгол и Алгол 68). В последних двух случаях для различения способов передачи параметра используются отдельные синтаксическая конструкции (в Паскале это ключевое слово var при описании параметра). В действительности, если язык содержит понятие ссылки (указателя), то можно обойтись и без передачи параметра по ссылке (её всегда можно смоделировать, описав параметр типа «ссылка»), но эта возможность удобна, так как позволяет работать с формальным параметром-ссылкой без разыменования, а также повышает надёжность и безопасность программы.

На параметры, передаваемые по ссылке, накладываются естественные ограничения: фактический параметр, подставляемый на место такого параметра при вызове, обязан быть переменной (то есть иметь адрес), а в языках со строгой типизацией — ещё и иметь в точности такой же тип данных.

Виды подпрограмм

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

Подпрограммы, входящие в состав классов в объектных языках программирования, обычно называются методами. Этим термином называют любые подпрограммы-члены класса, как функции, так и процедуры; когда требуется уточнение, говорят о методах-процедурах или методах-функциях.

Источник

Подпрограммы-процедуры и подпрограммы-функции

Вы будете перенаправлены на Автор24

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

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

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

В VBA подпрограммы разделяются на:

Подпрограммы-процедуры

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

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

[ Private | Public ] Sub ( список )

В данном случае квадратные скобки указывают на необязательный параметр, вертикальная черта – на варианты параметров, выбираемых пользователем. Так, элемент описания Private указывает, что рассматриваемая процедура доступна только из программы и процедур только того модуля, в котором она описана. Элемент описания Public указывает на то, что рассматриваемая процедура доступна для всех программ и процедур во всех модулях.

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

Готовые работы на аналогичную тему

Call ( фактические переменные )

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

Private Sub Workbook_Open()

Call Логарифм(a, b, x)

Call Логарифм(a + b, (a + b) ^ 5, y)

Call Логарифм(10, 10000, z)

Call Логарифм(y, x, z)

Public Sub Логарифм(ByVal основание, аргумент_As Single, ByRef результат _As Single)

результат = Log(аргумент) / Log(основание)

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

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

Подпрограммы-функции

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

Подпрограмма-функция имеет следующий синтаксис:

[Public | Private] Function (список) _As

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

Обращения к подпрограммам-функциям аналогичны обращению к стандартным математическим функциям VBA.

Рассмотрим оформление предыдущего примера в виде подпрограммы-функции и обращения к ней.

Private Sub Workbook_Open()

$y = Логарифм(a + b, (a + b) ^ 5)$

$z = Логарифм(10, 10000)$

Public Function Логарифм(ByVal основание, аргумент _

As Single) As Single

Логарифм = Log(аргумент) / Log(основание)

Результат счета по приведенным программам одинаковый и имеет вид, представленный на рисунке ниже:

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

Источник

Теоретический материал (Паскаль)

Сайт:Информатикс
Курс:Функции и процедуры. Рекурсия
Книга:Теоретический материал (Паскаль)

Оглавление

Понятие подпрограммы. Процедуры и функции. Стандартные подпрограммы

Подпрограммы решают три важные задачи:

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

Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными, т.е. определенными программистом.

Из набора стандартных процедур и функций по обработке одного типа информации составляются модули. Каждый модуль имеет своё имя (мы уже хорошо знакомы с модулями Crt, Graph). Доступ к процедурам и функциям модуля осуществляется при подключении этого модуля (Uses Crt, Graph).

Задание. Вызовите помощь по функции Cos и рассмотрите предоставленную информацию.

Сначала идет краткое описание подпрограммы (в одну фразу). Далее под словом Declaration (Объявление) следует интерфейсная часть процедуры или функции, которая необходима для определения типов фактических параметров. Далее под словом Target приводятся платформы, на которых может использоваться подпрограмма: Windows, real (реальный режим DOS), protected (защищенный режим DOS). После слова Remarks следуют заметки, содержащие необходимые детали использования. В разделе See Also приведены имена подпрограмм, связанных с данной по смыслу или по совместному применению. Если перемещать курсор по этим именам (они выделяются подсветкой), то, выбрав одно из них (нажав клавишу ), можно получить справку по следующей подпрограмме. Каждая процедура и функция сопровождается примером применения, переключение к которому дает последняя строка справочной информации. Любой текст из Help может быть скопирован в редактируемый файл обычными приемами копирования через буфер. Копирование примеров или заголовков функций может значительно облегчить работу.

Существует другой способ получения сведений о процедурах и функциях. Для этого нужно использовать пункт меню Help/Reserved words (зарезервированные слова) или Help/Standard units (стандартные модули).

Задание. Рассмотрите список процедур и функций, выберите какие-либо из них и ознакомьтесь со справочной информацией.

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

Существует два способа объединения программ и подпрограмм пользователя:

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

Структура текста подпрограммы соответствует структуре текста основной программы за двумя исключениями:

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

Например, вызов функции

вернет в основную программу значение наименьшего из двух чисел и это значение будет присвоено переменной M.

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

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

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

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

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

Если говорить о плюсах использования подпрограмм, то можно назвать следующие:

В языке Паскаль выделяют два вида подпрограмм: процедуры (Procedure) и функции (Function). Любая программа может содержать несколько процедур и функций. Структура любой подпрограммы аналогична структуре всей программы.

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

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

Общая структура программы выглядит так:

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

Подпрограмма вызывается по своему имени с указанием необходимых параметров.

На этом занятии рассмотрим примеры организации наиболее простого вызова подпрограмм.

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

Задача 1. Написать программу, состоящую из трех подпрограмм и основной программы. Подпрограммы должны организовывать ввод чисел, вычисление их суммы и вывод результата.

Задача 2. Найти среднее арифметическое двух чисел.

Формальные и фактические параметры. Вызов по ссылке и по значению. Локальные и глобальные переменные и подпрограммы

Формальные и фактические параметры

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

Все формальные параметры можно разбить на четыре категории:

function Max( A: array[ 1..100 ] of real ): real;

Чтобы правильно записать этот заголовок, следует в основной программе ввести тип-массив, а затем использовать его в заголовке:

type tArr =array [ 1..100 ] of real;
function Max ( A: tArr ) : real;

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

Вызов по ссылке и по значению

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

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

Procedure SetDate (Year, Month, Day : Word);

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

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

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

Procedure GetDate (Var Year, Month, Day : Word);

Она имеет три переменные, передаваемые по ссылке. Если мы аналогично предыдущему случаю, вызовем эту процедуру из основной программы командой

GetDate (MyYear, MyMonth, MyDay);

процедура разместит свои переменные Year, Month, Day в тех же ячейках памяти, что и переменные основной программы MyYear, MyMonth, MyDay. После завершения подпрограммы эти переменные сохраняют полученные в процедуре значения.

Объявление параметра-константы в заголовке подпрограмм имеет вид

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

Например, Procedure Primer (Const x : byte).

Внимание! При вызове процедур необходимо следить за соответствием типов данных в вызывающей программе и подпрограмме.

Параметры – значения

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

procedure Inp ( Max, Min: real ; N: Word );
function Mult (X, Y: integer): real;

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

Локальные и глобальные переменные и подпрограммы

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

Рассмотрим две почти одинаковые программы.

Program Variant1;
Var
X : real;
Procedure writeX;
Var
X : real;
Begin
write(X)
End;
Begin
X := Pi;;
writeX
End.

Program Variant2;
Var
X : real;
Procedure writeX;
Begin
write(X)
End;
Begin
X := Pi;
writeX
End.

Нетрудно догадаться о содержании решаемой задачи: присвоить глобальной переменной X некоторое значение, а затем напечатать это число через специальную процедуру.

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

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

Возникает вопрос, какова роль локальных переменных, нельзя ли все переменные описать как глобальные?

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

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

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

Процедуры

Структура процедуры имеет следующий вид:

Процедура вызывается по имени:

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

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

Заголовок процедуры может выглядеть так:

PROCEDURE GG(a, b, c : integer);

а вызываться она может так: GG(3, n, m)

Здесь a, b, c – формальные параметры, а 3, n, m – фактические параметры.

Таким образом, в процедуру передаются значения: a=3, b=n, c=m.

Переменные, описанные в процедуре в разделе описаний переменных после слова Var, являются внутренними переменными процедуры, т.е. промежуточными. Они не являются исходными данными для операций внутри процедуры и не являются результатом её выполнения, а нужны лишь для хранения промежуточной информации.

Данные и результаты описываются в круглых скобках после имени процедуры. Перед описанием переменных-результатов пишут служебное слово var.

Procedure express(a, b, c : real; var x, y : real);
Var
z : real;
begin
z:=a + b + c;
x:=sqr(z);
y:=sqrt(z);
end ;

Эту процедуру можно вызвать следующим образом:

express(8.6, 6.9, 9.5, x1, y1);

Входные формальные параметры a, b, c принимают значения соответствующих фактических параметров: a=7.6; b=6.8; c=9.5.

При этих значениях выполняется процедура. Результатом выполнения процедуры являются x, y, которые передают свои значения соответствующим фактическим параметрам x1, y1. Таким образом, в основной программе будем иметь x1=625, y1=5.

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

Функции

Другой вид подпрограммы – функция оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров); результат обозначается именем функции и передаётся в основную программу.

Функция оформляется в следующем виде:

Вызывается функция по её имени с указанием фактических параметров.

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

Напомним, что n! представляет собой произведение n чисел натурального ряда: n! = 1*2*3*. *n

Function fac(n: integer): integer;
Var
p, i: integer;
Begin
p:=1;
for i:=2 to n do
p:=p*i;
fac:=p;
End;

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

Различие между процедурами и функциями

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

Program ProcedureAndFunction;
Uses
Crt;
Var
a, b, SumNumbers : integer;
Procedure Summa1(Var Sum : integer; a, b : integer);
Begin
Sum:= a+b;
End;

Function Sum(a, b : integer) : integer;
Begin
Sum:= a+b;
End;

Begin
ClrScr;
a := 12;
b := 15;
Summa1(SumNumbers, a, b);
writeln (‘С помощью процедуры сумма чисел равна ‘, SumNumbers);
writeln (‘С помощью функции сумма чисел равна ‘, Sum(a, b));
End.

Вызов процедуры производится по ее имени. Наряду с параметрами-значениями a и b, которые подлежат сложению, в списке параметров присутствует параметр-переменная Sum, который содержит возвращаемое процедурой значение – сумму.

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

Function Sum(a, b : integer) : integer;

внешне похоже на объявление переменной Sum типа integer. Тип функции объявляется следом за списком параметров – после закрывающейся скобки этого списка и двоеточия.

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

Если не обращать внимания на наличие списка параметров, то этот оператор выглядит как присвоение переменной SumNumbers значения переменной Sum. Компилятор, конечно же, знает, что Sum – это имя функции (т.к. определение функции предшествует ее использованию) и организует вычисления соответствующим образом. Точно так же, как константа или переменная, вызов функции может использоваться в списке параметров оператора write (см. программу), что для процедур невозможно.

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

Итак, из вышесказанного возьмите на заметку следующее.

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

Особенности использования процедур и функций

Опережающее описание процедуры (директива Forward)

Описание процедуры, содержащее вместо блока операторов директиву Forward, называют опережающим описанием.

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

Возможность создавать «опережающее описание» для процедур позволяет решить следующую проблему: предположим, в некоторой программе Вы используете две процедуры с именами Proc1 и Proc2, причем процедура Proc1 использует вложенную процедуру Proc2, а процедура Proc2, в свою очередь, использует процедуру Proc1. Поскольку Вы не можете использовать не объявленную ранее процедуру, то у Вас возникает проблема, связанная с необходимостью развязать «зацикленные» друг на друга процедуры Proc1 и Proc2. Использование директивы Forward при объявлении процедуры Proc1 позволяет решить эту проблему.

Процедуры с ближним и дальним адресом вызова

Процедуры, созданные с использованием модели Far, могут быть вызваны из любого места программы. Недостатком этих процедур является их меньшее быстродействие.

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

Параметры-процедуры и параметры-функции

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

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

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

Процедуры и функции должны быть объявлены с директивой Far (использование дальнего типа вызова подпрограмм) и откомпилированы в состоянии <$F+>. А также они не должны быть:

При использовании параметров-процедур или параметров-функций в списке перед соответствующими формальными параметрами указывается зарезервированное слово Procedure или Function.

Procedure Example(k,l : integer; Var M : real; Procedure Prob; Function Step : real);

В списке формальных параметров процедуры Example:

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

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

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

Function Add(x, y :integer) : integer;
Begin
Add := x+y;
End;

Function Mult(x, y :integer) : integer;
Begin
Mult := x*y;
End;

Function Funny(x, y :integer) : integer;
Begin
Funny := (x+y)*(x-y);
End;

<$F->
Procedure Tab(w,h : integer; Operation : Func);
Var
x, y : integer;
Begin
for y := 1 to w do
begin
for x := 1 to h do
write(Operation(x,y):5);
writeln;
end;
End;

Begin
Tab(10,10,Add);
writeln;
Tab(10,10,Mult);
writeln;
Tab(10,10,Funny);
End.

В данной программе процедура Tab представляет собой общее действие, выполняемое над параметрами-функциями Add, Mult, Funny. После запуска программы сначала вызывается процедура Tab для фактических параметров 10, 10 и Add, в результате чего формальным параметрам w и h присваиваются значения 10 и 10, а формальному параметру Operation процедурного типа Func присваивается имя фактической функции Add. В результате этого на экран будет выведена таблица сложения от 1 до 10. Затем процедура Tab вызывается к исполнению для фактических параметров 10, 10 и параметра-функции Mult, в результате этого на экран будет выведена таблица умножения от 1 до 10. Аналогично вызов процедуры Tab с параметрами 10, 10 и Funny даст в результате на экране таблицу произведения суммы на разность чисел от 1 до 10.

Задание. Введите текст этой программы, запишите полученный файл на диск и откомпилируйте его. После того как компиляция выполнится успешно, исполните программу в пошаговом режиме с заходом в процедуры и пронаблюдайте за вызовом функций вычисления суммы, произведения двух чисел или произведения их суммы и разности. Обратите внимание на то, как при исполнении оператора write(Operation(x,y):5) в зависимости от фактического значения параметра-функции Operation процедурного типа Func осуществляется вызов различных функций Add, Mult или Funny. Попробуйте удалить строку с директивой компилятору об использовании дальнего типа вызова или возьмите в фигурные скобки описание процедурного типа Func и пронаблюдайте за результатом. В случае появления ошибок нажатием клавиши F1 получите справку о причинах ошибки и рекомендацию по ее исправлению.

Модули, созданные программистом

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

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

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

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

Interface
Uses ;
Const ;
Type ;
Var ;
Procedure ;
Function ;

Implementatoin
Uses ;
Const ;
Type ;
Var ;
Procedure ;
Function ;
Procedure ;
Function ;

Заголовок модуля мало чем отличается от заголовка программы. В модуле вместо зарезервированного слова Program используется слово Unit. Здесь же могут присутствовать директивы компилятору, дающие общие установки для всего модуля.

При выборе имени модуля необходимо учитывать одну особенность: имя модуля должно совпадать с именем файла, в котором он хранится, а значит, имя модуля не может состоять более чем из 8 символов. А также не забывайте, что имя не должно совпадать с именами объектов (процедур, функций и др.).

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

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

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

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

Примечание. Интерфейсная часть может быть пуста.

Реализационная часть также может быть пустой.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *