Подпрограмма – это обособленная именованная часть программы, в которой решается определенная подзадача.
Использование подпрограмм дает возможность:
- избежать многократного повторяемого в тексте программы кода;
- упростить структуру программу;
- облегчает отладку программы;
- делает более эффективным процесс модификации программы.
В языке программирования Паскаль подпрограммы делятся на процедуры и функции, в свою очередь подразделяющиеся на две группы: стандартные и определенные пользователем. Стандартные процедуры и функции без предварительного описания могут быть вызваны по их именам (например, процедуры ввода данных writeln , удаления элементов из множества Exclude , функция определения длины строки Length и др.). Пользовательские подпрограммы, самостоятельно разработанные и описанные программистом, также вызываются по имени, однако они должны быть предварительно описаны.
Рассмотрим использование процедур и функций пользователя в программах.
Урок 22. Процедуры на Паскале
Процедуры пользователя в Паскаль
Процедура в Паскаль выполняет некоторую завершенную последовательность действий и, в отличии от функции, не возвращает в основную программу результатов своей работы.
Процедура состоит из заголовка, началом которого является ключевое слово procedure , и, аналогичного по своей структуре обычной программе, тела процедуры. Рассмотрим формат описания пользовательской процедуры:
- procedure имя(список формальных параметров);
- раздел описаний
- begin
- операторы
- end;
В заголовке, после ключевого слова procedure , следует уникальное, в пределах программы, имя процедуры, затем располагается список формальных параметров не являющийся обязательным. Для каждого элемента списка указывается тип данных, например:
- procedure AddSquare (a: integer; b: real);
- begin
- writeln(a * a + b * b);
- end;
Для вызова процедуры из основной программы используется оператор вызова процедуры, который имеет следующий вид:
имя процедуры (список фактических параметров)
Фактические параметры подставляется вместо соответствующих формальных параметров, поэтому количество элементов в том и другом списках должно совпадать. Соответствие устанавливается на основе положения параметров в списках. Например, вызов процедуры AddSquare из примера выше может выглядеть следующим образом:
- begin
- var a: integer := 10;
- var b: real := 2.5;
- AddSquare (a, b);
- end.
Список фактических параметров может отсутствовать, если в процедуру не передаются какие-нибудь значения. В этом случае формат записи оператора вызова следующий:
Источник: informatics-lesson.ru
Процедуры в Паскаль.
При написании достаточно сложной программы можно разделить эту программу на несколько простых блоков. Т. е. можно какую-то группу операторов, к которой часто обращается программист, заключить в отдельный блок. Для этого служат процедуры. Процедура является как-бы небольшой программой в Pascal.
Процедуры | Информатика Паскаль #21 | Инфоурок
Она также имеет заголовок, раздел описаний (переменных, констант, типов, других процедур и функций и т.д.), и исполняемую часть, которая находится внутри составного оператора Begin..End. После того как процедура выполнится, она должна вернуть управление программе, вызвавшей ее. В программе процедура записывается после раздела описания переменных Var.
Рассмотрим использование процедуры на примере простой программы. Мы будем вводить с клавиатуры 2 числа, а на экране будет выводиться сообщение о том больше или меньше первое число второго.
Процедуры в Паскаль.
Program procedura1; uses crt; var a, b: integer; procedure poisk; begin if a>b then writeln (‘Первое число больше второго’) else if a
В строке №5-№13 находится тело (исполняемая часть) процедуры. Она начинается, как и основная программа, со слова begin, а заканчивается словом end. После слова end ставится точка с запятой, т.к. программа не заканчивается после описания процедуры.
Строка №6. Если «a» больше «b», то на экран выводится сообщение в строке №7.
Строка №8. В противном случае (т.е. если «a» меньше либо равно «b»), то проверяется условие в строке №9. И если «a» меньше «b», то на экран выводится сообщение в строке №10.
Строка №11. В противном случае (т.е. если «a» равно «b»), то на экран выводится сообщение в строке №12.
В строке №14 начало основной программы.
В строке №16 выводится сообщение.
В строке №17 вводим числа с клавиатуры.
В строке №18 записываем название нашей процедуры «poisk». Т.е. с этого момента основная программа перестает работать и начинает работать процедура, которую мы записали в строках №4-№13. Она сравнивает числа, которые мы ввели с клавиатуры и в зависимости от результата, выводит на экран то или иное сообщение. После того как процедура будет выполнена она передаст управление основной программе.
Вводим два числа и нажимаем Enter.
Источник: mojainformatika.ru
2.2. Процедуры в Паскале
Как всегда при изучении подпрограмм, рассмотрим два вопроса: описание процедур и обращение к ним.
2.2.1.Описание процедур
Описание процедуры состоит из заголовка и блока (тела) процедуры:
procedureИмяПроцедуры[(CписокФормальныхПараметров)]
Здесь и далее в выделенные квадратные скобки заключены необязательные элементы операторов.
В качестве имени процедуры используется идентификатор (разумеется, не совпадающий с другими идентификаторами, используемыми в данном программном блоке).
Как уже говорилось в §2.1, формальные параметры — это параметры, которые используются при описании процедуры и при обращении к процедуре должны быть заменены на фактические параметры, описанные в вызывающей программе (или вызывающем блоке). В Паскале формальным параметром может быть имя переменной или процедуры; пока не будем рассматривать формальные параметры-процедуры. В список формальных параметров включаются переменные, которые должны быть переданы из вызывающего блока в процедуру и из процедуры в вызывающий блок (т.е. «вход» и «выход» процедуры).
Изучим структуру списка формальных параметров. Список формальных параметров — это секции формальных параметров, перечисленные через символы «;»:
Секция1; Секция2;. ;СекцияN
Секция формальных параметров имеет вид:
[VAR] CписокПеременных:Тип;
Указывается стандартный тип или имя нестандартного типа (можно использовать только имя типа, но не его описание!). Имя типа должно быть объявлено во внешнем блоке. В дальнейшем мы увидим, что запрет использования описания типа формального параметра влечет за собой весьма существенные ограничения (см. §2.2.2).
Если перед списком параметров стоит ключевое слово VAR, то эти параметры заменяются на фактические «по ссылке» (в терминах Паскаля такие параметры называютсяпараметрами-переменными).
Если перед списком не стоит VAR, то замена на фактические происходит «по значению» (это параметры-значения).
После заголовка процедуры записывается блок процедуры со всеми разделами, что и в программе; в них описываются внутренние для данной процедуры имена (метки, константы, переменные, процедуры, функции). При выходе из процедуры эти имена перестают существовать.
2.2.2. Обращение к процедуре
Обращение к процедуре осуществляется в разделе действий программы или подпрограммы с помощью оператора процедуры, имеющего вид:
ИмяПроцедуры[(CписокФактическихПараметров)]
Фактические параметры описываются в вызывающем блоке и должны соответствовать формальным по числу, порядку перечисления и типу. Заметим, что требование полногосовпадения типов формальных и фактических параметров влечет за собой, в частности, совпадение размеров параметров-массивов.
Пример.Даны две матрицы:аиз 3-х строк и 5 столбцов иbиз 7 строк и 3 столбцов. Вычислить минимальные значения элементов для каждой строки каждой из этих матриц.
Естественно, вычисление минимальных значений строк произвольной матрицы следует оформить как подпрограмму (назовем ее minstr), а затем применить ее два раза к конкретным (фактическим) матрицамаи b. Алгоритм ввода одинаков для матрицаиb, поэтому ввод также оформим как подпрограмму (назовем ееmatrin). Вывод массива результатов будет осуществлять подпрограммаmasout.
Таблица 9. Состав данных программы
двумерный массив размером 7*5
минимальные значения элементов строк матрицы a(b)
одномерный массив из 7 элементов
Обратите внимание на размеры массивов в таблице 9. Типы фактических и формальных параметров подпрограмм должны совпадать, поэтому размеры формальных массивов должны подходить и для матрицы а, и для матрицыb. Чтобы удовлетворить этому требованию, используем максимальные размеры, подходящие и дляа, и дляb, т. е. память под массивы отводится с избытком. Тип массивов-параметров процедур (и функций) должен быть объявлен в разделеTypeпрограммы (в нашем примере этоmatr для матриц и masдля одномерных массивов – см. текст программы).
Заметим, что в программе не будет промежуточных переменных. Программа будет состоять из вызовов подпрограмм (крупных операторов), а промежуточные переменные (с точки зрения пользователя детали, мелочи) будут «спрятаны» в подпрограммы.
Поясним, как составлен заголовок подпрограммы minstr.Подпрограмма имеет столько результатов, сколько строк у матрицы, все они равноправны, поэтому нет причины передавать один из них через имя функции, и, следовательно,minstrдолжна быть процедурой (не функцией).
В список формальных параметров включаются «входные» данные для процедуры: матрицаа и ее размеры (n- число строк,m- число столбцов), и «выходные» данные:min — массив минимальных значений строк. Заметим, что обозначения, принятые в одной подпрограмме (a, n, m, min)никоим образом не связаны с обозначениями в других подпрограммах и программе, т. е. подпрограммы разрабатываются автономно друг от друга. Переменнаяmin- результат работы функции, поэтому ее надо объявить как параметр-переменную (перед описанием поставить ключевое словоVar). Так как фактическими значениямиnиmбудут константы (для фактической матрицыa, например, 3 и 5),n иmдолжны быть параметрами-значениями (перед их описаниемVarне следует ставить).aлучше объявить как параметр-переменную(так как это массив) с целью экономии памяти.
procedure minstr(Var a:matr; n,m:integer; Var min:mas).
Промежуточные переменные процедуры (счетчики строк и столбцов iиj) должны быть описаны в разделе переменных блока процедуры.
Рассмотрим заголовок процедуры ввода матрицы matrin(предлагается читателю пояснить самостоятельно, почему это процедура, а не функция). На входеmatrin– размеры матрицыnиmи имя матрицы, которое будет выводиться в приглашении к вводу символьная переменнаяс; эти данные должны быть параметрами-значениями (объясните, почему). На выходе процедуры – введенная матрица, для разнообразия обозначим еер; этообязательнопараметр-переменная. Получили заголовок:
procedure matrin(n,m:integer; c: char;Var p:matr).
Обратите внимание, что отсутствие ключевого слова Varперед описаниемaв этом заголовке приведет к неработоспособности программы, в то время как в заголовке процедурыminstrотсутствиеVar, вообще говоря, допустимо (объясните, почему).
Дальнейшие комментарии к программе приведены в ее тексте.
Блок-схема программы приведена на рис. 13, блоки вызова подпрограмм имеют двойные линии по боковым сторонам. Блок-схема процедуры minmatr приведена на рис. 14.
program primer2_2;
Type matr=array[1..7,1..5] of real; mas= array[1..7] of real;
Var a,b:matr; mina,minb:mas;
Procedure minstr(Var a:matr; n,m:integer; Var min:mas);
Источник: studfile.net