Автор работы: Пользователь скрыл имя, 01 Октября 2012 в 21:37, лекция
Подпрограмма – это часть программы, оформленная в виде отдельной синтаксической конструкции и снабженная именем. Структура подпрограммы аналогична структуре программы. Использование подпрограмм позволяет упростить процесс программирования и логику программы за счет применения методики так называемого нисходящего проектирования, т.е. разбиения исходной задачи на более простые подзадачи.
Описание и использование процедур и функций
Подпрограмма – это часть программы, оформленная в виде отдельной синтаксической конструкции и снабженная именем. Структура подпрограммы аналогична структуре программы. Использование подпрограмм позволяет упростить процесс программирования и логику программы за счет применения методики так называемого нисходящего проектирования, т.е. разбиения исходной задачи на более простые подзадачи. Каждую подзадачу можно оформить в виде подпрограммы. Подпрограмма должна быть описана до того, как она будет использована в вызывающей программе или другой подпрограмме. В языке Pascal имеется два вида подпрограмм - процедуры и функции.
Процедуры
Подпрограмма-процедура предназначена для выполнения некоторой логически законченной последовательности действий. Описание процедуры состоит из заголовка, раздела описаний и раздела операторов. Завершается описание процедуры точкой с запятой. Заголовок процедуры имеет вид:
procedure имя процедуры (список формальных параметров);
В качестве формальных параметров, как правило, указываются входные и выходные параметры процедуры. Список формальных параметров может быть разбит на группы, разделённые точками с запятыми. В группу включаются однотипные параметры. Для каждого формального параметра указывается его имя и тип. Тип формального параметра - идентификатор. Список формальных параметров может отсутствовать.
Примеры:
procedure summa(a:integer; var b,c:real); {a,b,c формальные параметры}
procedure t;
procedure a(var x:d); {d – имя (идентификатор) нестандартного типа, описанного ранее в разделе type}
Оператор вызова процедуры имеет вид:
имя процедуры (список фактических параметров);
В операторе вызова процедуры фактические параметры отделяются друг от друга запятыми. Количество, типы и порядок записи фактических параметров должны соответствовать количеству, типам и порядку записи формальных параметров.
Примеры операторов вызова процедур:
t; {нет списка фактических
summa(x,y,z); {x,y,z –фактические параметры; x: integer; y, z: real}
a(z); {z – фактический параметр, z:d}
При вызове подпрограммы
фактические параметры
Подпрограмма-функция предназначена для вычисления некоторого значения. Описание функции содержит два отличия от описания процедуры.
1) Заголовок функции имеет вид:
function имя функции (список формальных параметров): тип функции;
Тип функции – это тип возвращаемого результата.
2) В разделе операторов имени функции должно быть присвоено значение возвращаемого результата.
Пример: function f (x:integer):real;
begin f :=sin(x)+sqr(x) end;
В Object Pascal функции могут возвращать значения любого типа, кроме типа объекта старой модели (object) и файловых типов.
Для вызова функции из программы или другой подпрограммы следует указать имя функции со списком фактических параметров в выражении, где необходимо использовать значение функции.
Например: y :=f(a); {a - фактический параметр}
writeln(f(2+b)); {2+b – фактический параметр}
В Object Pascal для каждой функции автоматически определена локальная переменная Result того же типа, что и возвращаемое функцией значение. Эту переменную можно использовать в промежуточных вычислениях. Значение Result при вызове функции не определено. Последнее присвоенное ей значение и вернется как значение функции.
Примеры:
function f (x:integer):real;
begin result :=sin(x)+sqr(x) end;
Локальная переменная Result может использоваться и в правой части оператора присваивания, не вызывая рекурсивного вызова функции.
function f : integer;
begin result:=1; result:= result +1 end;
Функция f будет возвращать значение 2. А выполнение функции g:
function g: integer;
begin g:=1; g:= g+1 end;
приведет к зацикливанию программы.
В Delphi функция может быть вызвана как процедура. При этом возвращаемое значение просто теряется.
Формальные параметры можно разбить на несколько категорий. Рассмотрим две из них:
Параметры-значения передаются основной программой в подпрограмму в виде их копий и, следовательно, подпрограмма не может изменить собственный параметр программы. Другими словами, формальный параметр-значение при вызове подпрограммы получает свое значение путем копирования соответствующего ему фактического параметра, и при изменении такого формального параметра соответствующий ему фактический параметр не меняется.
Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие – типом. Тип параметра-значения может быть любым за исключением файлового. В качестве фактического параметра на месте параметра-значения при вызове подпрограммы может выступать любое выражение совместимого для присваивания типа.
При передаче параметров-переменных в подпрограмму передаются сами переменные, а не их копии (фактически передаются их адреса в порядке, объявленном в заголовке подпрограммы). Следовательно, подпрограмма имеет доступ к этим параметрам и может их изменять. Параметр-переменная используется в том случае, когда значение должно передаваться из подпрограммы вызывающей программе. При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра должна использоваться переменная идентичного типа.
Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово var. Действие var распространяется до ближайшей точки с запятой, т.е. в пределах одной группы.
procedure summa(a:integer;b:real; var c:real);
begin c:=a+b
end; {a, b- параметры-значения; c – параметр-переменная.}
Локальные и глобальные параметры
Параметры, объявленные внутри подпрограммы и доступные только ей самой, называются локальными.
В разделе описаний подпрограммы могут встретиться описания подпрограмм низшего уровня, а в них – описания других подпрограмм и т.д. При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней имена, но и сохраняется доступ ко всем именам верхнего уровня. Подпрограмме доступны только те объекты верхнего уровня, которые описаны до описания данной подпрограммы. Эти объекты называются глобальными по отношению к этой подпрограмме.
Параметры, объявленные до описания данной подпрограммы, доступны этой подпрограмме и являются глобальными параметрами. Одноименные глобальные и локальные параметры – это разные параметры. Любое использование такого имени в подпрограмме трактуется как обращение к локальному параметру, то есть глобальный параметр в этом случае недоступен.
Таким образом, обмен информацией между основной программой и подпрограммой может осуществляться не только с помощью формальных и фактических параметров, но и глобальных параметров.
Примеры:
1) program Project1;
{$apptype console}
uses SysUtils;
var x,y,z:integer;
procedure newval;
var x,y:integer; {x и y- локальные параметры}
begin x:=1; y:=1 end; {конец процедуры}
begin x:=0; y:=0; newval; z:=x+y; writeln(z); readln
end.
Результат z=0, так как переменные x и y, используемые в основной программе, остаются равными нулю. Для того, чтобы результат z стал равным 2, нужно параметры x и y использовать как глобальные, для этого в теле процедуры newval следует убрать описание переменных x и y:
2) program Project2;
{$apptype console}
uses SysUtils;
var x,y,z:integer;
procedure newval;
begin x:=1; y:=1 end;
begin x:=0; y:=0; newval; z:=x+y; writeln(z); readln
end.
Результат z=2, так как x и y – глобальные параметры.
Задача 1. Даны длины сторон и диагонали выпуклого четырехугольника. Вычислить его площадь.
Введем обозначения:
a,b,c,d,f – длины сторон и диагонали четырехугольника;
s – площадь четырехугольника.
Входные данные: a,b,c,d,f.
Выходные данные: s.
Четырехугольник разбит диагональю на два треугольника. Вычислив площади этих треугольников (s1, s2), можно определить искомую площадь четырехугольника (s). Используем подпрограмму для вычисления площади треугольника. Пусть x,y,z – стороны треугольника, s – его площадь. Площадь треугольника можно вычислить по формуле Герона , где p - полупериметр треугольника. В процедуре square будет четыре формальных параметра: x,y,z – параметры-значения (входные величины этой подпрограммы); s – параметр-переменная (выходная величина, результат этой подрограммы). Переменная p – локальный параметр этой процедуры.
program Project15_1;
{$apptype console}
uses SysUtils;
var a,b,c,d,f,s,s1,s2:real ;
procedure square (x,y,z:real; var s:real);
var p:real;
begin p:=(x+y+z)/2; s:=sqrt(p*(p-x)*(p-y)*(p-z)) end;
begin writeln (‘vvod a,b,c,d,f: ’); readln(a,b,c,d,f);
square (a,b,f,s1); {оператор вызова процедуры,
a,b,f,s1- фактические параметры}
square (c,d,f,s2); {оператор вызова процедуры,
c,d,f,s2 - фактические параметры }
s:=s1+s2; writeln(‘s=’,s:8:2); readln
end.
Информация о работе Описание и использование процедур и функций