|
|||
Design Part 1.4.. Синтаксис и семантика для массивов.Design Part 1.4. PROCEDURE Encode(VAR S: Str); {Выводит символы из Code, соответствующие символам из S} VAR Index: 1 .. Len; BEGIN {Encode} FOR Index := 1 TO Len DO IF S[Index] IN [‘A’ .. ‘Z’] THEN WRITE(Code[S[Index]]) ELSE WRITE(S[Index]); WRITELN END; {Encode} Ниже приведен финальный текст программы и примеры ввода/вывода.
PROGRAM Encryption(INPUT, OUTPUT); {Переводит символы из INPUT в код согласно Chiper и печатает новые символы в OUTPUT} CONST Len = 20; TYPE Str = ARRAY [1 .. Len] OF ‘A’ .. ‘Z’; Chiper = ARRAY [‘A’ .. ‘Z’] OF CHAR; VAR Msg: Str; Code: Chiper; {Включить PROCEDURE Encode(VAR S: Str);} {Включить PROCEDURE Initialize(VAR Code: Chiper);} BEGIN {Encryption} {Инициализировать Code} Initialize(Code); WHILE NOT EOF DO BEGIN {читать строку в Msg и распечатать ее} I := 0; WHILE NOT EOLN AND (I < Len) DO BEGIN I := I + 1; READ(Msg[I]); WRITE(Msg[I]) END; READLN; WRITELN; {дополнить Msg пробелами} FOR I := I+1 TO Len DO BEGIN Msg[I] := ' '; END {распечатать кодированное сообщение} Encode(Msg) END END. {Encryption}
Выполнение: INPUT: NOW IS THE TIME END OUTPUT: NOW IS THE TIME M2T IH *SV *INV END VM#
19.1.1. Синтаксис и семантика для массивов.
Следующие синтаксические правила описывают тип данных массив.
<составной тип> ::= <неупакованный структурированный тип> <неупакованный структурированный тип> ::= SET OF <базовый тип> | FILE OF <тип компонентов> | RECORD <список полей> END | ARRAY [<список индексного типа>] OF <тип компонентов> <список индексного типа> ::= <список индексного типа>, порядковый тип | <порядковый тип>
Поскольку значения массивов могут использоваться как другие переменные, определение <переменной> должно быть расширено, чтобы включить их.
<переменная> ::= <идентификатор переменной> | <переменная буфера> | <переменная-компонент> <переменная-компонент> ::= <описатель поля> | <индексированная переменная> <индексированная переменная> ::= <переменная массива> [<список выражений>] <переменная массива> ::= <переменная> <список выражений> ::= <список выражений>, <выражение> | <выражение>
Формально, значения соответствующие переменным массивов в состоянии выполнения являются отношениями. В парах отношения массив-значения первые элементы принадлежат конечному множеству значений индексного типа, а вторые элементы множеству значений типа компонентов. Таким образом, количество возможных значений переменой массива велико. Каждый индекс может находится в паре с любым из возможных значений компонента, так что для N индексов и M возможных значений компонентов, массив может иметь MN значений, каждое из которых представляет из себя соответствие значений индексам. Например, переменная: VAR Carray: ARRAY [1..3] OF CHAR; имеет 1283 ~ 2 100 000 возможных значений для Паскаль-машины со 128 символьными значениями, одним из которых будет {<1, X>, <2, B>, <3, 3>}. Это значение может быть результатом присваивания: CArray[1] := ‘X’; CArray[2] := ‘B’; CArray[3] := ‘3’; Раз каждый индекс в массиве имеет присвоенный ему компонент, значение массива должно быть функцией. Однако, до тех пор пока индекс остается несвязанным, эта часть массива подобна неинициализированной переменной. Например, если к CArray были применены только первое и третье присваивания, его значение будет: {<1, X>, <3, 3>}È{ <2, c>: c - символ}, которое мы обычно сокращаем до {<1, X>, <3, 3> <2, ?> }. Эти значения могут появляться в состоянии выполнения с идентификатором массива. S = {CArray·{<1, X>, <3, 3> <2, ?> }, ...} Значение <индексированной переменной> может быть получено может быть получено из значения соответствующего массива. Например для приведенного выше состояния S: CArray[1](S) = X В общем, для идентификатора массива A и индекса I, где I принадлежит типу J: A[I] = {<s, v>: s(I) является значением типа J, v = (s(A))(s(I))} Определение присваивания (раздел 6.2.1) применимо к массивам без изменений, но не покрывает случай, где элемент массива находится в левой части присваивания. В этом случае присваивание завершается с ошибкой, если значение индекс не является допустимым значением соответствующего типа. Формально, для индекса I типа J: A[I] := E = {<s, t>: I(s) является значением типа J, t =s, за исключением того, что A[I](t)=E(s)} Во всех других случаях значение выражения становится присоединенным к идентификатору в левой части в состоянии выполнения после выполнения оператора. Когда оператор присваивания присваивает один идентификатор массива другому идентификатору, его значением становится отношение, представляющее значение массива в целом.
|
|||
|