Хелпикс

Главная

Контакты

Случайная статья





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)}

Во всех других случаях значение выражения становится присоединенным к идентификатору в левой части в состоянии выполнения после выполнения оператора.

Когда оператор присваивания присваивает один идентификатор массива другому идентификатору, его значением становится отношение, представляющее значение массива в целом.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.