1. Примеры

array А, В, С )7:N, 2:М], S [-2:10]

integer array А[if С<0 then 2 else 1:20]

real array Q[—7: — 1]

  1. Семантика

В описании массивов определяется, что один или несколько идентификаторов представляют многомерные массивы переменных с индексами, и задается размерность эти?; массивов, границы индек­сов и типы переменных.

    1. Границы индексов. Границы индексов любого массива задаются в первых индексных скобках, следующих за иден­тификатором данного массива, в виде списка граничных пар. Каж­дый член этого списка задает нижнюю и верхнюю границы индекса в виде двух арифметических выражений, разделенных ограничи­телем. Список граничных па]) задает границы всех индексов в по­рядке их перечисления слева направо.

    2. Размерности. Размерности определяются как число членов в списках граничных пар.

    3. Типы. Все массивы, данные в одном описании, имеют один и тот же заданный для них тип. Если описатель типа отсутст­вует, то подразумевается тип real.

  1. Выражения для нижних и верхних границ

    1. Значения этих выражений вычисляются аналогично зна­чениям индексных выражений (см. п. 3.1.4.2).

    2. Эти выражения могут зависеть только от переменных и процедур, не локальных в том блоке, для которого имеет силу дан­ное описание массивов. Из этого следует, что в самом внешнем бло­ке программы могут быть описаны массивы только с постоянными границами.

    3. Массив определен только в том случае, когда значения всех верхних границ индексов не меньше значений соответствую­щих нижних границ.

    4. Значения выражений для границ вычисляются один раз при каждом входе в блок.

  2. Идентичность переменных с индексами

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

  1. Внешние массивы

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

  1. О и и с а н и я пере к л ю ч а т е л е й

    1. Синтаксис

<переключательный список> :: = < метка > | <переключитель­ный список>, <метка>

<описание переключателя> :: = switch Идентификатор перек- лючателя> : : = Переключательный список>.

  1. Пример

switch Q: =Р1, W

  1. Семантика

Описание переключателя задает значения, соответствующие идентификатору переключателя. Эти значения задаются как метки, входящие в переключательный список, с каждой из которых сопос­тавляется целое положительное число 1,2,. . . , получаемое пере­счетом элементов списка слева направо. Значение указателя пере­ключателя, соответствующее заданному значению индексного вы­ражения (см. п. 3.5), есть метка в переключательном списке, имею­щая заданное значение своим порядковым номером.

  1. Влияние областей действия

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

  1. Описания процедур

    1. Синтаксис

<формальный параметр> :: = <идентификатор>

<список формальных параметров> :: = <формальный пара­метр^ <список формальных параметров^ <ограничитель параметра> <формальный параметр>

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

<список .идентификаторов> :: = <идептификатор>/ «^список идентификаторов>, <идентификатор>

<список значений> :: = value <список идентификаторов>;| <пусто>

