Функции
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;