Процедуры.
При разработке программ нередко возникают ситуации, когда для того, чтобы решить какую либо сложную задачу, ее предварительно разбивают на несколько более простых. Такие относительно самостоятельные части программы называются в языке Паскаль процедурами (в других языках программирования для обозначения таких частей употребляется также термин подпрограммы).
Процедуры по своему внешнему виду напоминают функции, но если при обращении к функции мы можем получить только один результат – значение данной функции, то процедура может вырабатывать на выходе несколько значений. Кроме того, процедуры используются в программах для выполнения ряда стандартных действий. Такие процедуры, подобно стандартным функциям, являются частью языка Паскаль. К таким стандартным процедурам относятся уже известные нам команды ClrScr, TextColor и TextBackground. Наряду с этими стандартными процедурами в языке Паскаль широко используются также следующие:
Delay(i)
осуществляет задержку выполнения программы на i миллисекунд
(тысячных долей секунды)
GotoXY(a,b)
переводит курсор в точку экрана с координатами a,b
Halt
завершает выполнение программы и передает управление операционной системе
В качестве примера использования стандартных процедур Паскаля приведем программу «обратный отсчет» (см. рис. 27). Эта программа создает на экране компьютера «электронное табло», на котором в одном и том же месте последовательно выводятся числа от 10 до 1, то есть производится обратный отсчет времени, как перед стартом космического корабля, а затем выводится слово «Старт».
В данной программе цифры выводятся с помощью цикла с уменьшающимся значением счетчика (см. раздел «Оператор For»). В теле цикла используется ряд стандартных процедур. Так, перед выводом очередного числа, курсор посредством стандартной процедуры GotoXY каждый раз перемещается в левый верхний угол экрана для того, чтобы все числа выводились в одной и той же позиции. Далее, для того, чтобы очередное число сразу не исчезало с экрана, а оставалось на некоторое время, используется процедура Delay. Затем экран очищается с помощью процедуры ClrScr, для того, чтобы освободить место для вывода следующего числа. После завершения работы цикла с помощью тех же стандартных процедур на экран выводится слово «Старт».
Конечно, возможности языка Паскаль не ограничиваются использованием только стандартных процедур. Программист, использующий этот язык может создавать и свои собственные процедуры. Но для того, чтобы такую процедуру можно было использовать в программе, ее подобно вновь создаваемым функциям, следует предварительно описать. Описание процедуры, так же как и описание функции, должно содержаться в программе в разделе описаний после описания констант и переменных. Структура описания функции сходна со структурой основной программы. Описание включает в себя заголовок процедуры, раздел описаний и раздел операторов. К
![]() |
Рис. 27. Программа «обратный отсчет» (исходный текст и программа в действии)
процедуре можно обращаться из основной части программы, из другой процедуры или из функции. Такое обращение называют также вызовом процедуры.
Общий вид описания процедуры следующий:
заголовок процедуры; раздел описаний процедуры; begin
раздел операторов процедуры
end;
Теперь разберем более подробно составные части данного описания. Общий вид заголовка процедуры следующий:
procedure имя_процедуры (параметры процедуры);
где procedure – служебное слово, имя процедуры дается по тем же правилам, что и имена переменных в Паскале, параметры перечисляются в скобках через запятую с указанием их типа. Эти параметры являются формальными. При вызове же процедуры в обращении к ней указываются ее фактические параметры. Тип каждого фактического параметра должен быть таким же, как тип соответствующего ему формального параметра. Количество формальных параметров, имеющихся в описании процедуры, и фактических параметров, используемых при обращении к ней, должно совпадать. При этом первому по счету формальному параметру в описании ставится в соответствие первый по счету фактический параметр в обращении, второму формальному – второй фактический и так далее.
Все формальные параметры делятся на два вида. Если перед именем параметра в заголовке процедуры стоит служебное слово var, то это – параметр-переменная. Если служебное слово var перед именем переменной в заголовке отсутствует, то данный параметр является параметром-значением. При обращении к процедуре формальному параметру-значению присваивается значение соответствующего ему фактического параметра, причем в качестве такого значения может выступать константа, переменная или выражение. При обращении же к процедуре, в которой имеются формальные параметры- переменные, соответствующие им фактические параметры могут быть только
переменными (не константами и не выражениями). Вызываемая процедура получает доступ к ячейкам памяти, в которых хранятся эти фактические параметры, и может изменять значения этих параметров в ходе своей работы.
Пример заголовка процедуры:
procedure vspomog(a,b:integer; var c,d:real);
где vspomog – имя процедуры, a,b,c,d – имена формальных параметров, причем a и b являются параметрами-значениями, а c и d – параметрами- переменными.
В разделе описаний процедуры константы и переменные описываются по тем же правилам, что и в основной программе. При этом следует иметь в виду, что эти переменные могут использоваться только внутри данной процедуры. Такие переменные называются локальными. В процедуре могут применяться и переменные, которые описаны в основной части программы. Такие переменные называются глобальными.
Раздел операторов процедуры принципиально не отличается от такого же раздела в основной программе, он может содержать обращения к другим функциям и процедурам, но после служебного слова end ставится не точка, а точка с запятой, так как конец описания функции – это не конец программы.
Рассмотрим программу определения максимального и минимального числа в группе из 4 чисел (см. рис. 28). Исходные значения введем с клавиатуры. Для определения максимального и минимального из них воспользуемся следующим алгоритмом. Напишем несложную процедуру minmax, которая определяет максимальное и минимальное из двух чисел. Затем разобьем введенные числа на пары и в каждой паре с помощью этой процедуры определим максимум и минимум. Далее с помощью той же процедуры minmax определим наибольший из двух максимумов и наименьший из двух минимумов. Это и будет искомый результат.
В заголовке процедуры minmax описаны 2 формальных параметра- значения x1 и x2, которые используются для ввода в процедуру исходных данных и 2 параметра-переменные min и max, используемые для вывода полученных результатов. Внутри процедуры параметры-значения сравниваются между собой и значение меньшего из них присваивается переменной min, а большего - переменной max.
![]() |
Рис 28. Программа определения минимального и максимального из
4 чисел и результаты ее работы.
В основной части программы обращение к процедуре minmax встречается 4 раза. В первых двух случаях в качестве фактических параметров выступают введенные с клавиатуры значения переменных a и b при первом вызове процедуры и c и d при втором. Результатами являются соответственно фактические параметры min1 и max1 (минимум и максимум в первой паре чисел) и min2 и max2 (минимум и максимум во второй паре).
При третьем обращении к процедуре в качестве исходных данных используются 2 найденных минимума, а результатом ее работы является минимальное из этих 2 значений, передаваемое в переменную lit. Вспомогательная переменная l в принципе для решения данной задачи не нужна, но вводится, так как число фактических параметров в обращении должно соответстововать числу формальных параметров в описании. Аналогично при четвертом обращении к процедуре находится наибольший из двух максимумов big, а переменная m играет подобно переменной l только вспомогательную роль.
Искомые максимальное и минимальное значения выводятся на экран с помощью оператора writeln.
На рис. 28 приводятся результаты работы данной программы при a
равном 65, b – 111, c – 678 и d – 215.
Выше уже говорилось о том, что в процедуру могут передаваться не только значения переменных, но и числовые константы. Приведем пример программы где реализована как раз такая возможность. Это – программа, которая по введенному пользователем текущему числу и номеру месяца определяет дату следующего дня (см. рис. 29). Данная задача не представляет сложности (нужно только прибавить единицу к текущему числу), но лишь для всех чисел месяца кроме последнего. В этом случае следующий день будет первым числом следующего месяца, а если последний день месяца – 31 декабря, то следующим днем будет первый день нового года. Необходимо также предусмотреть защиту от неверного ввода данных (чтобы пользователь случайно не ввел число, большее, чем количество дней в текущем месяце). Поэтому для упрощения решения данной задачи решим ее сперва в общем виде. Данное решение будет содержаться в созданной программистом процедуре next.
В заголовке процедуры next описываются один параметр-значение kol и два параметра-переменные – mes и n. При обращении к процедуре next параметру kol присваивается значение, равное количеству дней в текущем месяце. Так как это значение зависит от номера текущего месяца m, то оно определяется с помощью условного оператора case, в котором в роли
![]() |
![]() |
Рис 29. Программа, определяющая дату завтрашнего дня и результаты ее работы (для обычного дня в середине месяца и для 31 декабря)
переменной-селектора как раз и выступает m. Для m, равного 1,3,5,7,8,10,12 то есть для января, марта, мая, июля, августа, октября, декабря данное значение равно 31. Для m равного 4,6,9,11, то есть для апреля, июня, сентября, ноября m будет равно 30.
Сложнее решается вопрос с февралем (m=2), так как в этом случае значение, присваиваемое параметру kol, зависит от того, является ли текущий год високосным или нет. В первом случае kol будет равно 29, во втором – 28. Необходимую информацию программа запрашивает у пользователя, который на вопрос о том, является ли текущий год високосным, должен дать положительный или отрицательный ответ. Для защиты от ошибочного ответа используется сокращенный условный оператор if. Если пользователь вместо
«ДА» или «НЕТ» введет что-либо другое, программа выдаст сообщение об ошибке и прекратит работу по команде Halt. Для того, чтобы пользователь успел прочитать сообщение об ошибке, после его вывода работа программы приостанавливается на некоторое время процедурой Delay.
Параметрам mes и n ставятся в соответствие фактические параметры – переменные m и d, в которых содержится порядковый номер текущего месяца и текущее число.
В начале работы данной процедуры с помощью сокращенного условного оператора if проверяется правильность введенных данных (то есть не больше ли переданное в процедуру текущее число n, чем количество дней в текущем месяце). Если при вводе была допущена ошибка, то процедура выводит сообщение об этом и прекращает работу программы используя стандартную процедуру Halt.
Следующий условный оператор проверяет, не является ли введенное число 31 декабря. В этом случае параметрам mes и n присваиваются значения 1 и 1 (так как следующее число будет 1 января) и затем работа процедуры next завершается командой exit, после чего происходит возвращение в основную программу.
С помощью последнего в данной процедуре оператора if определяется следующее число для всех остальных дней года. Если число не является последним в данном месяце (n<kol) , то значение параметра n увеличивается на единицу, а mes остается без изменений. В противном случае n присваивается значение 1 (следующее число – начало нового месяца) , а значение параметра mes увеличивается на единицу. На этом работа процедуры завершается, соответствующие формальным параметрам mes и n фактические параметры m и d получают новые значения, которые передаются в основную программу.
Затем на экран компьютера выводятся эти новые значения (завтрашнее число и соответствующий ему номер месяца) и на этом программа завершает свою работу.
На рис. 29 приводятся результаты работы данной программы для различных исходных данных (для обычного дня в середине месяца и для 31 декабря).
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.