Функции

End.

Begin

Begin

Var

End.

Begin

. . .

Begin

Var

Type

. . .

. . .

Const

. . .

Type

. . .

 

Пример.

MyInt = integer;

MyDouble = double;

 


<Раздел объявления типизированных констант> :: =

const // Признак начала раздела объявления констант

<Имя константы 1> : <Тип 1> = < Константное выражение 1> ;

<Имя константы 2> : <Тип 2> = < Константное выражение 2> ;

 

Пример:

n: longint = 2000000000;

EulerGamma: double = 0.5772156649015329;

pi_half: double = pi / 2.0; pi_quarter: double = pi_half / 2.0;

 

Замечание. В Turbo Pascal 7.0 «типизированная константа» на деле константой не является: в тексте программы эту «константу» можно изменять. «Типизированная константа» – это, в действительности, инициализированная переменная.

Замечание. Типизированная константа не может участвовать в константном выражении.

Замечание. В Delphi типизированные константы, в отличие от констант без типа, могут принимать значения массивов, записей, процедур, указателей.

Если действует ключ компиляции {$J-} (явно или по умолчанию), значения, принятые типизированными константами при объявлении, не могут быть изменены. Напротив, ключ {$J+} дает типизированным константам возможность изменяться по ходу исполнения программы.

 

 

Замечание. В языке «C++» инициализированные переменные объявляются так:

 

<Тип 1>

<Имя 1> = <Константное выражение 1>,

<Имя 2> = <Константное выражение 2>,

<Имя N> = <Константное выражение N>;

 

<Тип 2>

<Имя N+1> = <Константное выражение N+1>,

 

Примеры.

 

int I = 2, J = –5, K = 888;

double x = 1.0, y = –2.2, z = 0.123;

charc = ‘Q’;

Цикл с постусловием

 

repeat<Операторы> until <Л.В.>

 

<Операторы> являются телом цикла.

Тело цикла выполняется по меньшей мере один раз, а затем, возможно, многократно, пока < Л.В.> есть ложь.

Если < Л.В.> есть истина при первой же оценке, то тело цикла выполняется один раз.

Если < Л.В.> есть ложь при каждой оценке, то тело цикла выполняется неограниченно много раз.

 

В случае, если тело цикла содержит несколько операторов, нет необходимости использовать операторные скобки. Слово repeatзаменяет собой begin, тогда как слово untilзаменяет собой end.

 

 


Замечание. В языке «C++» родственная конструкция имеет вид:

 

do<Оператор> while (<Л.В.>)

 

«Полностью» аналогичная конструкция имеет вид:

 

do<Оператор> while (!<Л.В.>)

 

Знак логической инверсии «!» необходим, если истинность <Л.В.> должна приводить к прекращению цикла.


Замечание по теме «циклы»

 

Инструкция breakприменяется для досрочного прекращения цикла. Равноценна оператору “goto Metka1”, для которого “Metka1:” расположена сразу после оператора цикла.

 

Инструкция continueприменяется для досрочного перехода на очередную проверку условия продолжения цикла.

Равноценна оператору “goto Metka2”, для которого “Metka2:” расположена сразу после последнего из операторов, составляющих тело цикла.

 

 

Инструкции breakиcontinueв Паскале заимствованы из языка «C++».


Процедуры

 

 

<Объявление процедуры> :: =

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

<Разделы объявления локальных типов, констант, переменных>

<Разделы объявления локальных процедур и функций>

begin } Раздел исполнения (тело) процедуры
<Операторы>
end;

 

<Список формальных параметров> :: =

<Элемент списка 1>; <Элемент списка 2>; . . .

 


<Элемент списка> :: =

<Список имён параметров-значений>: <Тип>

или

var <Список имён параметров-переменных>: <Тип>

или

const <Список имён параметров-констант>: <Тип>

 

<Обращение к процедуре> :: =

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

 

Замечание. Фактические параметры должны быть совместимы с формальными по типам.

 


Параметр-значение сам процедуре не передаётся. Передаётся лишь его «численная» (или иная, согласно типу параметра) копия, под которую выделяется дополнительное место в оперативной памяти. Это важно иметь в виду, особенно, если параметр занимает много места в памяти.

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

По окончании работы процедуры эта переменная становится недоступной. Новое значение, приданное ей в теле процедуры, недоступно в том месте, из которого процедура вызвана.

 

Параметр-переменная именно сам передаётся процедуре. Изменения, произошедшие с таким параметром, сохраняются и по окончании работы процедуры.

 

Параметр-константа также сам передаётся процедуре. Изменения такого параметра в теле процедуры запрещены.

 


Пример.

 

program Example2;

MyInt = integer ;

I : MyInt ;

J: integer;

procedure P2(var M: integer);

end;

 

P2(J) ; // Нормально

P2(I) ; // Ошибка. Несоответствие типов

Пример.

 

program Example3;

I, J, K : integer;

procedure P3(L : integer; var M : integer; const N : integer);

Inc(L) ; // Бесполезно

Inc(M) ; // Полезно

(* Inc(N) ; *) // Ошибка

end;

 

I := 1; J := 1; K := 1;

P3(I, J, K) ;

wri teln(‘I=’, I) ; // I = 1, переменная не изменилась

wri teln(‘J=’, J) ; // J = 2, переменная изменилась


Замечание. В языке «C++» процедур нет. Роль процедур исполняют функции, возвращающие значение void (пусто).

<Объявление функции void> :: =

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

{ } Раздел исполнения (тело) функции
<Операторы>
}

 

 

<Список формальных параметров> :: =

<Элемент списка 1>; <Элемент списка 2>; . . .

 

<Элемент списка> :: =

<Тип> <Имя параметра-значения>

или

const <Тип> <Имя параметра-значения>

Пример.

 

#include <vcl.h>

#include <stdio.h>

#include <conio.h>

#pragma hdrstop

int

I, J, K, Q;

 

void P3(int L; int *M; const int N; const int *P)

{

L++ ; // Бесполезно

*M++ ; // Полезно

// N++ ; // Ошибка

// *P++ ; // Ошибка

// P++ ; // Ошибка

}

 

int main(int argc, char* argv[])

{

I = 1; J = 1; K = 1; Q = 1;

P3(I, &J, K, &Q) ;

printf(“I=%d”, I) ; // I = 1, переменная не изменилась

printf (“J=%d”, J) ; // J = 2, переменная изменилась

{

 


 

 

<Объявление функции> :: =

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

<Тип возвращаемого значения>;

<Разделы объявления локальных типов, констант, переменных>

<Разделы объявления локальных процедур и функций>

begin } Раздел исполнения функции
<Операторы>
end;

Среди <Операторов> должен быть хотя бы один «Оператор» вида

<Имя функции> := <Выражение> ;

или

result := <Выражение> ;

 


Пример.

 

program Example4;