Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 72

| CONST

| >SQRMAX =100; { локальная простая константа }

| BEGIN { начало тела процедуры }

| { В X запишется квадрат его последнего значения: }

| > X := X * X;

| { Результат сравнения запишется в глобальный флаг: }

| > GlobalFlag := ( X > SQRMAX );

| >if GlobalFlag then

| > X:=SQRMAX; { ограничение X }

| > Sq := X { возвращение значения }

| >END; { конец тела процедуры }

| VAR

| > SqGlobal : Real;

| BEGIN { основной (вызывающий) блок }

| > GetSQR ( 5, SqGlobal );

| > WriteLn( SqGlobal, ' Флаг: ', GlobalFlag )

| END.


Рис. 6.7

Оставим ненадолго процедуры и рассмотрим функции. Идентификатор функции возвращает после вызова скалярное значение заданного типа. Для присвоения функции значения ее имя должно хотя бы однажды появиться в левой части оператора присваивания в теле самой функции. Вызов функции производится уже не обособленно, а в том месте, где необходимо значение функции (в выражениях, вызовах других подпрограмм и т.п.). Например, процедуру GetSQR на рис. 6.7 можно переписать в виде функции (рис. 6.8).


| >VAR GlobalFlag : Boolean; { глобальный флаг }

| >FUNCTION GetSQR( X : Real ) : Real;

| >CONST SQRMAX =100;

| BEGIN

| > X := X*X;

| > GlobalFlag:=(X>SQRMAX);

| >if GlobalFlag then X:=SQRMAX;

| > GetSQR := X { возвращение значения }

| END;


Рис. 6.8

- 111 -


| BEGIN { основной (вызывающий) блок }

| > WriteLn( GetSQR( 5 ), ' Флаг: ', GlobalFlag )

| END.


Рис. 6.8 (окончание)

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

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

Большое значение имеет соблюдение правил соответствия типов при подстановке параметров. Нельзя (да и не получится — компилятор не пропустит!) конструировать типы в описаниях параметров. Можно использовать только уже известные идентификаторы типов. То же самое можно сказать о типе возвращаемого значения функции. И, конечно, число и порядок следования параметров в вызове должен соответствовать описанию процедуры или функции. Кроме того, в Турбо Паскале существует правило, требующее, чтобы параметры, имеющие файловый тип (или сложный тип с файловыми компонентами), были обязательно описаны как