Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 12.14.doc
Скачиваний:
5
Добавлен:
11.07.2019
Размер:
92.16 Кб
Скачать

Лекции 12-14: Процедуры и функции.

1. Концепция подпрограммы в Турбо Паскале.

2. Процедуры: описания и вызовы.

3. Функции: описания и вызовы .

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

5. Области действия имён в программах.

6. Особенности разработки программ с подпрограммами на Турбо Паскале.

1. Концепция подпрограммы в Турбо Паскале.

Понятие подпрограммы - одно из фундаментальных понятий в программировании, возникшее фактически вместе с понятием программы. При разработке больших программ весьма важно иметь возможность разбивать программу на более мелкие составные части так, чтобы каждая такая часть имела структуру, подобную программе, а, следовательно, бы обладала некоторой степенью автономии. Такая часть программы называется подпрограммой. Одна подпрограмма может включать в себя другие подпрограммы и т.д., создавая иерархическую структуру подпрограмм любого уровня вложенности. Подпрограммы определяют декомпозицию основной программы, направленную на преодоление сложности разработки и понимания текста программы. Практически все языки программирования включают механизм подпрограмм в той или иной форме. Рассмотрим этот механизм применительно к языку Паскаль.

Ключевой идеей механизма подпрограмм является следующая идея: подпрограмма должна описываться один раз и иметь возможность многократных её вызовов из разных точек основной программы. В этом случае мы экономно записываем текст программы (без многократного дублирования одних и тех же фрагментов). Таким образом, в механизме подпрограмм следует различать

 определение (описание) подпрограммы;

 вызов подпрограммы для её выполнения.

Важным понятием в механизме подпрограмм является понятие параметра подпрограммы. Параметры подпрограммы позволяют получать большую гибкость при использовании одной подпрограммы, предоставляя возможность иметь вызовы подпрограммы не только в различных точках основной программы, но и с различными значениями параметров. В качестве значений параметров могут быть переменные, константы, другие процедуры или функции, объекты, а также значения выражений любых типов. Возможны, как частный случай, и подпрограммы без параметров.

Механизм подпрограмм использует две категории параметров: формальные параметры и фактические параметры. Формальные параметры используются при описании подпрограмм, а фактические - указываются при вызовах подпрограмм. Фактические параметры должны соответствовать формальным параметрам по типу используемых конструкций.

Формальным параметром называется имя, которое может использоваться в операторной части описания подпрограммы для выполнения действий подпрограммы и через которое осуществляется связь подпрограммы с "внешней средой", т.е. с основной программой. Формальные параметры могут быть переменными соответствующих типов, либо именами процедур, функций, объектов.

Формальные параметры условно можно разделить на три вида:

 входные параметры, через которые подпрограмма воспринимает исходную информацию для вычислений,

 выходные параметры, через которые подпрограмма выдает свои результаты в основную программу, и

 смешанные параметры - используемые и как входные и как выходные.

Различают формальные параметры-значения и формальные параметры-переменные. Различие между ними состоит в том, что параметры-значения при вызове представляют копии соответствующих значений выражений, а параметры-переменные не копируются, а непосредственно связываются с подпрограммой, т.е. в подпрограмму передаются адреса соответствующих фактических параметров. Выходные и смешанные параметры всегда являются параметрами-переменными, а входные параметры в большинстве своем являются параметрами-значениями, хотя в некоторых случаях это может быть неэкономно с точки зрения потребляемой оперативной памяти (например, для параметров-массивов). Однако заметим, что этот способ передачи входных параметров в подпрограмму позволяют избежать несанкционированного изменения значения переменных в вызывающей программе, т.е. избежать побочного эффекта.

Замечание

Для экономной передачи данных через параметры-массивы лучше использовать формальные параметры-константы, отличающиеся от параметров-значений тем, что они не создают копий значений.

Фактический параметр - это выражение соответствующего типа (в том числе, возможно, переменная или константа), значение которого должно быть вычислено в момент вызова и подставлено при вызове на место формального параметра.

Формальные и фактические параметры указываются списком параметров.

В списке формальных параметров параметры описываются с указанием имени параметра и типа, причём параметры-переменные описываются с ключевым словом var, а параметры-константы - с ключевым словом const. Одна группа параметров отделяется от другой точкой с запятой. В группе параметров одного типа имена параметров отделяются запятой.

Замечание

Поскольку описание одной подпрограммы может быть вложено в описание другой подпрограммы, следует различать вызывающую подпрограмму и вызываемую подпрограмму. Вызываемая подпрограмма вложена в вызывающую подпрограмму. Роль вызывающей подпрограммы может выполнять и основная программа.

Между списком формальных параметров и списком фактических параметров должно быть взаимно однозначное соответствие (при просмотре списка), причем тип фактического параметра должен точно совпадать с типом формального параметра.

Замечание

В описании одной подпрограммы может содержаться вызов другой подпрограммы, а та в свою очередь может содержать вызов первой подпрограммы. Для возможности корректного описания таких подпрограмм используются опережающие описания с помощью директивы forward. Вначале записывается заголовок первой подпрограммы с директивой forward вместо тела подпрограммы. Затем дается полное описание второй подпрограммы и первой подпрограммы .

2. Процедуры: описание и вызовы процедур.

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

Синтаксическая форма описания процедуры имеет вид:

procedure <имя процедуры> (< список формальных параметров >);

< описание локальных имен процедуры >

begin

< тело процедуры - последовательность операторов процедуры >

end;

