Описание и использование процедур и функций

Автор работы: Пользователь скрыл имя, 01 Октября 2012 в 21:37, лекция

Краткое описание

Подпрограмма – это часть программы, оформленная в виде отдельной синтаксической конструкции и снабженная именем. Структура подпрограммы аналогична структуре программы. Использование подпрограмм позволяет упростить процесс программирования и логику программы за счет применения методики так называемого нисходящего проектирования, т.е. разбиения исходной задачи на более простые подзадачи.

Прикрепленные файлы: 1 файл

Подпрограммы для ПИО.doc

— 46.00 Кб (Скачать документ)

Описание и  использование процедур и функций

Подпрограмма – это часть программы, оформленная в виде отдельной синтаксической конструкции и снабженная именем. Структура подпрограммы аналогична структуре программы. Использование подпрограмм позволяет упростить процесс программирования и логику программы за счет применения методики так называемого нисходящего проектирования, т.е. разбиения исходной задачи на более простые подзадачи. Каждую подзадачу можно оформить в виде подпрограммы. Подпрограмма должна быть описана до того, как она будет использована в вызывающей программе или другой подпрограмме. В языке 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.


Информация о работе Описание и использование процедур и функций