Совместимость и преобразования типов. Паскаль - типизированный язык, следовательно, все применяемые операции определены только над операндами совместимых типов. Два типа считаются совместимыми, если • оба они есть один и тот же тип • один тип есть тип-диапазон второго типа. • оба они являются типами-диапазонами одного и того же базового типа. • один тип есть строка, а другой - строка или символ. • оба они есть процедурные типы с одинаковым типом результата (для типа-функции), одинаковым количеством параметров и одинаковым типом взаимно соответствующих параметров.
Процедуры и функции. Список формальных и фактических параметров, передача данных по значению и по адресу. Различия функции и процедуры в описании и в использовании.
Подпрограмма - обособленная именованная часть программы со своим собственным локальным контекстом имён. Или иначе: часть программы, оформленная в виде отдельной синтаксической конструкции и снабжённая именем. Вызов подпрограммы осуществляется по имени. Локальные объекты (константы, переменные, типы, подпрограммы) доступны только внутри подпрограммы. В Паскале подпрограммы бывают двух типов: процедуры и функции.
Структура подпрограммы почти буквально повторяет структуру всей программы, и в общем случае состоит из 3-х основных компонент:
Интерфейс подпрограммы (информация, необходимая для её вызова). Сосредоточен в заголовке. Локальный контекст подпрограммы (совокупность описаний объектов, с которыми осуществляются действия) Собственно действия, составляющие смысл подпрограммы(последовательность операторов и вызовов подпрограмм).
Процедуры и функции различаются назначением и способом использования.
Процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки. Или по-человечески, процедура, это подпрограмма, которая обрабатывает данные, принимает или выводит информацию, меняет или нет каким-либо образом глобальные и локальные переменные, вообще что-то делает.
Смысл функций - определить алгоритм вычисления нового значения некоторого простого или ссылочного типа. Функция, это подпрограмма, которая, как и процедура, что-то делает, но, помимо этого, она обязательно возвращает значение, тип которого задается при описании заголовка процедуры. Вызов функции является одним из допустимых операндов выражения, обозначая в нём то значение, которое вычисляет функция, то есть, если подпрограмма с идентификатором “Function1” – функция, то можно произвести следующие действия:
X:=Function1(“параметры – аргументы функции”);
X:=2*Function1(a,e,…,m,…)-1/Function1(c,f,…,k,…); и т.д.
3. Области видимости объектов
Имена объектов, описанных в некотором блоке, считаются известными в пределах данного блока, включая и все вложенные блоки. Имена объектов, описанные в блоке, должны быть уникальными в пределах данного блока и могут совпадать с именами объектов из других блоков.
Механизм передачи параметров. В заголовке подпрограммы может быть задан список формальных параметров. Каждый параметр, заданный в заголовке, считается локальным в данной подпрограмме. Идентификаторы формальных параметров можно считать условными обозначениями реальных (фактических) параметров, которые будут переданы в подпрограмму при её вызове.
Внимание: Типы формальных параметров должны обязательно обозначаться идентификаторами.
Недопустимо: Procedure InCorrect (Var A: Array [1..10] of Byte);
Нужно: Type MyArray = Array [1..10] of Byte; Procedure Correct (Var A: MyArray);
Допустимы по крайней мере три способа задания формальных параметров: параметры, перед которыми отсутствует служебное слово Var и за которыми следует идентификатор типа; параметр, перед которым Var и далее тип; параметр со словом Var и не имеющие типа.
Эти три способа задания формальных параметров отражают три различных способа передачи параметров a - по значению; b - по ссылке; c - передача нетипизированных параметров по ссылке (b, c - параметры-переменные).
Параметры - значения. Наиболее распространенный и простой способ. Параметр - обычная локальная переменная. Может использовать выражение. Любые действия внутри подпрограммы никак не отражаются на значениях переменной вне подпрограммы.
Параметры - переменные. Передаются по ссылке. Способ используется, когда необходимо передать некоторое значение в точку вызова подпрограммы. В случае Var - формальные параметры считаются синонимами соответствующих фактических параметров. При этом фактические параметры должны быть переменными (не выражениями) того же типа, что и формальные параметры:
Procedure Swap (Var X,Y: Real);
Var T: Real;
Begin T:= X; X:= Y; Y:= T; End;
Вычисление значения функции, завершение подпрограммы.
Смысл функции заключается в задании алгоритма вычисления некоторого значения и организации возврата этого значения в точку вызова.
В теле функции должен присутствовать оператор присваивания специального вида, в левой части которого должен быть указан идентификатор, совпадающий с именем функции, а в правой части - выражение, вычисляющее возвращаемое значение. Таких операторов может быть несколько, важно чтобы хотя бы один всегда срабатывал в процессе выполнения тела функции. Если в процессе выполнения функции не было выполнено ни одного присваивания, то результат функции считается неопределённым.
Функция может возвращать в качестве результата значения только простого, строкового или ссылочного типа.
Рекурсия и побочный эффект
В теле подпрограммы доступны все объекты, описанные в объемлющем блоке, в том числе и имя самой подпрограммы. Подпрограммы, вызывающие сами себя, называются рекурсивными.
Пример: алгоритм вычисления факториала: N! = (N-1)!*N
Fuction Fact(N: Word): LongInt;
Begin
If N = 1 then
Fact:= 1
else
Fact:= N * Fact(N-1);
End;
В Паскале нет никаких ограничений на рекурсивные вызовы подпрограмм, необходимо только помнить, что каждый очередной рекурсивный вызов приводит к образованию новой копии локальных объектов подпрограммы и все эти копии, соответствующие цепочке активизированных и незавершенных рекурсивных вызовов существуют независимо друг от друга.
Память под глобальные и типизированные константы выделяется при запуске программы в одном сегменте (65520 байт - сегмент данных программы).