Раздел описаний процедуры содержит описание всех локальных имён, используемых в разделе операторов процедуры. Локальными называются имена, которые объявлены в данной процедуре (эти имена теряют свои значения при выходе из процедуры). Часто локальными именами являются вспомогательные переменные, необходимые для выполнения вычислений в процедуре, ими могут быть и другие процедуры или функции.

Раздел операторов процедуры может содержать любую последовательность операторов, выполняющих необходимое действие. В этих операторах могут использоваться как формальные параметры, так и локальные имена, а также глобальные имена, т.е. имена, описанные вне данной процедуры. Глобальные имена представляют

собой еще один механизм передачи параметров между процедурой и внешней средой.

Выполнение процедуры заканчивается либо при достижении слова end, завершающего раздел операторов, либо при выполнении оператора exit.

Вызов процедуры имеет следующую синтаксическую форму:

<имя процедуры>(<список фактических параметров>);

где фактические параметры перечисляются в списке через запятую.

Пример программы на Турбо Паскале, использующей процедуру:

program triangle1;{Программа, вычисляющая длины сторон треугольника АВС}

uses CRT;

type point = array [1..2] of real; {тип- точка на плоскости}

var A,B,C:point; {вводимые точки}

AB,BC,AC:real; {стороны треугольника}

ch:char;

procedure d(X,Y:point; var r:real);{ расстояние между точками X и Y }

begin r:= sqrt(sqr(X[1]-Y[1])+sqr(X[2]-Y[2])) end { d};

BEGIN TextBackground(cyan);TextColor(white);ClrScr;

window(10,5,60,10);TextBackground(green); ClrScr;

repeat

writeln(' Введите координаты вершин A,B,C:');

writeln('A[1] A[2] B[1] B[2] C[1] C[2] '); readln(A[1],A[2],B[1],B[2],C[1],C[2]);

writeln(' Длины сторон треугольника АВС:');d(A,B,AB);d(B,C,BC);d(A,C,AC);

writeln(' AB=', AB:2:2,' AC=', AC:2:2,' BC =', BC:2:2); readln(ch)

until ch=' ';

END {triangle1}.

3. Функции: описания и вызовы функций.

В отличие от процедур, функции не являются отдельными операторами. Функции возвращают значения (результат обращения к ним) и предназначены для использования в составе выражений или в качестве выражений. Это накладывает определенный отпечаток на синтаксическую структуру описания функций, которая имеет вид:

function < имя функции >[(<список формальных параметров>)]:<тип функции >;

< описание локальных имён >

begin

< тело функции - последовательность операторов >

end;

В заголовке описания функции обязательно указывается тип вырабатываемого функцией результата, которым может быть любой простой тип Турбо Паскаля, а также строковый тип и тип указатель.

Другое отличие описания функции состоит в необходимости присутствия в теле функции хотя бы одного оператора присваивания, левой частью которого является имя функции. Смысл этого оператора - в присваивании функции некоторого результата как итога выполнения функции. Заметим, что имя функции не должно присутствовать в правой части операторов присваивания.

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

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

В языках программирования понятие функции приобретает, вообще говоря, более широкий смысл. Дело в том, что функция - некоторая подпрограмма, которая в процессе своего выполнения может не только вычислять результат функции от значений аргументов, но и производить некоторое дополнительное воздействие на окружающую среду (например, изменять значение некоторых глобальных переменных, выводить информацию в файлы и др.). Такое воздействие называют побочным эффектом вычисления функций.

Побочный эффект - весьма опасное явление, которое может приводить к трудно обнаруживаемым ошибкам. Поэтому хорошим стилем считается использование только функций без побочного эффекта (так называемых чистых функций). Если функция использует только параметры-значения и не использует глобальные имена, а также операторы вывода, вызова других подпрограмм, то это гарантирует отсутствие побочного эффекта. Впрочем, в некоторых случаях имеет смысл применять функции с побочным эффектом (например, для реакций на ошибки при вычислении значения функции).

Синтаксическая форма вызова функции аналогична вызову процедуры, т.е. включает имя функции и список фактических параметров, заключенный в круглые скобки. Различие лишь в том, что вызов функции есть выражение, а не отдельный оператор.

Замечание

Используя так называемый расширенный синтаксис, можно вызывать функцию как процедуру (т.е. как оператор). Для включения расширенного синтаксиса имеется директива компилятора {$X+}. Это находит применение при инициализации динамических объектов.

Приведем пример программы triangle2, отличающейся от triangle1 тем, что вместо процедуры d использована функция dist:

program triangle2; {Программа, вычисляющая длины сторон треугольника АВС}

uses CRT;

type point = array [1..2] of real; {тип- точка на плоскости}

var A,B,C:point; {вводимые точки}

ch:char;

function dist(X,Y:point):real;{ расстояние между точками X и Y }

begin dist:= sqrt(sqr(X[1]-Y[1])+sqr(X[2]-Y[2]))

end { dist};

BEGIN TextBackground(cyan);TextColor(white);ClrScr;

window(10,5,60,10);TextBackground(green); ClrScr;

repeat

writeln(' Введите координаты вершин A,B,C:');

writeln('A[1] A[2] B[1] B[2] C[1] C[2] ');

readln(A[1],A[2],B[1],B[2],C[1],C[2]);

writeln(' Длины сторон треугольника АВС:');

writeln(' AB=',dist(A,B):2:2,' AC=',dist(A,C):2:2,' BC =',dist(B,C):2:2);readln(ch)

until ch=' ';

END {triangle}.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]