Утверждаю
Ректор университета
_______________А.В. Лагерев
«______»_____________2007г.
Алгоритмические языки и программирование Работа с процедурами и функциями
Методические указания
к выполнению лабораторной работы №5
для студентов очной формы обучения
специальности 230201 – "Информационные системы
и технологии"
Брянск 2007
УДК 004.43
Алгоритмические языки и программирование. Работа с процедурами и функциями: методические указания к выполнению лабораторной работы №5 для студентов очной формы обучения специальности 230201 – "Информационные системы и технологии". – Брянск: БГТУ, 2007. - 12 с.
Разработал: Ю.А. Леонов, асс.
С.М. Рощин, к.т.н.
Научный редактор Ю.М. Казаков
Редактор издательства Л.И. Афонина
Компьютерный набор Ю.А. Леонов
Рекомендовано кафедрой «Компьютерные технологии и системы» БГТУ (протокол № от )
Темплан 2007г., п. 456
Подписано в печать Формат 60х84 1/16. Бумага офсетная. Офсетная печать. Усл. печ. л. 0,7 Уч. – изд. л. 0,7 Тираж 50 экз. Заказ Бесплатно |
Издательство брянского государственного технического университета, 241035, Брянск, бульвар 50-летия Октября, 7, БГТУ. 58-82-49
Лаборатория оперативной полиграфии БГТУ, ул. Харьковская, 9
-
Цель работы
Целью работы является изучение общей структуры процедур и функций, а также овладение практическими навыками грамотного составления процедур и функций.
Продолжительность работы – 4 ч.
-
Теоретическая часть
При создании программы для решения сложной задачи выполняется декомпозиция (разделение) этой задачи на подзадачи, подзадач – на еще меньшие подзадачи и так далее, до легко программируемых элементарных подзадач.
Язык Pascal имеет различные средства для деления программы на части. На верхнем уровне деления (больших задач) – это модули, на нижнем уровне (элементарных подзадач) – это чаще всего процедуры и функции. Процедуры и функции являются важным средством в большинстве языков программирования. С их помощью можно скомпоновать группу операторов для выполнения некоторой подзадачи. Процедуру/функцию можно вызвать из различных мест программы, она может возвращать вычисленные результаты и ей можно передавать информацию, которую она использует для выполнения вычислений. Для того чтобы процедура/функция начала работу, ее нужно вызвать (активизировать).
Структура описания процедуры имеет вид:
procedure Имя_Процедуры (Список Формальных Параметров);
label – раздел описания меток
const – раздел описания констант
type – раздел описания типов
var – раздел описания переменных
procedure – описание внутренних процедур
function – описание внутренних функций
Begin
тело процедуры
End;
Структура описания функции имеет вид:
function Имя_Функции (Список Формальных Параметров): Тип возвращаемого результата;
label – раздел описания меток
const – раздел описания констант
type – раздел описания типов
var – раздел описания переменных
procedure – описание внутренних процедур
function – описание внутренних функций
Begin
тело функции
Имя:=…
End;
Подпрограмма вызывается следующим образом:
с помощью процедуры:
Имя_Процедуры (Список Фактических Параметров);
с помощью функции:
Имя_Функции (Список Фактических Параметров);
Параметры, указываемые в заголовке процедуры/функции при ее описании, называются формальными параметрами.
Параметры, указываемые при вызове процедуры/функции, называются фактическими параметрами.
Список фактических параметров и список формальных параметров для одной и той же процедуры/функции должен быть идентичен, т.е. количество параметров и их типы должны совпадать.
Совпадение имен фактических и формальных параметров нежелательно, так как при входе в процедуру/функцию для каждого формального параметра выделяется «новая» память, следовательно, переменная, описанная глобально, и формальный параметр с тем же именем находятся в разных областях памяти. Из-за неправильного понимания работы глобальных и локальных переменных, их области видимости могут возникать нежелательные ошибки.
Область действия идентификаторов при использовании процедур и функций
Областью действия (сферой видимости) идентификатора называется часть программы, где он может быть использован. Область действия идентификаторов определяется местом их объявления. Если идентификаторы допускается использовать только в рамках одной процедуры или функции, то такие идентификаторы называются локальными. Если действие идентификаторов распространяется на несколько вложенных (не менее одной) процедур и/или функций, то такие идентификаторы называются глобальными.
Замечания:
-
Понятия «глобальные» и «локальные» следует понимать по отношению к конкретной процедуре или функции.
-
Локальные данные создаются при вызове процедуры/функции и существуют только во время ее выполнения. Выделение памяти для локальных данных происходит автоматически в начале выполнения процедуры/функции, а освобождение этой памяти – как только выполнение процедуры/функции заканчивается.
-
В процедуре/функции локальный идентификатор всегда перекрывает глобальный.
Передача данных в подпрограммы
Данные для обработки процедуры и функции могут получать из вызвавшей их основной программы или подпрограммы.
Из основной программы данные могут быть получены:
-
неявно – с использованием глобальных констант и переменных;
-
явно – через параметры.
Неявная передача данных в подпрограммы
Каждой подпрограмме доступны все ресурсы программного блока, в разделе описаний которого эта подпрограмма объявлена. Ресурсы же основной программы (глобальные) доступны в любой подпрограмме. В том случае, если в подпрограмме объявляется ресурс, имя которого совпадает с именем глобального ресурса, соответствующий глобальный ресурс в подпрограмме становится недоступным (перекрывается).
Для примера приведем код программы, описывающей видимость глобальных и локальных данных.
Var x, y, z: integer;
Procedure Proc(x: integer);
Var y: integer;
Begin
y:=8;
z:=7;
Writeln(x, ' ', y);
x:=10;
End;
BEGIN
x:=4; y:=3;
Writeln(x, ' ', y);
Proc(5);
Writeln(x, ' ', y);
Writeln(z);
END.
В данной программе объявлены переменные x, y в глобальной области видимости, а также переменные x, y в локальной области видимости. Как указывалось, такая ситуация возможна, при этом у каждого идентификатора имеется своя область действия. Когда мы изменяем значения переменных x, y в процедуре Proc, изменения не касаются переменных x, y, объявленных в глобальной области, так как действие локальных данных не распространяется на глобальную область. В процедуре Proc, т.е. в локальной области видимости, доступны все переменные, объявленные в глобальной области, кроме тех, у которых имена локальных и глобальных идентификаторов совпадают. Для приведенной программы изложенное означает, что обращаясь к переменным x, y, мы получаем доступ к локальным переменным, а обращаясь к переменной z, мы получаем доступ к глобальному данному.
Результатом работы приведенной программы будет вывод на экран значений переменных x, y, z:
4 3
5 8
4 3
7
Проанализируйте самостоятельно результаты данной программы, учитывая области видимости переменных.
Опыт программистов показывает, что неявная передача данных в подпрограммы обычно приводит к большому количеству ошибок, которые достаточно сложно искать, так как неизвестно, какая подпрограмма с какими глобальными ресурсами работает. Кроме того, подпрограммы, использующие глобальные данные, затруднительно перенастроить на работу с другими значениями, что сокращает возможности их применения. Поэтому желательно использовать явную передачу значений – через параметры.
Явная передача данных в подпрограммы
Для того чтобы локализовать взаимодействие подпрограммы от «внешнего мира», необходимо пользоваться механизмом явной передачи данных в подпрограммы. Осуществить явную передачу данных можно через фактические параметры, передаваемые при вызове подпрограммы. Фактические параметры при вызове соответствуют формальным параметрам при описании подпрограммы. Формальные параметры представляют собой набор переменных с описанием их типов в заголовке подпрограммы. Несоответствие типов и количества формальных и фактических параметров выявляется компилятором (или компоновщиком, если вызов подпрограммы происходит из другого модуля). Нарушение порядка следования фактических параметров, если это нарушение не связано с несовпадением количества параметров или их типов, приводит к нарушению логики работы программы и часто может быть обнаружено только при тестировании программы. В языке Pascal параметры в подпрограмму могут передаваться тремя способами:
-
как значения – в подпрограмму передаются копии значений параметров, и никакие изменения этих копий не возвращаются в вызывающую программу;
-
как переменные – в подпрограмму передаются адреса фактических параметров, соответственно все изменения этих параметров в подпрограмме происходят с переменными, переданными в качестве фактических параметров, из этого следует, что использовать константы в качестве фактических данных нельзя; такие параметры при описании помечаются служебным словом var;
-
как неизменяемые переменные (именованные константы) – в подпрограмму, так же как и в предыдущем случае, передаются адреса фактических параметров, но при попытке изменить значение параметра компилятор выдает сообщение об ошибке; такие параметры при описании помечаются служебным словом const.
Возврат значений процедурами/функциями
При построении модулей важно соблюдать принцип скрытия информации. Принцип скрытия информации, поддерживаемый модулями, позволяет создавать надежно работающие и легко модифицируемые программы. Отдельные части модуля (процедуры/функции) должны быть построены по этому принципу, т.е. процедуры и функции не должны зависеть от глобальных переменных. Все необходимые данные для обработки должны передаваться в параметрах.
Результаты работы могут быть получены как при использовании функции, так и процедуры. Разница между процедурой и функцией только в том, что функция имеет возможность возвращать данные в своем имени, а процедура нет. Ниже рассмотрен пример функции и процедуры для задачи сложения двух строковых переменных.
function SumStr(S1, S2: string): string;
begin
SumStr:=S1+S2;
end;
procedure SumStr(S1, S2: string; var S: string);
begin
S:=S1+S2;
end;
Память под формальные параметры S1 и S2 выделяется при вызове процедуры/функции. После выполнения процедуры SumStr результат работы передается в переменную S. Объявление формального параметра var S означает, что формальный параметр получает адрес фактического параметра. Это означает, что при таком объявлении организовывается связь между фактическим и формальным параметрами. Если будут происходить изменения в формальном параметре, то автоматически будут происходить изменения и в связанном с ним в фактическом параметре. Функция, также как и процедура, может передавать данные через фактические данные. Функции/процедуры могут возвращать данные в нескольких параметрах.