Файл: Основы программирования на языке Pascal (Использование процедур в языке Pascal).pdf
Добавлен: 28.06.2023
Просмотров: 74
Скачиваний: 2
ВВЕДЕНИЕ
Если в программе имеется несколько одинаковых (или очень похожих) фрагментов, то возникает естественный вопрос: нельзя ли оформить повторяющийся фрагмент в виде отдельного блока, а затем обращаться к нему в программе столько раз, сколько требуется. Аналогичная идея возникает и при отладке больших программ — если разделить программу на отдельные самостоятельные фрагменты, то отладить ее по частям будет проще. Эти разумные мысли имеют поддержку во всех языках высокого уровня, которые предоставляют программисту такое удобное средство разбиения программы на части, как подпрограммы.
Подпрограммой называется программная единица (часть программы), имеющая имя, по которому она может быть вызвана из других частей программы.
Подпрограммы бывают двух видов: процедуры и функции, которые, в свою очередь, делятся на стандартные и определенные пользователем. Стандартные процедуры и функции являются частью языка и вызываются без предварительного описания. Описание процедур и функций пользователя выполняется в разделе описания процедур и функций.
Само название подпрограмма говорит о том, что это часть программы, которая оформляется как самостоятельная программная единица. Подпрограмма обязательно должна иметь уникальное имя (идентификатор), это имя и употребляется для вызова подпрограммы. Понятно, что такой вызов можно выполнять многократно, более того, одни и те же подпрограммы можно использовать в разных программах, отладив их код только один раз.
Многие подпрограммы невелики по размерам и содержат десятки строк текста. Написать такие программы можно и без подпрограмм. Иное дело — создание проектов, насчитывающих тысячи и десятки тысяч строк, в которых задействованы целые команды программистов. Писать такие программы как единое целое, без разделения на самостоятельные фрагменты, просто невозможно. В курсовой работе рассмотрим варианты реализации подпрограмм средствами языка Pascal.
1 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
1.1 Общие сведения о реализации подпрограмм
В программах на Pascal используются подпрограммы двух видов: процедуры и функции. Имея один и тот же смысл и аналогичную структуру, они несколько различаются назначением и способом их использования.
Все процедуры и функции, в свою очередь, подразделяются на две группы:
- стандартные (встроенные);
- определенные пользователем.
Встроенные (стандартные) процедуры и функции входят в стандартные библиотеки и могут вызываться по имени без предварительного описания (например, процедуры ввода и вывода read и write). Наличие стандартных процедур существенно облегчает разработку программ, и этот инструмент широко используется при программировании на языке высокого уровня.
Однако многие специфичные для программы действия не находят прямых аналогов в библиотеках Pascal, и тогда программисту приходится разрабатывать свои собственные процедуры и функции.
Процедуры и функции пользователя разрабатываются самим программистом и помещаются в раздел описаний процедур и функций. Их вызов для выполнения записывается в разделе операторов основной программы или другой подпрограммы.
Данный раздел используется в программах, которые с целью удобства программирования были разбиты на более мелкие части — подпрограммы.
В общем случае подпрограмма имеет ту же структуру, что и программа.
Объявление процедуры:
procedure ИмяПроцедуры (ФормальныеПараметры) ;
{ описательная часть процедуры }
Begin
{ Инструкции исполнительной части процедуры }
end;
Объявление функции:
Function ИмяФункции (ФормальныеПараметры) : ТипРезультата;
{ описательная часть функции }
Begin
{ Инструкции исполнительной части функции }
ИмяФункции := Результат;
end;
1.2 Использование процедур в языке Pascal
Процедура — это независимая именованная часть программы, которую после однократного описания можно многократно вызывать по имени из последующих частей программы. Вызов процедуры оформляется как отдельный оператор, процедура не может выступать как операнд в выражении.
Структура процедуры повторяет структуру программы, это "программа в миниатюре", состоящая из заголовка и тела. В отличие от программы, для процедур и функций наличие заголовка обязательно.
Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного списка формальных параметров. Тело процедуры по своей структуре аналогично обычной программе:
procedure ИмяПроцедуры(ФормальныеПараметры) ;
{ Описательная часть процедуры }
begin
{ Инструкции исполнительной части процедуры }
end;
В конце тела процедуры, как и в конце программы, стоит end, однако после end ставится точка с запятой, а не точка.
Для обращения к процедуре используется оператор вызова процедуры. Он состоит из имени процедуры и необязательного списка фактических параметров, отделенных друг от друга запятыми:
ИмяПроцедуры(ФактическиеПараметры);
При вызове процедуры работа главной программы приостанавливается и начинает выполняться вызванная процедура. Когда процедура выполнит свою задачу, программа продолжится с оператора, следующего за оператором вызова процедуры.
Для принудительного выхода из процедуры в ее теле записывается оператор завершения exit, который обеспечивает выход во внешний блок (обычно — в основную программу).
Эти несложные правила позволяют сформировать выводы об использовании процедур.
1.Если в программе есть повторяющиеся фрагменты, оформление их в виде процедур позволит сократить текст основной программы.
2. При использовании осмысленных и понятных имен процедур текст основной программы становится не только более коротким, но и более понятным и выразительным.
3.Использование процедур позволяет упростить процесс внесения изменений в повторяющиеся фрагменты, т. к. исправления делаются один раз в процедуре, а не несколько раз в программе.
Параметры для процедуры аналогичны исходным данным для программы. Использование параметров позволяет сделать процедуру более универсальной. Процедура может выполнять какие-либо вычисления, но по определенным причинам нет смысла сразу выводить результаты на экран. Тем не менее, они нужны программе для дальнейшей работы. В этом случае результаты работы процедуры можно передать в программу через параметры, как и исходные данные.
Параметры служат для обмена данными между программой и подпрограммой. Программа передает подпрограмме какие-то входные данные (если они требуются), а от подпрограммы получает результаты в виде значений переменных. Иногда подпрограмма не требует входных данных, иногда не возвращает результатов, а иногда и вообще не содержит параметров, как в самом первом из приведенных примеров.
1.3 Механизм передачи параметров
Параметры, которые указываются при описании процедур и функций, называются формальными. Название "формальные" параметры получили в связи с тем, что они нужны только для записи алгоритма, а при вызове подпрограммы на их место будут подставлены конкретные фактические параметры.
Соответствие между формальными и фактическими параметрами обеспечивается выполнением следующих требований:
- формальных и фактических параметров должно быть одинаковое количество;
- порядок следования фактических и формальных параметров должен быть один и тот же;
- тип фактического параметра должен быть совместим с типом соответствующего ему формального параметра.
В языке Pascal типом любого параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип.
Например, нельзя объявить процедуру с заголовком:
procedure proc(m,n: integer; k: 1..5);
Для передачи в процедуру параметра к необходимо предварительно описать его тип в разделе описаний основной программы.
type range : 1. .5;
procedure proc(m,n: integer; к: range);
Имеются два основных вида параметров, которые отличаются способом их передачи в подпрограмму:
- параметры-значения;
- параметры-переменные.
Начиная с версии Turbo Pascal 7.0, появилась еще одна разновидность параметров — параметры-константы. В Delphi они также используются.
1.3.1. Параметры-значения
Параметры-значения используются только для передачи исходных данных из основной программы в процедуру или функцию. По умолчанию параметры подпрограммы считаются именно параметрами-значениями.
В данном случае подпрограмме передается лишь значение параметра, которое помещается в переменную, специально созданную для этой цели. Таким образом, в подпрограмме используется копия фактического параметра. В теле подпрограммы формальные параметры могут изменяться, но это никак не отразится на фактических параметрах, т. к. меняется их копия.
Поэтому параметры-значения нельзя использовать для передачи результатов из подпрограммы в основную программу. К сожалению, нарушение этого требования — это типичная ошибка начинающих, которая не обнаруживается компилятором, но выражается в неверных результатах работы программы. Ошибки, которые трудно обнаружить, лучше совсем не делать, поэтому будьте внимательны к параметрам подпрограмм.
Зато фактическим параметром-значением может быть не только константа или переменная с заданным значением, но и произвольное выражение. Перед вызовом подпрограммы фактические параметры вычисляются, и полученное значение передается в подпрограмму — выполняется подстановка значений.
1.3.2. Параметры-переменные
Параметры-переменные необходимо использовать, прежде всего, для возврата результатов работы подпрограммы в основную программу.
В списке формальных параметров перед ними ставится ключевое слово var.
Каждому формальному параметру-переменной должен соответствовать фактический параметр обязательно в виде переменной. Выражение здесь недопустимо, т. к. результаты подпрограммы могут быть сохранены только в переменных.
В этом случае при вызове подпрограммы ей передается адрес фактического параметра в памяти и в дальнейшем подпрограмма работает именно с этой ячейкой памяти, а не с копией, как при использовании параметра-значения.
1.3.3 Параметры-константы
Параметры-константы передаются по адресу, как параметры-переменные, но значения их запрещено изменять в подпрограмме. За этим строго следит компилятор, при нарушении запрета он выдает сообщение об ошибке Invalid variable reference (Недопустимое обращение к переменной).
При описании подпрограммы перед параметрами-константами добавляется служебное слово const, например:
procedure proc (const p: integer) ;.
Параметры-константы — это очень хороший способ передачи исходных данных в подпрограмму, т. к. он не требует дополнительных затрат памяти для хранения копий (во многих случаях для хранения адреса требуется меньше памяти, чем для хранения самого значения). При этом сами исходные данные в своих ячейках памяти остаются в неприкосновенности.
1.4 Использование функций
Если результатом подпрограммы является только одно значение, то имеет смысл оформить такую подпрограмму не в виде процедуры, а в виде функции. Функция пользователя во всем аналогична процедуре, за исключением двух отличий:
- функция передает в программу результат своей работы — единственное значение, носителем которого является имя самой функции;
- имя функции может входить в выражение как операнд.
Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово function, имя функции, необязательный список формальных параметров и, в отличие от процедуры, тип возвращаемого функцией значения. Тело функции по своей структуре аналогично обычной программе: