Примеры
array А, В, С )7:N, 2:М], S [-2:10]
integer array А[if С<0 then 2 else 1:20]
real array Q[—7: — 1]
Семантика
В описании массивов определяется, что один или несколько идентификаторов представляют многомерные массивы переменных с индексами, и задается размерность эти?; массивов, границы индексов и типы переменных.
Границы индексов. Границы индексов любого массива задаются в первых индексных скобках, следующих за идентификатором данного массива, в виде списка граничных пар. Каждый член этого списка задает нижнюю и верхнюю границы индекса в виде двух арифметических выражений, разделенных ограничителем. Список граничных па]) задает границы всех индексов в порядке их перечисления слева направо.
Размерности. Размерности определяются как число членов в списках граничных пар.
Типы. Все массивы, данные в одном описании, имеют один и тот же заданный для них тип. Если описатель типа отсутствует, то подразумевается тип real.
Выражения для нижних и верхних границ
Значения этих выражений вычисляются аналогично значениям индексных выражений (см. п. 3.1.4.2).
Эти выражения могут зависеть только от переменных и процедур, не локальных в том блоке, для которого имеет силу данное описание массивов. Из этого следует, что в самом внешнем блоке программы могут быть описаны массивы только с постоянными границами.
Массив определен только в том случае, когда значения всех верхних границ индексов не меньше значений соответствующих нижних границ.
Значения выражений для границ вычисляются один раз при каждом входе в блок.
Идентичность переменных с индексами
Идентичность переменных с индексами не связана с границами индексов, задаваемыми в описании массивов. Однако значения соответствующих переменных с индексами в любой момент времени определены только для той части этих переменных, у которых индексы находятся в пределах границ индексов, вычисленных в последний раз.
Внешние массивы
Массивы, идентификаторы которых являются внешними идентификаторами (идентификаторами, начинающимися с букв ЕХ), могут быть размещены транслятором во внешней памяти. Внешний идентификатор массива, так же как и переменная с индексами, имеющая внешний идентификатор в качестве идентификатора массива, может употребляться только как фактический параметр. Доступ к элементам внешних массивов возможен только через оператор процедуры COPY (см. п. 6.2).
О и и с а н и я пере к л ю ч а т е л е й
Синтаксис
<переключательный список> :: = < метка > | <переключительный список>, <метка>
<описание переключателя> :: = switch Идентификатор перек- лючателя> : : = Переключательный список>.
Пример
switch Q: =Р1, W
Семантика
Описание переключателя задает значения, соответствующие идентификатору переключателя. Эти значения задаются как метки, входящие в переключательный список, с каждой из которых сопоставляется целое положительное число 1,2,. . . , получаемое пересчетом элементов списка слева направо. Значение указателя переключателя, соответствующее заданному значению индексного выражения (см. п. 3.5), есть метка в переключательном списке, имеющая заданное значение своим порядковым номером.
Влияние областей действия
Если указатель переключателя встречается вне области действия метки в переключательном списке и вычисление указателя переключателя выбирает эту метку, то возможная коллизия между идентификатором, использованным для обозначения этой метки, и идентификатором, описание которого действует на месте указателя переключателя, устраняется подходящим изменением этого последнего идентификатора.
Описания процедур
Синтаксис
<формальный параметр> :: = <идентификатор>
<список формальных параметров> :: = <формальный параметр^ <список формальных параметров^ <ограничитель параметра> <формальный параметр>
<совокупность формальных параметров> :: = <пусто> | (<список формальных параметров>)
<список .идентификаторов> :: = <идептификатор>/ «^список идентификаторов>, <идентификатор>
<список значений> :: = value <список идентификаторов>;| <пусто>
<спецификация> : : = string |<тип> ( array ) <тип> array| label | switch (procedure ( <тип> procedure
<совокупность спецификаций> : : = <пусто> | <специфика- ция> < список идентификаторов > < совокупность спецификаций > <спецификация> <список идентификаторов>;
<заголовок процедуры> :: = Идентификатор процедуры> <совокупность формальных параметров>; <список значе- пий> <совокупность спецификаций>
<тело процедуры> ;; = <оператор>| LIBRARY (<строка>)
<описание процедуры> : : = ргосес!иге<заголовок процедуры> <тело процедуры^/ <тип>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]);
= 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 скалярного произведения.
Семантика
Описание процедуры служит для задания процедуры, связанной с идентификатором процедуры. Главной составной частью описания процедуры является оператор или LIBRARY (<строка>), называемые телом процедуры, к которому может быть произведено обращение посредством указателей функций и (или) операторов процедуры из других мест блока, в начале которого находится описание данной процедуры. С телом процедуры связан заголовок, который указывает, что некоторые идентификаторы, встречающиеся в теле процедуры, представляют формальные параметры. В момент обращения к процедуре (см. пп. 3.2 и 4.7) формальным параметрам в теле процедуры будут присвоены значения фактических параметров, или же они будут заменены фактическими параметрами. Если идентификатор формального параметра заново локализован внутри тела процедуры (как это указано в п. 4.1.3), то ему придается тем самым локальный смысл и фактические параметры, которые соответствуют такому формальному параметру, недоступны во всей области действия этого внутреннего локального идентификатора.
Идентификаторы, нелокальные в теле процедуры, могут быть локальными в блоке, в начале которого находится описание данной процедуры. Ни один идентификатор не может встречаться более одного раза в списке формальных параметров. Идентификатор LIBRARY, если ему не придано другого смысла, употребляется для указания того, что тело процедуры является кодом. В этом случае строка является названием кода (то есть библиотечной программы). Результат обращения к этой процедуре определяется фактическими параметрами и библиотечной подпрограммой, название которой помещено в строке. Тело процедуры всегда действует подобно блоку (см. п. 4.1.3). Следовательно, область действия метки, помечающей оператор внутри тела или само тело, никогда не может распространяться за тело процедуры.
Значения указателей функций
Для того, чтобы описание процедуры определяло значение указателя функции, необходимо, чтобы внутри тела процедуры встречался один или несколько явных операторов присваивания с идентификатором этой процедуры в левой части. По крайней мере один из них должен выполняться, и тип идентификатора процедуры должен быть указан включением описателя типа в качестве самого первого символа описания процедуры. Последнее значение, присвоенное таким образом, используется для дальнейшего вычисления выражения, в котором встречаете?! указатель функции. Указатели функций в программе должны быть такими, чтобы все возможные использования этих указателей функций в форме операторов процедуры были бы эквивалентны пустым операторам.
Спецификации
В заголовок процедуры включается совокупность спецификаций, задающая с помощью очевидных обозначений информацию о классах и типах формальных параметров. В эту часть ни один формальный параметр нельзя вносить более одного раза. Каждый формальный параметр должен быть специфицирован.
СТАНДАРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
В каждой программе иа языке АЛГАМС подразумеваются описанными некоторые стандартные процедуры и функции, перечисленные ниже. Естественно, что обращения к ним возможны только внутри тех блоков, где их идентификаторы не определены в другом смысле.
Списки стандартных процедур и функций в дальнейшем могут быть расширены.
Стандартные функции
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.
Процедура обмена
Синтаксис
<оператор обменах:: =COPY (<неременная с шідсксамиХ,
<идснтификатор массивах) j COPY (<идентификатор массивах, Снеременная с ипдексамиХ)
Примовы
COPY 1ЕХА ГI-L 1,0], А !)
COPY (В, EXT [К])
Семантика
Процедура COPY служит для обмена между внутренними и внешними массивами. Элементы массивов считаются упорядоченными лексикографически по индексам. Переменная с индексами всегда принадлежит внешнему массиву и задает начальный адрес обмена во внешней памяти. Идентификатор массива всегда внутренний. Первый элемент этого массива задает начальный адрес обмена во внутренней памяти. Количество передаваемых элементов динамически определяется описанием внутреннего массива. Передача данных идет от первого фактического параметра ко второму. Типы внешнего и внутреннего массивов должны совпадать.
Процедуры вывода
Синтаксис
Соператор вывода> :: = Соператор вывода чисел> j <оператор вывода логических значений> Соператор вывода текста>|
<оператор размещения>
Соператор вывода чисел>: : =OUTPUT (<канал>, Счисло- вой формат>, Ссписок объектов вывода>) / OUTPUT (<ка- нал>, Спеременная с иадексами>, Ссписок объектов вы- вода>)
Соператор вывода логических значений> :: =OUTPUT (Ска- нал>, Слогический формат>, Ссписок объектов вывода>)| OUTPUT (Сканал>, Спеременная с индексами>, Ссписок объектов вывода>)
Ссписок объектов вывода> : : = Собъект вывода>/ Ссписок объектов вывода>, Собъект вывода>
Собъект вывода> :: = Свыражение> / С идентификатор массива >
Соператор вывода текста >::= OUTPUT (Сканал>, ‘Т’,
Ссписок текстовых объектов вывода>)| OUTPUT (Сканал>, Спеременная с индексами>, Ссписок текстовых объектов вывода >)
Ссписок текстовых объектов вывода> = Стекстовый объект вывода> I Ссписок текстовых объектов вывода>,Стекстовый объект вывода>
Стекстовый объект вывода> : : = Сстрока> I Спеременная с индексами>
Соператор размещения>:: =OUTPUT (Сканал>, Сформат размещения>)I OUTPUT (Сканал>,Сформат размеще- пия>,Сарифметическое выражен.ие>) | OUTPUT (Сканал>, Спеременная с ипдексами>)| OUTPUT (Сканал>, Спеременная с индексами>, С арифметическое выражение>)
Сканал> : : = Сарифметическое выражение>.
Семантика операторов вывода
Операторы вывода задают вывод числовых, логических пли текстовых данных через канал, номер которого определяется первым фактическим параметром. Второй фактический параметр определяет формат вывода (см. пп. 6.3.3—6.3.6), а все следующие — объекты вывода. Исключение представляет собой оператор размещения (см. п. 6.3.6), который не имеет объектов вывода. Если второй фактический параметр есть переменная с индексами, то она указывает на элемент массива, начиная с которого располагаются целыё числа, соответствующие последовательным символам формата в смысле процедуры TEXT (см. п. 6.6).