Процедуры языка паскаль
В языке Паскаль, как и в большинстве языков программирования, предусмотрены средства, позволяющие оформлять вспомогательный алгоритм как подпрограмму. Это бывает необходимо тогда, когда какой-либо подалгоритм неоднократно повторяется в программе или имеется возможность использовать некоторые фрагменты уже разработанных ранее алгоритмов. Кроме того, подпрограммы применяются для разбиения крупных программ на отдельные смысловые части в соответствии с модульным принципом в программировании.
Для использования подалгоритма в качестве подпрограммы ему необходимо присвоить имя и описать алгоритм по правилам языка Паскаль. В дальнейшем, при необходимости вызвать его в программе, делают вызов подпрограммы упоминанием в нужном месте имени соответствующего подалгоритма со списком входных и выходных данных. Такое упоминание приводит к выполнению входящих в подпрограмму операторов, работающих с указанными данными. После выполнения подпрограммы работа продолжается с той команды, которая непосредственно следует за вызовом подпрограммы.
В языке Паскаль имеется два вида подпрограмм — процедуры и функции.
Процедуры и функции помещаются в раздел описаний программы. Для обмена информацией между процедурами и функциями и другими блоками программы существует механизм входных и выходных параметров. Входными параметрами называют величины, передающиеся из вызывающего блока в подпрограмму (исходные данные для подпрограммы), а выходными — передающиеся из подрограммы в вызывающий блок (результаты работы подпрограммы).
Одна и та же подпрограмма может вызываться неоднократно, выполняя одни и те же действия с разными наборами входных данных. Параметры, использующиеся при записи текста подпрограммы в разделе описаний, называют формальными, а те, что используются при ее вызове — фактическими.
Описание и вызов процедур и функций
Структура описания процедур и функций до некоторой степени похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, перменных. Исполняемая часть содержит собственно операторы процедур.
Формат описания процедуры имеет вид:
Формат описания функции:
Формальные параметры в заголовке процедур и функций записываются в виде:
и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать (об этом далее). Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.Список формальных параметров может отсутствовать.
Вызов процедуры производится оператором, имеющим следующий формат:
Список фактических параметров — это их перечисление через запятую. При вызове фактические параметры как бы подставляются вместо формальных, стоящих на тех же местах в заголовке. Таким образом происходит передача входных параметров, затем выполняются операторы исполняемой части процедуры, после чего происходит возврат в вызывающий блок. Передача выходных параметров происходит непосредственно во время работы исполняемой части.
Вызов функции в Турбо Паскаль может производиться аналогичным способом, кроме того имеется возможность осуществить вызов внутри какого-либо выражения. В частности имя функции может стоять в правой части оператора присваивания, в разделе условий оператора if и т.д.
Для передачи в вызывающий блок выходного значения функции в исполняемой части функции перед возвратом в вызывающий блок необходимо поместить следующую команду:
При вызове процедур и функций необходимо соблюдать следущие правила:
- количество фактических параметров должно совпадать с количеством формальных;
- соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.
Заметим, что имена формальных и фактических параметров могут совпадать. Это не приводит к проблемам, так как соответствующие им переменные все равно будут различны из-за того, что хранятся в разных областях памяти. Кроме того, все формальные параметры являются временными переменными — они создаются в момент вызова подпрограммы и уничтожаются в момент выхода из нее.
Рассмотрим использование процедуры на примере программы поиска максимума из двух целых чисел.
Аналогичную задачу, но уже с использованием функций, можно решить так:
Волгоградский государственный педагогический университет
Кафедра алгебры, геометрии и информатики
Урок 13. Процедуры и функции в Pascal. Часть 2
Итак, сегодня мы с вами на learnpascal.ru продолжаем изучать функции и процедуры — важнейшую часть структурного программирования. В этом уроке мы рассмотрим только процедуры и функции. И даже не будем практиковаться, оставим это для последующих уроков.
Структура программы.
Программы на языке Паскаль состоят из заголовка программы, раздела описаний и тела программы. Раздел описаний может включать следующие подразделы: меток, констант, типов, переменных, процедур и функций. Последовательность подразделов в структуре программы произвольная, но естественно, что если вводится переменная нового типа, заданного в Туре, то подраздел Туре предшествует подразделу Var. Принцип нашего языка программирования «то, что используется, должно быть описано» сохраняется и для раздела описаний.
Структура процедуры и функции
Структура процедуры.
До этого момента времени мы использовали из раздела описаний только описание переменных и типов. На этом занятии мы начнем изучать процедуры. Структура процедуры повторяет структуру программы. Отличия выделены «полужирным» шрифтом.
Напишу простую программу с процедурой, складывающей два числа.
Итак, что вы видите? Точнее, что вам не понятно в данной программе? Я думаю, что вы не можете понять, почему перед z стоит var, а перед x, y — нет. Но всему свое время.
Обратимся к примеру, приведенному на рисунке выше. Слева приведен фрагмент текста основной программы, справа — процедура. Как только в теле программы объявляется имя процедуры с параметрами, выполнение «главного» тела прекращается, и управление вычислительными процессами передается процедуре. После выполнения процедуры осуществляется возврат на оператор основной программы, следующий за вызовом процедуры.
Немножко теории:
В любой программе все переменные делятся на два типа: локальные и глобальные. В нашей программы переменные а, b, с — глобальные, а х, у, z — локальные. Глобальные переменные — это переменные из раздела описаний основной части программы, а локальные — из раздела описаний процедур и функций. Локальные переменные существуют только в течение времени работы процедуры, определяются (создаются) при её вызове и исчезают после завершении работы процедуры.
В программе определены переменные a, b, c. В процедуре x, y, z — её параметры, и они являются переменными процедуры. Причем между х, у и z существует большая разница.
Поясню ее очередным рисунком.
Параметры.
При описании процедуры указывается список формальных параметров. Каждый параметр является локальным по отношению к описываемой процедуре, к нему можно обращаться только в пределах данной процедуры (в нашем примере х, у, z — формальные параметры). Фактические параметры — это параметры, которые передаются процедуре при обращении к ней (а, b, с — фактические параметры). Число и тип формальных и фактических параметров должны совпадать с точностью до их следования.
Параметры-значения.
Другими словами, передача параметров по значению. Копия фактического параметра становится значением соответствующего формального параметра. Внутри процедуры можно производить любые действия с данным формальным параметром (допустимые для его типа), но эти изменения никак не отражаются на значении фактического параметра, то есть каким он был до вызова процедуры, то таким же и останется после завершения ее работы (х, у — параметры-значения).
Параметры-переменные.
Другими словами, передача параметров по ссылке. Это те формальные параметры, перед которыми стоит идентификатор var. Передается адрес фактического параметра (обязательно переменной), после этого формальный
параметр становится его синонимом. Любые операции с формальным параметром выполняются непосредственно над фактическим параметром.
Структура функции
Функция выглядит почти так же, как и процедура. Почти единственное отличие в том, что заголовок функции начинается с ключевого слова Function и кончается типом возвращаемого данной функцией значения.
Кроме того, в теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции или переменная result, а в правой — ее значение.
Небольшое послесловие:
Каждая процедура должна иметь одну точку входа и одну точку выхода (то есть использование goto, break, exit нежелательно), использование глобальных переменных в процедуре следует свести к минимуму, взаимодействие с процедурой должно осуществляться (по возможности) только через параметры.
Постепенно вы должны отказаться от технологии неструктурированного программирования. Сегодня мы с вами осваиваем структурную технологию разработки программ, при этом на каждом этапе текущая задача разбивается на ряд подзадач, определяя тем самым некоторое количество отдельных подпрограмм. Концепция процедур и функций — один из механизмов второго витка развития технологий программирования, а именно, структурного проектирования.
Язык программирования TurboPascal
Turbo Pascal. Процедуры и функции
Процедуры и функции являются важным инструментом большинства языков программирования. С их помощью можно часто встречающиеся фрагменты программы, одинаковые по выполняемым действиям, но различающиеся только значениями исходных данных, скомпоновать в группу операторов. Для эффективного программирования подобных повторений фрагментов в языках программирования введено понятие подпрограммы.
Подпрограмма – это группа операторов, оформленная как самостоятельная программная единица.
Подпрограмма записывается однократно в определенной части программы, а затем в нужных местах программы обеспечивается обращение к ней. При обращении к подпрограмме ей передаются исходные данные, а после выполнения операторов подпрограммы в основную программу передаются результаты расчетов.
Использование процедур и функций позволяет: сократить объем программы, улучшить структуру программы с точки зрения ее читаемости, уменьшить вероятность ошибок и облегчает процесс создания и отладки программы.
В языке Турбо Паскаль подпрограммы реализуются в виде процедур и функций
Процедуры
Для использования процедуры в программе необходимы:
- описание процедуры;
- вызов процедуры.
Описание процедуры содержит информацию для компилятора об объектах, используемых в процедуре, а также алгоритм решения задачи процедурой.
Вызов процедуры приводит к выполнению операторов, составляющих тело процедуры.
Описание процедуры
Процедура в Турбо Паскале имеет структуру, подобную структуре программы.
Структура описания процедуры имеет следующий вид:
объявление меток; | |||
Const | объявление констант; | ||
Type | объявление типов; | ||
Var | объявление переменных; | ||
procedure | описание процедур и функций, входящих в данную процедуру (внутренние процедуры и функции); |
||
function | |||
Begin | |||
Тело процедуры | операторы процедуры; | ||
End; | точка с запятой «;» ставится всегда |
Таким образом, процедура состоит из:
- заголовка;
- раздела описаний;
- раздела операторов.
Заголовок процедуры в отличие от заголовка программы не может быть опущен.
Формат заголовка
где Procedure – зарезервированное слово;
имя – имя процедуры, определяемое в соответствии с общими правилами построения идентификаторов;
– перечень идентификаторов для обозначения исходных данных и результатов работы процедуры с указанием их типа.
Параметры в списке заголовка процедуры отделяются друг от друга точкой с запятой «;». Если параметры являются однотипными, их можно объединить и записать через запятую. Например:
Здесь SUMMA имя процедуры, a,b,i,n формальные параметры процедуры.
Раздел описаний процедуры содержит объявление меток, констант, типов переменных и внутренних процедур и функций, используемых в разделе операторов процедуры.
Раздел операторов ограничен операторными скобками BEGIN и END . При описании процедуры после END всегда ставится точка с запятой «;».
Вызов процедуры
Если процедура объявлена, то в программе ее можно использовать многократно, просто задавая ее имя и, если необходимо, список аргументов, т.е. вызов происходит с помощью оператора вызова:
где – имя процедуры, к которой происходит обращение;
– перечень конкретных значений (выражений) и имен, подставляемых на место формальных параметров процедуры при ее выполнении.
При описании подпрограмм и вызова их используются понятия формальных и фактических параметров.
Параметры, указываемые в заголовке процедуры при ее описании, называются формальными параметрами. Параметры, указываемые при вызове процедуры, называются фактическими параметрами.
Формальные параметры – это параметры, определяющие тип и место подстановки реальных объектов при вызове процедуры.
При вызове процедуры формальные параметры, указанные в ее заголовке, заменяются на фактические параметры в порядке их следования. Число и тип формальных и фактических параметров должен обязательно совпадать.
ЗАДАЧА 1. Ввести с клавиатуры 15 вещественных чисел в массив и найти сумму этих чисел с помощью процедуры.
ЗАДАЧА 2. Найти наибольший элемент массива и определить его номер. Количество элементов массива и их значения ввести с клавиатуры. Оформить ввод данных, поиск наибольшего элемент массива и определение его номера с помощью процедур.
Функции
Подпрограмма-функция предназначена для вычисления одного параметра. У функции два основных отличия от процедуры:
Первое отличие в заголовке. Он состоит из слова Function , за которым следует имя функции, затем в круглых скобках список формальных параметров, затем через двоеточие записывается тип функции, т.е. тип возвращаемого параметра. Функция может возвращать типы вещественные, порядковые и строковые.
Второе отличие в том, что процедура может иметь несколько выходных параметров-результатов, а функция только одно значение, передаваемое через ее имя. Именно этим объясняется то, что в теле функции хотя бы один раз имени функции должно присваиваться вычисленное значение.
Структура функции такая же, как и структура процедуры.
Заголовок функции имеет вид:
Function – служебное слово;
– имя функции, определяемое в соответствии с общими правилами построения идентификаторов;
– перечень имен для обозначения исходных данных и результатов работы процедуры с указанием их типов.
Для вызова функции из основной программы или другой подпрограммы следует в выражении, где необходимо использовать значение функции, указать имя функции со списком фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами функции.
ЗАДАЧА 3. Ввести с клавиатуры 15 вещественных чисел в массив и найти сумму этих чисел с помощью функции.
Pascal. Процедуры и функции
Процедуры и функции в языке Pascal являются подпрограммами. Подпрограмма – это именованная часть программы, представляющая собой некоторое собрание операторов, структурированных аналогично основной программе. Подпрограммы не необходимы, но их наличие заметно облегчает работу программиста и увеличивает «ценность» кода.
Описываются подпрограммы между разделом описания переменных и началом тела основной программы. Так выглядит структура всей программы в Pascal:
Как уже было сказано ранее, подпрограммы в Pascal представлены в лице функций и процедур, которые могут быть встроенными и пользовательскими. Первые, как правило, изначально присутствуют в системе, а вторые создаются программистом. Нас интересуют в первую очередь пользовательские подпрограммы, работа со встроенными вызывает меньше хлопот.
После описания, подпрограммой можно пользоваться посредством ее имени. При этом управление из места вызова передается соответствующей подпрограмме.
Для передачи данных, после объявления имени подпрограммы, в круглых скобках необходимо указать параметры, которые в свою очередь можно разделить на передаваемые и возвращаемые. Передаваемые параметры – это переменные, которые подпрограмма получает из главной части программы, а возвращаемые – отдает (возвращает) ей.
Также различают формальные и фактические параметры. Те, что используются при вызове процедуры или функции называются фактическими, а формальные описываются в заголовке подпрограммы, и принимают значения фактических параметров. Формальные параметры должны совпадать типом и количеством с фактическими.
Чтобы стало понятно, где находятся те или иные части подпрограмм, рассмотрим общую форму записи процедур и функций:
Процедура:
Вызов процедуры:
( );
Функция:
В Pascal, также как и во многих других языках программирования, переменные по отношению к программе делятся на локальные и глобальные. Те, которые объявляются в основной части, называются глобальными, а в процедуре или функции – локальными. Локальные переменные в отличие от глобальных могут использоваться лишь внутри подпрограммы, к которой они принадлежат.
Теперь более детально рассмотрим в отдельности каждый вид подпрограмм.
Пользовательские процедуры
Процедура – это независимая совокупность операторов, выполняющих заданную последовательность действий, и определенных отдельно от основной части программы. Она начинается со служебного слова Procedure, после которого идет имя и заголовок процедуры. Остальная часть аналогична основной программе.
Напишем пример программы, показывающей принцип работы простой процедуры.
Программа выводит сумму целых чисел заданного диапазона. Имя процедуры прописано после служебного слова, определяющего, что создана именно процедура. Далее идет заголовок, где первые две переменные – это формальные параметры, в которые передается значение от фактических k и n. Переменная rez возвращает результат и называется параметром-переменной (определяются после слова Var), а k и n – параметрами-значений. Локальная переменная – i, она описана сразу после заголовка процедуры. Вызывая, в основной части программы процедуру sum, в качестве передаваемых параметров мы указали три целочисленных переменных. Заметьте, что их количество соответствует числу формальных параметров. Порядок также важен, т. е. в переменную pk передается значение переменной k, в pn значение n и т. д.
В вышеизложенном примере было бы вполне уместным не использовать параметр-переменную rez, а определить ее локально. В этом состоит различие между процедурами и функциями в Pascal.
Пользовательские функции
В отличие от процедур, функции могут быть задействованы в основной программе, лишь в каком либо выражении. Также для обращения к функции необходимо знать тип данных результата, возвращаемого ей.
Описание функций начинается со служебного слова function, вслед за которым идет ее заголовок, а дальше те же блоки, что и у процедуры.
В вызываемую часть результат работы функции должен быть возвращен посредством имени последней. Это предусматривает хотя бы одно присвоение ей значения.
Допустим необходимо вычислить наибольший общий делитель двух целых чисел. Результатом решения данной задачи будет одно число, поэтому мы воспользуемся именно функцией.
В конце описания функции, ее имени присваивается значение, которое впоследствии примет переменная nod. Как видите, в функцию из основной части передаются только два фактических параметра (m и n), что соответствует количеству формальных параметров. И если в заголовке процедуры после слова Var можно указать переменные, также относящиеся к числу формальных параметров, то в функции эта обязанность лежит на ее имени, принимающем после своей работы какое-то значение.