<спецификация> : : = string |<тип> ( array ) <тип> array| label | switch (procedure ( <тип> procedure

<совокупность спецификаций> : : = <пусто> | <специфика- ция> < список идентификаторов > < совокупность специфи­каций > <спецификация> <список идентификаторов>;

<заголовок процедуры> :: = Идентификатор процедуры> <совокупность формальных параметров>; <список значе- пий> <совокупность спецификаций>

<тело процедуры> ;; = <оператор>| LIBRARY (<строка>)

  1. <описание процедуры> : : = ргосес!иге<заголовок процедуры> <тело процедуры^/ <тип>procedure <заголовок процеду­ры Хтело процедуры>Примеры

procedure след (А) порядок: (N) результат: (S); value N;

array A; integer N; real S;

begin integer K;

S: =0;

for К: = 1 step 1 until N do S: = S + A [ К, K]

end

procedure транспонирование (А) порядок: (N); value N;

array A; integer N;

begin real W; integer I, K;

for I: = 1 step 1 until N do

for K: = 1 +1 step 1 until N do

begin W:=A[I, KJ;

A[I, K]:=A[K, I];

A[K, I]:=W end

end транспонирования

integer procedure шаг (U); real U;

uiar:=if 0<UAU<l then 1 else 0

procedure абсмакс (А) размер: (N, M) результат: (Y) индексы: (I, K);

commeni наибольшая из абсолютных величин элементов матри­цы А размером N на М передается в Y, а индексы этого элемента передаются в I и К;

array A; integer N, М, I, К; real Y;

begin integer Р, Q;

Y: =0;

for P: = 1 step 1 until N do for Q: = 1 step 1 until M do

if ABS (A[P, Q])>Y then begin Y: =ABS (A[P, Q]);

  1. = P; K: = Q end end абсмакс

procedure скалярное произведение (А, В )порядок: (К, Р)

результат: (Y); value К;

integer К, Р; real Y, А, В;

begin real S; S : =0;

for P: = 1 step 1 until К do S:=S + AXB;

Y:=S

end скалярного произведения.

  1. Семантика

Описание процедуры служит для задания процедуры, связанной с идентификатором процедуры. Главной составной частью описа­ния процедуры является оператор или LIBRARY (<строка>), на­зываемые телом процедуры, к которому может быть произведено обращение посредством указателей функций и (или) операторов процедуры из других мест блока, в начале которого находится опи­сание данной процедуры. С телом процедуры связан заголовок, ко­торый указывает, что некоторые идентификаторы, встречающиеся в теле процедуры, представляют формальные параметры. В момент обращения к процедуре (см. пп. 3.2 и 4.7) формальным параметрам в теле процедуры будут присвоены значения фактических парамет­ров, или же они будут заменены фактическими параметрами. Если идентификатор формального параметра заново локализован внут­ри тела процедуры (как это указано в п. 4.1.3), то ему придается тем самым локальный смысл и фактические параметры, которые соответствуют такому формальному параметру, недоступны во всей области действия этого внутреннего локального идентификатора.

Идентификаторы, нелокальные в теле процедуры, могут быть ло­кальными в блоке, в начале которого находится описание данной процедуры. Ни один идентификатор не может встречаться более одного раза в списке формальных параметров. Идентификатор LIBRARY, если ему не придано другого смысла, употребляется для указания того, что тело процедуры является кодом. В этом случае строка является названием кода (то есть библиотечной програм­мы). Результат обращения к этой процедуре определяется факти­ческими параметрами и библиотечной подпрограммой, название которой помещено в строке. Тело процедуры всегда действует по­добно блоку (см. п. 4.1.3). Следовательно, область действия метки, помечающей оператор внутри тела или само тело, никогда не мо­жет распространяться за тело процедуры.

  1. Значения указателей функций

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

  1. Спецификации

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

  1. СТАНДАРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

В каждой программе иа языке АЛГАМС подразумеваются опи­санными некоторые стандартные процедуры и функции, перечис­ленные ниже. Естественно, что обращения к ним возможны только внутри тех блоков, где их идентификаторы не определены в другом смысле.

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

  1. Стандартные функции

ABS(E) для модуля (абсолютной величины) значения выра­жения Е

SIGN(E) для знака значения Е(-|-1 для Е>0, 0 для Е = 0, — 1 для Е<0)

SQRT(E) для квадратного корня из значения Е

LN(E) для натурального логарифма значения Е

ЕХР(Е) для экспоненциальной функции значения Е (е,;)

SIN(E) для синуса значения Е

COS(E) для косинуса значения Е

TAN(E) для тангенса значения Е

ARCSIN(E) для главного значения арксинуса значения Е

ARCCOS(E) для главного значения арккосинуса значения Е ARCTAN(E) для главного значения арктангенса значения Е ARC(E1, Е2) для полярного угла точки с координатами El, Е2;

значение берется из интервала 0 • ARC<2jt

ENTIER(E) для целой части значения Е

DIV(E1, Е2) для SIGN((El) (Е2)) XENTIER (ABS ((Е1)/ (Е2)))

RES(E1, Е2) для (Е1) —DIV(E 1, Е2) X (Е2)

MAX (El, Е2, . . . , EN) для наибольшего из значений выраже­ний Е1, F2. . . . , EN

M1N(E1, Е2, . . . , EN) для наименьшего из значений выражений El, Е2, . . . , EN.

Функции D1V п RES определены для аргументов типа integer и принимают значения типа integer. Остальные функции определе­ны как для аргументов типа real, -іак и для аргументов типа integer, и принимают значения типа real, кроме функций SIG.N и ENT1ER, которые принимают значения типа integer.

  1. Процедура обмена

    1. Синтаксис

<оператор обменах:: =COPY (<неременная с шідсксамиХ,

<идснтификатор массивах) j COPY (<идентификатор масси­вах, Снеременная с ипдексамиХ)

Примовы

COPY 1ЕХА ГI-L 1,0], А !)

COPY (В, EXT [К])

  1. Семантика

Процедура COPY служит для обмена между внутренними и внешними массивами. Элементы массивов считаются упорядочен­ными лексикографически по индексам. Переменная с индексами всегда принадлежит внешнему массиву и задает начальный адрес обмена во внешней памяти. Идентификатор массива всегда внут­ренний. Первый элемент этого массива задает начальный адрес об­мена во внутренней памяти. Количество передаваемых элементов динамически определяется описанием внутреннего массива. Пере­дача данных идет от первого фактического параметра ко второму. Типы внешнего и внутреннего массивов должны совпадать.

  1. Процедуры вывода

    1. Синтаксис

Соператор вывода> :: = Соператор вывода чисел> j <оператор вывода логических значений> Соператор вывода текста>|

<оператор размещения>

Соператор вывода чисел>: : =OUTPUT (<канал>, Счисло- вой формат>, Ссписок объектов вывода>) / OUTPUT (<ка- нал>, Спеременная с иадексами>, Ссписок объектов вы- вода>)

Соператор вывода логических значений> :: =OUTPUT (Ска- нал>, Слогический формат>, Ссписок объектов вывода>)| OUTPUT (Сканал>, Спеременная с индексами>, Ссписок объектов вывода>)

Ссписок объектов вывода> : : = Собъект вывода>/ Ссписок объектов вывода>, Собъект вывода>

Собъект вывода> :: = Свыражение> / С идентификатор масси­ва >

Соператор вывода текста >::= OUTPUT (Сканал>, ‘Т’,

Ссписок текстовых объектов вывода>)| OUTPUT (Сканал>, Спеременная с индексами>, Ссписок текстовых объектов вывода >)

Ссписок текстовых объектов вывода> = Стекстовый объект вывода> I Ссписок текстовых объектов вывода>,Стекстовый объект вывода>

Стекстовый объект вывода> : : = Сстрока> I Спеременная с индексами>

Соператор размещения>:: =OUTPUT (Сканал>, Сформат размещения>)I OUTPUT (Сканал>,Сформат размеще- пия>,Сарифметическое выражен.ие>) | OUTPUT (Сканал>, Спеременная с ипдексами>)| OUTPUT (Сканал>, Спере­менная с индексами>, С арифметическое выражение>)

Сканал> : : = Сарифметическое выражение>.

  1. Семантика операторов вывода

Операторы вывода задают вывод числовых, логических пли тек­стовых данных через канал, номер которого определяется первым фактическим параметром. Второй фактический параметр опреде­ляет формат вывода (см. пп. 6.3.3—6.3.6), а все следующие — объ­екты вывода. Исключение представляет собой оператор размеще­ния (см. п. 6.3.6), который не имеет объектов вывода. Если второй фактический параметр есть переменная с индексами, то она указы­вает на элемент массива, начиная с которого располагаются целыё числа, соответствующие последовательным символам формата в смысле процедуры TEXT (см. п. 6.6).